0

現在、スーパーコンピュータやマルチコアプロセッサの効率的なプログラミングのコースに参加しています。私たちの最近の課題は、MPI_Send コマンドのレイテンシーを測定することです (したがって、0 バイトのメッセージの送信に費やされた時間)。これだけではそれほど難しいことではありませんが、次の基準で測定を実行する必要があります。

  • 同じプロセッサ内のプロセスの通信、
  • 同じノードだが異なるプロセッサ、
  • および異なるノード上のプロセス用。

私は疑問に思っています:どうすればこれを判断できますか?さまざまなノード上のプロセスについて、プロセスが現在実行されているノードの識別子を返す MPI_Get_processor_name によって返された名前をハッシュし、それをタグとして送信することを考えました。また、sched_cpu() を使用してコア ID を取得しようとしましたが、コアがハイパースレッド化されている場合でも、増分番号が返されるようです (したがって、プロセスは同じコアで実行されます)。どうすればいいですか?地域を特定するための概念が必要なだけです。記載されている問題の完全なコードではありません。ありがとうございました!

4

1 に答える 1

2

両方の MPI プロセスを同じソケットの別々のコアに配置するには、次のオプションを に渡す必要がありますmpiexec

-genv I_MPI_PIN=1 -genv I_MPI_PIN_DOMAIN=core -genv I_MPI_PIN_ORDER=compact

異なるソケットのコアで両方の MPI プロセスを使用するには、次を使用する必要があります。

-genv I_MPI_PIN=1 -genv I_MPI_PIN_DOMAIN=core -genv I_MPI_PIN_ORDER=scatter

それらを 2 つの別々のマシンに配置するには、ノードごとに 1 つのスロットのみを提供するホスト ファイルを作成するか、次を使用する必要があります。

-perhost 1 -genv I_MPI_PIN=1 -genv I_MPI_PIN_DOMAIN=core

sched_getcpuaffinity()返されたアフィニティ マスクを呼び出して調べることで、Linux での実際の固定/バインドを確認できます。別の方法として、 orを解析/proc/self/statusして探すこともできます。Windows では、アクティブなアフィニティ マスクを返します。Cpus_allowedCpus_allowed_listGetProcessAffinityMask()

4 に設定して最終的なピン留めを報告するように Intel MPI に指示することもできますがI_MPI_DEBUG、ピン留め情報以外にも多くの出力が生成されます。次のような行を探します。

[0] MPI startup(): 0       1234     node100  {0}
[0] MPI startup(): 1       1235     node100  {1}
于 2015-05-24T19:18:46.763 に答える