私はMPIを使用して以来、しばらくしているので、「コードを書く方法」の質問に実際には答えていません。私は物事のベンチマーク方法論にもっと重点を置いています。実際に何か役に立つものを実際に測定するように設計することを願っています。ベンチマークは難しい。番号を取得するのは簡単ですが、の数値を意味する数字を意味するの数字を得るのは難しいです。代わりにあなたが得るノード指定の
、あなただけはを持ってどのノードが照会できます。 (つまり、MPIジョブの複数のプロセスが同じ物理ホスト上で終了し、メモリ帯域幅と競合するケースを検出します)。
また、各ノードで実行するスレッド数を無作為化することもできますmemcpy、memset、またはread-onlyのような縮小またはmemcmpを実行するスレッドの数でスケールします。マシンごと
1つのスレッドが多分デスクトップのCPUに類似している低コア数のCPUを除いて、最近のIntelのXeonに、メモリ帯域幅が飽和に近い来ることはありません。 (そして、コードが効率的なベクトル化されたasmにコンパイルされている場合のみ)。 L3 /メモリのレイテンシは、単一コアの限られたメモリ並列処理がスループットを飽和させるには高すぎます。 (Enhanced REP MOVSB for memcpyでWhy 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キャッシュに収まらない場合は、多くの帯域幅を使用できます。他のジョブがメモリ帯域幅を競合しないと仮定しないでください。数百メガバイト。
"ノード"の意味を明確にすることはできますか? NUMAノード(ソケットなど)?ホスト(複数のソケットがあります)? –