gombeのブログ

マイコンの電子工作系PIC32/KiCad/C/C++/3D/

Intel CPUのスレッド並列のスケーラビリティがAMD CPUより悪い件について

なぜかIntelのCPUのスレッド並列でのスケーリングが悪いんですよね。なぜなのかわかる人いたら教えてほしいです。

  • OpenMPでのスレッド並列
  • イテレーション一回当たり160[us]程度の処理
  • それぞれのメモリアクセスはほぼ独立で、コンフリクトもしない。
  • IntelのCPUだとものすごくスケールできないが、AMDだとすごくきれいにスケールする。最適化をかけても同じ。
  • gcc 8.3.1&OpenMP
  • 全てCentOS 8

比較マシンのCPUはこんな感じです。 * AMD Ryzen 3900(12C) * AMD EPYC 7352 (24C) x2 socket * Intel Xeon Gold 6238 (22C) x2 socket

で、結果です。IntelマシンとAMD Ryzenのマシンの比較ですが、EPYCでもきれいにスケールします。

f:id:electgombe:20210103160116p:plain
パフォーマンス、高いほど良い

は?

いやいや、おかしいでしょ、裏で何か動いているのかと思いきや何も動いてないし、Intelは全然スケールしないし。 AMD EPYCのほうも似たような結果になりました。なぜかIntelだとスケールしないです。メモリ帯域は、Ryzenでも飽和しなかったので、Intelだともっと余裕があるはずだし、チップ内部のトポロジーの問題なのでしょうか??

スレッド並列が不得意だとしても、さすがにこの結果はひどいと思いました。 ちなみに、EPYCでは20C並列を2つ動かしても性能低下は特にみられませんでした。(おそらくメモリアクセスはそこまで頻繁ではなさそう) Intelのほうでも、1Cのみのプロセスを2つ動かした際、性能低下はなかったのでおそらくOpenMPのスレッド並列がうまくいってないと思われます。 同じような不具合の方いたら教えてもらえればと思います。

2021/01/07補足

intelコンパイラでやっても、Intelマシンで性能が出ませんでした。AMDが爆速でしたね。

また、スレッド並列化はだめですが、同じプログラムを繰り返したり、問題のサイズを大きくするとまぁまぁうまくスケールするみたいです。が、AMDと同じくらいのサイズでスケールしてもらいたいものです。

ちなみに、AMDではintelコンパイラのほうが若干遅いみたいです。(~10%程度)