2017-04-26 6 views
1

私は、各マシンに3つのVMとMPICHとBoostを持つBeowulfクラスタをセットアップしました。 私のプログラムは私のクラスター上で正常に動作していますが、boost :: splitを使用しようとすると、実行ブロックが無期限にブロックされます。スプリットコールでMPIブロックをブーストする

は、次のコードを取る:クラスタ上で実行

#include <boost/mpi.hpp> 
#include <iostream> 

namespace mpi = boost::mpi; 

int main (int argc , char* argv[]) 
{ 
    mpi::environment env(argc,argv); 
    mpi::communicator world; 

    int group_id = world.rank()%3; 

    mpi::communicator local = world.split(group_id); 

    std::cout << "I am process " << world.rank() << " of " << world.size() << "." << std::endl; 

    std::cout << "I am sub-process " << local.rank() << " of " << local.size() << "." << std::endl; 



    return 0; 
} 

は、何も起こりません。 しかし、私は唯一の単一ノード上でそれを実行(および-np 9で言わせて)あれば、それだけで正常に動作します:3の上に意図したとおりに

I am process 5 of 9. 
I am process 2 of 9. 
I am process 3 of 9. 
I am process 1 of 9. 
I am process 6 of 9. 
I am process 7 of 9. 
I am process 0 of 9. 
I am process 4 of 9. 
I am sub-process 2 of 3. 
I am sub-process 0 of 3. 
I am sub-process 1 of 3. 
I am sub-process 2 of 3. 
I am sub-process 1 of 3. 
I am sub-process 1 of 3. 
I am sub-process 0 of 3. 
I am process 8 of 9. 
I am sub-process 2 of 3. 
I am sub-process 0 of 3. 

はブースト::スプリットコールを削除するには、例を実行することができますしたがって、splitへの呼び出しは明らかにここでは有罪です。

私がboost :: splitで間違っていることは何ですか?

答えて

1

最終的に問題が見つかりました:mpirunは間違ったインターフェイスを使用して通信しようとしていました。 mpirunを実行しているときに適切なインターフェイスを指定すると、すべてうまく行きます!ここ

はmpirunのに与えるパラメータである。

--mca btl_tcp_if_include [your_network_interface]

関連する問題