クラスターに MPI システムを実装する必要があります。ここに MPI (MPICH/OpenMPI) の経験がある場合は、どちらが優れているか、x86_64 ボックスのクラスターでパフォーマンスを向上させる方法を知りたいです。
4 に答える
MPICH はずっと前から存在しています。非常に移植性が高く、何年にもわたる価値のあるヒントやコツをオンラインで見つけることができます。これは安全な賭けであり、おそらくより多くの MPI プログラムと互換性があります。
OpenMPI の方が新しいです。移植性はそれほど高くありませんが、最も一般的なプラットフォームを非常によくサポートしています。ほとんどの人は、いくつかの点で、特にフォールト トレランスに関してははるかに優れていると考えているようですが、これを利用するには、MPI 標準の一部ではない特別な機能を使用する必要がある場合があります。
パフォーマンスに関しては、アプリケーションに大きく依存します。一般的なアドバイスをするのは難しいです。実行する計算の種類、ノードの数、およびハードウェアの種類 (使用しているネットワーク ハードウェアの種類を含む) について、具体的な質問を投稿する必要があります。
私は Windows と Linux の両方のクラスター用にかなりの数の並列アプリケーションを作成してきましたが、現時点では MPICH2 がおそらくより安全な選択であるとアドバイスできます。他のレスポンダーが言及しているように、これは非常に成熟したライブラリです。また、( MPI_Bcastを介して) 十分なブロードキャストがサポートされており、実際、MPICH2 にはscatter-and-gatherなどの非常に優れた機能が多数あります。
ただし、OpenMPI はある程度の支持を得ています。Penguin コンピューティング (彼らは大きなクラスター ベンダーであり、Linux が好きです) は実際に、特定の状況で OpenMPI が MPICH2 を打ち負かす、非常に強力なベンチマークをいくつか持っています。
「パフォーマンスの向上」に関するあなたのコメントに関して、私ができる最善のアドバイスは、I/O バウンドの場合は絶対に必要以上のデータを送信しないこと、CPU バウンドの場合は必要以上の作業を行わないことです。私は何度も間違ったコードを最適化するという罠に陥りました :) 私の足跡をたどらないことを願っています!
MPI フォーラムをチェックしてください。MPI ルーチンに関する有益な情報がたくさんあります。Beowulfサイトには、興味深い質問への回答がたくさんあります。
「より良い」を定義するのは難しいです...「より速い」は、コードとハードウェアでベンチマークすることで答えることができます。集合的およびオフロードの最適化などは、正確なハードウェアに依存し、ドライバー スタックのバージョンに関してもかなり変動します。Google は、動作する組み合わせを見つけることができるはずです。
最適化作業に関しては、コードやハードウェアに多少依存します。
コード I/O はストレージにバインドされていますか? その場合、NFS よりも優れた調査が大いに役立つ可能性があります。または単純な並列 I/O ではなく MPI I/O を使用することもできます。
ネットワークにバインドされている場合は、通信の局所性と通信/計算のオーバーラップを調べると役立ちます。さまざまな MPI 実装のほとんどには、ノード内通信用のネットワークではなくローカル共有メモリを使用するためのチューニング オプションがあり、一部のコードではネットワーク負荷を大幅に削減できます。
I/O と MPI トラフィックの分離は、一部のクラスター、特にギガビット イーサネット クラスターで大きな違いを生む可能性があります。
mpichを使用したのは、それが最も利用可能で文書化されているように思われたからです。代替案のテストにはあまり力を入れていませんでした。MPICHには、Windowsに展開するための適切なツールがあります。
私たちが抱えていた主なパフォーマンスの問題は、すべてのノードに同じベースデータを送信する必要があり、MPICHがブロードキャストをサポートしていない(またはサポートしていない)ことでした。したがって、初期データのデプロイはO(n)でした。