11

研究関連の質問が少しあります。

現在、MPIに基づく(特にopenmpi 6.3を使用した)構造スケルトンフレーム作業の実装を終了しました。フレームワークは単一のマシンで使用されることになっています。今、私はそれを他の以前のスケルトン実装(ス​​カンジウムファストフローなど)と比較しています。

私が気づいたことの1つは、私の実装のパフォーマンスが他の実装ほど良くないということです。これは、私の実装がMPI(つまり、送信操作と受信操作の一致を必要とする両面通信)に基づいているのに対し、比較している他の実装は共有メモリに基づいているためだと思います。(...しかし、それを推論するための良い説明はまだありません、そしてそれは私の質問の一部です)

2つのカテゴリーの完了時間には大きな違いがあります。

今日は、ここで共有メモリのopen-mpiの構成についても紹介します=> openmpi-sm

そして、私の質問が来ます。

まず、共有メモリ用にMPIを構成するとはどういう意味ですか?つまり、MPIプロセスは独自の仮想メモリに存在します。次のコマンドのフラグは実際にはどのようなものですか?(MPIでは、すべての通信は明示的にメッセージを渡すことによるものであり、プロセス間でメモリは共有されないと思いました)。

    shell$ mpirun --mca btl self,sm,tcp -np 16 ./a.out

2つ目は、共有メモリ用に開発された他のスケルトン実装と比較して、MPIのパフォーマンスが非常に悪いのはなぜですか?少なくとも、1台のマルチコアマシンでも実行しています。(他の実装がスレッド並列プログラミングを使用したためだと思いますが、説得力のある説明はありません)。

どんな提案やさらなる議論も大歓迎です。

質問をさらに明確にする必要がある場合は、お知らせください。

お時間をいただきありがとうございます!

4

1 に答える 1

14

Open MPI は非常にモジュール化されています。Modular Component Architecture (MCA) と呼ばれる独自のコンポーネント モデルがあります。これが--mcaパラメーターの名前の由来です。これは、MCA のさまざまなコンポーネントによってエクスポートされたランタイム値を MCA パラメーターに提供するために使用されます。

特定のコミュニケーター内の 2 つのプロセスが相互に通信する場合、MCA は適切なコンポーネントを見つけて、一方のプロセスから他方のプロセスにメッセージを送信できます。両方のプロセスが同じノードに存在する場合、Open MPI は通常、 として知られる共有メモリ BTL コンポーネントを選択しsmます。両方のプロセスが異なるノードに存在する場合、Open MPI は利用可能なネットワーク インターフェイスを調べて、他のノードに接続できる最速のものを選択します。(BTL コンポーネントを介して) InfiniBand のような高速ネットワークにいくつかの優先順位を設定しopenibますが、クラスターに InfiniBand がない場合、tcpBTL コンポーネントが許可された BTL のリストにある場合は、TCP/IP がフォールバックとして使用されます。

デフォルトでは、共有メモリ通信を有効にするために特別なことをする必要はありません。でプログラムを起動するだけmpiexec -np 16 ./a.outです。あなたがリンクしているのは Open MPI FAQ の共有メモリ部分で、smパフォーマンスを向上させるために BTL のどのパラメータを調整できるかについてのヒントを提供します。Open MPI での私の経験では、マルチレベル NUMA システムのような特殊なハードウェアでも、既定のパラメーターがほぼ最適であり、非常にうまく機能することがわかりました。デフォルトの共有メモリ通信の実装では、データが 2 回コピーされることに注意してください。1 回は送信バッファから共有メモリに、もう 1 回は共有メモリから受信バッファにコピーされます。KNEMの形で近道が存在するカーネル デバイスに含まれていますが、標準の Linux カーネルの一部ではないため、ダウンロードして個別にコンパイルする必要があります。KNEM サポートにより、Open MPI は同じノード上のプロセス間で「ゼロコピー」転送を実行できます。コピーはカーネル デバイスによって行われ、最初のプロセスのメモリから 2 番目のプロセスのメモリへの直接コピーです。処理する。これにより、同じノードに存在するプロセス間の大きなメッセージの転送が大幅に改善されます。

もう 1 つのオプションは、MPI を完全に忘れて、共有メモリを直接使用することです。POSIX メモリ管理インターフェイス (こちらを参照) を使用して、すべてのプロセスが直接操作する共有メモリ ブロックを作成できます。データが共有メモリに格納されている場合は、コピーが作成されないため、利点があります。ただし、最新のマルチソケット システムでは NUMA の問題に注意してください。各ソケットには独自のメモリ コントローラーがあり、同じボード上のリモート ソケットからのメモリへのアクセスは遅くなります。プロセスのピニング/バインディングも重要です。各 MPI プロセスを個別の CPU コアにピニングするには、に--bind-to-socket渡します。mpiexec

于 2012-11-21T22:24:29.510 に答える