5

私にはいくつかのプロセス(100から1000のオーダー)があり、それぞれが他のプロセスのいくつか(たとえば約10)にデータを送信する必要があります。(通常、常にではありませんが、AがBに送信する場合、BはAにも送信します。)すべてのプロセスは、どのプロセスから受信する必要があるデータの量を知っています。

したがってMPI_Alltoallv、メッセージの長さの多くまたはほとんどをゼロにして、を使用することができます。ただし、パフォーマンス上の理由から、グローバルよりも複数通信を使用する方がよいと聞きました。私が理解していないこと:一連の送信および受信呼び出しが1つのAlltoallv呼び出しよりも効率的である場合、なぜAlltoallvは一連の送信および受信として実装されないのですか?MPI_sendMPI_recvMPI_Alltoallv

私(および他の人?)にとって、グローバルコールを1つだけ使用する方がはるかに便利です。また、いくつかのSendとRecvでデッドロック状態に陥らないようにする必要があるかもしれません(奇数偶数戦略またはより複雑な方法で修正可能ですか?またはバッファリングされたsend / recvを使用して修正可能ですか?)。

たとえば、10および;よりも遅くMPI_Alltoallv必要であることに同意しますか。はいの場合、その理由と金額は?MPI_SendMPI_Recv

4

1 に答える 1

7

通常、コレクティブのデフォルトのアドバイスは逆です。独自のコーディングを行う代わりに、可能な場合はコレクティブ操作を使用してください。MPIライブラリが通信パターンについてより多くの情報を持っているほど、内部で最適化する必要がある機会が増えます。

特別なハードウェアサポートが利用可能でない限り、集合呼び出しは実際には送信と受信の観点から内部的に実装されます。しかし、実際の通信パターンは、おそらく一連の送信と受信だけではありません。たとえば、ツリーを使用してデータをブロードキャストすると、同じランクで多数の受信者にデータを送信するよりも高速になります。集合的なコミュニケーションの最適化には多くの作業が必要であり、それを改善することは困難です。

そうは言っても、MPI_Alltoallv多少違います。MPIレベルですべての不規則な通信シナリオを最適化するのは難しい場合があるため、一部のカスタム通信コードの方がうまくいくと考えられます。たとえば、の実装はMPI_Alltoallv同期している可能性があります。長さ0のメッセージを送信する必要がある場合でも、すべてのプロセスが「チェックイン」する必要がある場合があります。私はそのような実装はありそうもないと思いますが、ここに実際の実装があります。

したがって、本当の答えは「状況によって異なります」です。のライブラリ実装がMPI_Alltoallvタスクに合わない場合は、カスタム通信コードが優先されます。しかし、その道を進む前に、MPI-3ネイバーコレクティブが問題に適しているかどうかを確認してください。

于 2012-11-22T05:43:58.807 に答える