2016-08-03 10 views
-1

メモリ帯域幅(ストリームベンチマーク)PER NODEを測定する方法がどういうことかと思います。私が持っている、一つのノードのみで、それを測定し、このプログラムは、プロセスやスレッドの数は、以下のように取られるでしょう:ソースコードを使用してノードごとにMPIベンチマークを測定する方法は?

MPI_Comm_size(MPI_COMM_WORLD, &numranks); 
MPI_Comm_rank(MPI_COMM_WORLD, &myrank); 
omp_set_dynamic(0);  
omp_set_num_threads(4); 
#pragma omp parallel 
{ 
} 

それは実際にMPIとOpenMPののミックスです。ノードを指定して各ノードの測定を行う方法はありますか? (私は4つのノードがあると仮定します)ソースコードを使用してそれをやりたいのですが、slurm-batchスクリプトではありません。 process-IDを使用して各ノードの最初のコアを指定できますが、そのたびにノード全体で測定を実行します(任意の数のコアを含む)。

何か提案がありがたいです。

+0

"ノード"の意味を明確にすることはできますか? NUMAノード(ソケットなど)?ホスト(複数のソケットがあります)? –

答えて

1

私はMPIを使用して以来、しばらくしているので、「コードを書く方法」の質問に実際には答えていません。私は物事のベンチマーク方法論にもっと重点を置いています。実際に何か役に立つものを実際に測定するように設計することを願っています。ベンチマークは難しい。番号を取得するのは簡単ですが、の数値を意味する数字を意味するの数字を得るのは難しいです。代わりにあなたが得るノード指定の


、あなただけを持ってどのノードが照会できます。 (つまり、MPIジョブの複数のプロセスが同じ物理ホスト上で終了し、メモリ帯域幅と競合するケースを検出します)。

また、各ノードで実行するスレッド数を無作為化することもできますmemcpy、memset、またはread-onlyのような縮小またはmemcmpを実行するスレッドの数でスケールします。マシンごと


1つのスレッドが多分デスクトップのCPUに類似している低コア数のCPUを除いて、最近のIntelのXeonに、メモリ帯域幅が飽和に近い来ることはありません。 (そして、コードが効率的なベクトル化されたasmにコンパイルされている場合のみ)。 L3 /メモリのレイテンシは、単一コアの限られたメモリ並列処理がスループットを飽和させるには高すぎます。 (Enhanced REP MOVSB for memcpyWhy is Skylake so much better than Broadwell-E for single-threaded memory throughput?、および「レイテンシの結合プラットフォーム」を参照してください。)

それは多くのコアXeonプロセッサのメモリ帯域幅を飽和させるために(STREAMSベンチマークのような)帯域幅ボトルネックのコードを実行している4〜8スレッドを取ることができます。非常に小さな配列でテストしてプライベートなコア単位のL2キャッシュが機能しない限り、それ以上のスレッドにはほぼ同じ合計があります。 (現代のインテルCPUでは256kB、大規模な共有ではコアあたり2MB〜L3)。アップデート:Skylake-AVX512のコアプライベートL2あたり1 MiB。

デュアルソケットノードでは、NUMAが重要な要素です。スレッドが1つのソケット上の物理メモリコントローラにマップされたメモリを使用して終了する場合、他のソケットのメモリコントローラはアイドル状態のままで、マシンの帯域幅の半分しか表示されません。これは、カーネルのNUMA対応物理メモリ割り当てが実際の作業負荷に適しているかどうかをテストする良い方法です。 (帯域幅のマイクロベンチマークが実際のワークロードのようなものであれば)

メモリ帯域幅はノード上のすべてのコアで共有されるリソースなので、繰り返し可能な結果を​​得るには他の負荷と競合しないようにします。メモリフットプリントが小さいものでも、ワーキングセットがコアごとのプライベートL2キャッシュに収まらない場合は、多くの帯域幅を使用できます。他のジョブがメモリ帯域幅を競合しないと仮定しないでください。数百メガバイト。

+0

ご返信ありがとうございます。実際には、私はまだノードを指定する方法を得ることができませんでした...私はノードにメモリ帯域幅を与える "ストリームベンチマーク"を使用しています。つまり、ノードあたり2つのノード(16スレッド/コア)を使用すると、32コアで測定したメモリ帯域幅が得られます。私は別々に各ノードのメモリ帯域幅を取得したい(node1のための1つのメモリ、node2のためのもう1つのメモリ)。どのように可能ですか?申し訳ありませんが、私は並列プログラミングでかなり新しくなっています... – Matrix

+0

@Sarah:ああ、あなたは物事を合計するすぐに使えるベンチマークを使っていたとは言いませんでした。あなたが最初から自分自身を構築していたように、あなたのコードから見ました。これは私が答えていたものです。ベンチマークのコードを修正して、それらを1つの合計に減らす前に記録する必要があるように思えます。それは非常に異なる質問です。 –

+0

もちろん、ノード間の帯域幅に興味がない場合は、別々の単一ノードジョブを実行するだけです。 –

関連する問題