MPI_Allreduce()
MPI-2.2規格のセクション5.9.1に記載されている次の注意事項を実装が遵守していれば、同じ数のプロセッサを使用している限り、を使用して実装した削減を再現できます。
実装者へのアドバイス。MPI_REDUCE
関数が同じ引数に適用され、同じ順序で表示される場合は常に同じ結果が得られるように実装することを強くお勧めします。これにより、プロセッサの物理的な場所を利用する最適化が妨げられる可能性があることに注意してください。(実装者へのアドバイスの終わり。)
すべてのコストで再現性を保証する必要がある場合は、次の段落のガイドラインに従うことができます。
ユーザーへのアドバイス。一部のアプリケーションは、浮動小数点演算の非連想性を無視できない場合や、特別な縮小順序を必要とし、連想として扱うことができないユーザー定義の演算(セクション5.9.5を参照)を使用する場合があります。そのようなアプリケーションは、評価の順序を明示的に実施する必要があります。たとえば、厳密な左から右(または右から左)の評価順序を必要とする操作の場合、単一のプロセス(たとえば、MPI_GATHER
)ですべてのオペランドを収集
し、縮約操作を適用することでこれを実行できます。必要な順序で(例:with
MPI_REDUCE_LOCAL
)、必要に応じて、結果を他のプロセスにブロードキャストまたは分散します(例:with MPI_BCAST
)。(ユーザーへのアドバイスの終わり。)
物事のより広いスキームでは、ほとんどのアプリケーションの効率的なアルゴリズムは局所性を利用します。アルゴリズムは異なる数のプロセスで実行すると実際に異なるため、異なる数のプロセスで実行した場合に結果を正確に再現することは実際的ではありません。可能性のある例外は、減衰ヤコビまたは多項式(チェビシェフなど)スムーザーを使用したマルチグリッドです。この場合、この単純な方法は非常にうまく機能します。
同じ数のプロセスを使用すると、メッセージを受信した順序で処理する(たとえば、使用するMPI_Waitany()
)ことでパフォーマンスが向上することが多く、非決定性が導入されます。そのような場合、2つのバリアントを実装できます。任意の順序で受信する高速のものと、静的な順序で受信する「デバッグ」のものです。これには、この動作を提供するために、基礎となるライブラリもすべて作成する必要があります。
場合によっては、デバッグのために、この再現可能な動作を提供しない計算の一部を分離し、冗長に実行できます。コンポーネントの設計方法によっては、その変更はごくわずかなコードまたは非常に邪魔になる場合があります。