1

2 つのタスク間の通信に MPI ノンブロッキング メッセージを使用しています。通信パターンは次のとおりです。各タスクには、他のタスクからメッセージを受信するマスター スレッドがあります。計算を行い、他のタスクにメッセージを送信する 5 つほどの作業スレッドがあります。マスター スレッドはループし、着信メッセージをテストします。これが唯一のことです。

私の問題は、タスク 0 がタスク 1 から送信されたすべてのメッセージを即座に受信する一方で (送受信されるメッセージの数はほぼ一致します)、タスク 1 はタスク 0 によって送信されたメッセージの約 1/4 しか受信しないことです。何千もの未処理のメッセージ。

PAPI を使用して、タスク 1 が test と irecv でブロックされているように見えることを確認しました。命令スループットは、他のタスクの >0.2 とは対照的に、わずか 0.03 命令/サイクルであり、デバッガーでタスクを停止すると、ロックを取得しようとしていることが示されます。ただし、ブロックしている受信とテストは、「欠落」したメッセージに対するものではなく、別のクラスの非常にまれなメッセージに対するものです。

実際にコードを試してみないと何が原因なのかはわかりませんが、MPI のパフォーマンスにこのような非対称性があることは不可解です。受信についていけないのは、試行錯誤が原因ではなく、受信メッセージのテストにすべての時間を費やしているためです。

MPI_THREAD_MULTIPLE で OpenMPI 1.5.3 を使用しており、通信は sm 経由です (2 つのタスクは同じノード上にあります)。

これを追跡する方法についてのアイデアをいただければ幸いです。

4

0 に答える 0