0

ダイナミクス用の Fortran プログラム (基本的には verlet アルゴ) があります。速度をより速く計算するために、アルゴリズムを MPI で並列化しました。私が緊張しているのは、4 つのプロセッサがある場合、各プロセッサが Verlet を実行し、並列化のポイントに到達すると情報を共有することです。ただし、わずかな数値の違い (たとえば、各ノードでコンパイルされた LAPACK) により、各 Verlet 軌跡は長期的には完全に異なる方向に展開する可能性があります。軌跡。したがって、発散を防ぐためにすべての時間ステップで情報を同期することにしましたが、これは明らかに障壁になります。

この問題 (ノードの発散) は通常どのように解決されますか? 参照はありますか?

4

1 に答える 1

1

各ノードで異なる LAPACK のコンパイルを行うべきではありません。シミュレーションのさまざまな部分で数値ライブラリが変更された場合、奇妙な結果が予想されますが、これは並列処理とは関係ありません。だから、それをしないでください。

このような状況で MPI がトリッキーになるのを私が実際に見た唯一の例は、MPI_REDUCE(...MPI_SUM...) のようなことを行うと、同じ数のノードに対して異なる実行で異なる結果が得られることです。別の順序で。それは、標準的な「浮動小数点演算は通用しない」ものです。関連する数値の MPI_GATHER() を実行し、最小から最大への並べ替えの後など、明確に定義された順序でそれらを合計することで、これを回避できます。

于 2011-04-29T15:43:50.077 に答える