2

マルチスレッドプログラムでMPI_Isend/MPI_Recv の問題が発生しました。

プログラムでは:

最初のマシンでは、1 つのスレッドが何らかの計算を行い、バッファを 2 番目のマシンに送信するための呼び出しMPI_Isendを行い、別のスレッドが常にMPI_Recv2 番目のマシンからデータを取得しようとしています。そして、最初のスレッドは、再度呼び出す前にMPI_Wait最後に完了します。MPI_IsendMPI_Isend

2 台目のマシンもまったく同じことを行います。

次に、次の結果が得られました。

最初のマシン:

スレッド0 : MPI_Isend2 番目のマシンへのデータが正常に送信されました。MPI_Waitしかし、最後MPI_Isendが完了しなかったためにブロックされました。

スレッド1 : MPI_Recv2 番目のマシンからデータを取得しようとしましたが、データがなく、ブロックされました。

2台目

スレッド0 :MPI_Isend最初のマシンへのデータが正常に送信されました。MPI_Waitしかし、最後MPI_Isendが完了しなかったためにブロックされました。

スレッド1 :MPI_Recv最初のマシンからデータを取得しようとしましたが、データがなく、ブロックされました。

誰にもアイデアはありますか?2 日間問題を追跡しましたが、進展がなかったので、とても感謝しています。

4

1 に答える 1

2

MPI呼び出しを同時に実行できるようにするには、レベルでスレッドをサポートするMPIライブラリを初期化する必要がありますMPI_THREAD_MULTIPLE。これを行うには、への呼び出しを次のように置き換える必要がありますMPI_Init

int provided;

MPI_Init_thread(&argc, &argv, MPI_THREAD_MULTIPLE, &provided);
if (provided != MPI_THREAD_MULTIPLE)
{
    printf("Sorry, this MPI implementation does not support multiple threads\n");
    MPI_Abort(MPI_COMM_WORLD, 1);
}

一部のMPIライブラリは、複数のスレッドからの呼び出しをサポートするために、特定の(デフォルトではない)方法でコンパイルする必要があります。たとえば、OpenMPIはライブラリのビルド時に設定する必要があります。他のベンダーは、ライブラリの2つのバージョンを提供しています。1つはスレッドをサポートし、もう1つはスレッドをサポートしていないため、コードをリンクするときに正しいバージョンを選択する必要があります。これは、スレッドのサポートを追加すると、多くのMPI呼び出しの待ち時間が長くなり、プログラムがスレッドを使用しない場合は誰もそれを望まないためです。

于 2012-12-05T11:32:38.707 に答える