2016-11-20 7 views
1

と2つのMPI_Recvsの2つのバッファを使用した場合、2つの異なるバッファがあり、各バッファからそれぞれのバッファを受け取った場合は、MPI_Sendの内容をどのバッファに渡すかを指定できますか?MPIで送信するバッファを指定できますか?

if(rank == MASTER) { 
    for(kk=1; kk < size; kk++) { 
     MPI_Recv(printbuf, numcols, MPI_DOUBLE, kk, tag, MPI_COMM_WORLD, &status); 
     sum = sum + printbuf[kk-1]; 
    } 
} 
else { 
    MPI_Send(sum, local_ncols + 2, MPI_DOUBLE, MASTER, tag, MPI_COMM_WORLD); 
} 
if(rank == MASTER) { 
    for(kk=1; kk < size; kk++) { 
    MPI_Recv(secondbuf, numcols, MPI_DOUBLE, kk, tag, MPI_COMM_WORLD, &status); 
    sum2 = sum2 + secondbuf[kk-1]; 
    } 
} 
else { 
    MPI_Send(sum2, local_ncols + 2, MPI_DOUBLE, MASTER, tag, MPI_COMM_WORLD); 
} 

これはOpenMPIの場合です。各ランクはsumsum2を計算します。私はすべてのランク 'sum sとsum2の合計を取得したいと思います。より良い方法がありますか?例えば、sumsum2を送信するバッファを指定することによって、以下のコードを圧縮することはできますか?

+0

コードの改善や凝縮については、このコードを[コードレビュー](http://codereview.stackexchange.com/)のStack Exchangeに掲載します。あなたがここではなくそれを置くと、より正確で正確な回答が得られます。 – esote

+1

reduce操作の使用を避ける理由はありますか? – Angelos

+0

@非常識ありがとう、私はそれを試みる – FullMetalScientist

答えて

4

Angelosさんのコメントは正しいです:すべてのプロセスの結果を合計する場合は、MPI_Reduce(e.g., this Q/Aamongst others)です。

しかし、あなたがメッセージを送信するとき、受信プロセスが何をしているのかを制御することはできません。ただし、タグを送信するタスクの横に制御できるメタデータが1つあります。受信プロセスは、タグに基づいて受信するバッファを決定できます。

if (rank != MASTER) { 
    // worker process 
    MPI_Send(sum1, local_ncols + 2, MPI_DOUBLE, MASTER, tag1, MPI_COMM_WORLD); 
    MPI_Send(sum2, local_ncols + 2, MPI_DOUBLE, MASTER, tag2, MPI_COMM_WORLD); 
} else { 
    // master process 
    MPI_Recv(printbuf, numcols, MPI_DOUBLE, kk, tag1, MPI_COMM_WORLD, &status); 
    MPI_Recv(secondbuf, numcols, MPI_DOUBLE, kk, tag2, MPI_COMM_WORLD, &status); 
} 

他の方法もあります。 MPIのnon-overtaking guaranteeを使用すると、タスク1からタスク2までの2つのメッセージを、同じ受信で受信できる場合に送信される順序と同じ順序で受信することができます。これにより、受信プロセスは、 2番目のもの。

いくつかのコンテキストで動作するもう1つのアプローチは、同じメッセージにそれらをパックすることです(これは短いメッセージで待ち時間を短縮するのに便利です)。これは、どのデータがどのバッファに入っているのかを確認するもう1つの方法です。

+0

ありがとう、これらのアプローチは本当に役に立ちます – FullMetalScientist

+0

また、同様の質問へのあなたの答えのリンクに応じて - 関数内でreduceを行い、すべてのランクの合計(すなわちglobalsum)を返したい場合は、これはどのように可能ですか?あなたはMASTERランクからのglobalsumしか使用できないようです。 – FullMetalScientist

+0

@FullMetalScientist - すべてのランクに最終的な回答が得られるようにするには、 'MPI_Allreduce'を使います。例えば、http://mpitutorial.com/tutorials/mpi-reduce-and-allreduceを参照してください。 –

関連する問題