2016-12-28 4 views
0

この投稿は前の投稿binding threads to certain MPI processesに関連しています。ここでは、MPIランクに異なる 個のOpenMPスレッドを割り当てる方法を尋ねられました。MPMD MPI実行における通信

$ mpiexec <global parameters> 
      -n n1 <local parameters> executable_1 <args1> : 
      -n n2 <local parameters> executable_2 <args2> : 
      ... 
      -n nk <local parameters> executable_k <argsk> 

を次のように一つの可能​​性は、私にはわからないものです独立したインスタンスexecutable_1、executable_2、...、executable_kが互いに通信する方法です。実行中のある時点でデータを交換する必要がある場合、 インターコミュニケータ(インスタンス間)とイントラコミュニケータ (同じインスタンス内ではexecutable_1など)を使用していますか?

ありがとうございました。

答えて

2

このコマンドの結果として起動されるすべてのプロセスは、単一のMIMD/MPMD MPIジョブを形成します。つまり、それらは同じワールドコミュニケータを共有します。最初n1ランクは以下n2ランクは単にMPI_COMM_WORLDにメッセージを送信することによって等

    rank     | executable 
----------------------------------------+--------------- 
        0 .. n1-1    | executable_1 
       n1 .. n1+n2-1   | executable_2 
       n1+n2 .. n1+n2+n3-1  | executable_3 
        ....     |  .... 
n1+n2+n3+..+n(k-1) .. n1+n2+n3+..+nk-1 | executable_k 

通信が発生し、executable_2を実行している、executable_1を実行しています。独立した実行可能ファイルは、自動的にコミュニケータグループを形成しません。これは、MPI_Comm_spawnを使用してMPMDを開始する子ジョブと区別します。子ジョブは独自のワールド・コミュニケータを持ち、インターコミュニケータを使用してMIDM/MPMDジョブ内の別々のサブ・ジョブは通信しません。

MPI_APPNUMの属性を照会することによって、ランク付けするアプリケーションのコンテキストを見つけることができます。MPI_COMM_WORLD。単に色としてappnum値を使用して分割を行うことにより、(異なるコンテキストが:によって分離されたコマンドである)各コンテキストの別々のサブコミュニケータを作成することができる:

int *appnum, present; 

MPI_Comm_get_attr(MPI_COMM_WORLD, MPI_APPNUM, &appnum, &present); 
if (!present) 
{ 
    printf("MPI_APPNUM is not provided!\n"); 
    MPI_Abort(MPI_COMM_WORLD, 0); 
} 

MPI_Comm appcomm; 
MPI_Comm_split(MPI_COMM_WORLD, *appnum, 0, &appcomm); 
関連する問題