2

MPI_Isend および MPI_Recv プログラムがあります。2 つのプロセッサがあり、両方ともこのようなものであるとします。

  1. MPI_Isend
  2. MPI_Recv
  3. MPI_待機

これから私が期待するのは、ブロックせずに両方のプロセッサでデータを送信することです。あとはデータが来るのを待ちます。その後、このように再開します。

  1. 0 が 1 に送信
  2. 1 が 0 に送信
  3. 0 は 1 から受け取る
  4. 1 は 0 から受け取る

しかし、私が得るのはこれです。

  1. 0 が 1 に送信
  2. 0 は 1 から受信します (ただし、1 は送信しませんでした!)
  3. 1 は 0 に送信します (今は送信します)
  4. 1 は 0 から受け取る

MPI_Recv はデータが来るまで待つべきだと思いました。何が原因でしょうか?

4

2 に答える 2

1

MPI_Recvブロックします。

標準出力がバッファリングされ、すべての出力が一度に表示されないため、メッセージが正しい順序で表示されないだけです。

于 2013-05-19T21:36:50.293 に答える
0

一種のバッファリングされていない出力を得るためにできることは、出力を実行して interleaved でフラッシュすることMPI_Barrierです。プロセスがPあり、現在のプロセスのランクが変数に格納されrank、 communicator を使用している場合、次のcommことができます。

for (int p = 0; p < P; ++p)
{
    // Only one process writes at this time
    // std::endl flushes the buffer
    if (p == rank)
        std::cout << "Message from process " << rank << std::endl;

    // Block the other processes until the one that is writing
    // flushes the buffer
    MPI_Barrier(comm);
}

もちろん、これは単なる C++ の例です。Fortran の C に翻訳する必要があるかもしれません。また、このコードは、出力が実際に期待どおりになることを 100% の確率で保証するものではありませんが、十分な可能性があることに注意してください。

とにかく、原則として、2 つの出力操作の間に常にバリアを追加し、バッファをフラッシュします。

于 2013-05-20T02:10:32.357 に答える