並列化オプション -np と -nt の違いを説明します。
初めに
Radioss を並列演算するときに -np と -nt というオプションがありますが、本記事では、その違いを説明します。
ただし、私は、並列化プログラミングの専門家ではないですので、説明はあくまで一般的な概要となります。
-np とは
SPMD (Single Process Multi Domain) と呼ばれるものです。Radioss 計算モデルのメッシュをいくつかに分けて、それぞれ別のプロセスとして実行するものです。
プロセスが何かというのは、Windows のタスクマネージャを見ると分かりやすいです。こちらに出ているのが、Windows 上で動いているプロセスです。
なんと本記事執筆時点で 318 個も動いているようです。
Radioss で -np を付けて計算すると、このように、e_バージョン名_win64_impi.exe が -np の数だけ流れることになります。
さて、話を簡単にするために、良くこんなイメージで説明することが多いのですが、実は間違いです。
先ほど、Windows 上で 318 プロセス流れていると述べたように、別に一つのプロセスが一つのコアで動かないといけないわけではなく、実際は複数のプロセスが一つのコアで動いています。
実は Radioss の -np も、その数だけのプロセスを作っているだけで、どのコアに計算を任せるのかというのは、Intel などの SPMD プロセス通信ソフトや Windows OS が決めることです。ですので、イメージとしてはこうなります。
ですので、物理コアの数よりも多くの -np の指定も可能です。実際先ほどの e_2024.1_win64_impi.exe のスクリーンショットは、物理コア 8 コアの PC で -np 32 で流したものです。ただしやってみれば分かりますが、物理コアを超える -np の指定で、パフォーマンスが上がることは、まずないと思います。私は、「理由」は説明できません。ありがちな説明としては、CPU は一個のジョブに集中する方が、複数のジョブを切り替えて行うよりも効率が高い、というところで、おそらくそうなんだろうなと思います。興味があったら、実際のパフォーマンスを測ってみてください。
それから、HyperThreading という、物理 1 コアを仮想的に 2 コアに扱う CPU の機能も非常に危険です。何の因果か、わざわざ一つの物理コアに複数のプロセスを詰め込んでしまうことがあります。これまで私が見てきた例だと、何十倍と遅くなるケースもあるようです。HyperThreading は調子がいいと 10% くらいの性能向上があるみたいですが、一回の失敗で、それらの貯金を全て使い果たしますので、BIOS で無効にしておくことをお勧めします。
-nt とは
スレッドと呼ばれる、プログラム上の並列化技術の一つです。残念ながら私には、これ以上のことは分かりません。
Windows のタスクマネージャを見ると、プロセス数をはるかに上回るスレッド数があることが分かります。スレッドというのは、プロセス内で完結する並列化処理なのです。
こちらは -nt 8 で実行中のタスクマネージャです。Radioss のプロセスは 1 個ですが、全コアがほぼ全力を出している状態となっています。
こちらも話を簡単にするために、このようなイメージで説明することが多いですが、-np の時と同じで、正しくはありません。
実際には Windows が気を効かせて、コアへの割り振りをしています。
ここからの説明は、ほぼ -np と同じです。やはり、ただのプログラムですので、物理コアの数に関係なく、-nt の数を指定できます。ただ、これもぜひ一度は実測してみてほしいですが、物理コア数超えても、何も得られるものが無いような結果になると思います。
また、HyperThreading も全く同じで、なんらかの Windows の判断で、このような割り当てをされて、大きくパフォーマンスが落ちることがあるようです。ですので、やはり HyperThreading は無効にしておくのが良いと思います。
-np と -nt を併用する時
-np でも -nt でも、実コア数を超えないようにということを述べてきましたが、-np と -nt の時は、こうなってほしいわけですから、-np x -nt が物理コア数を超えないようにします。
まとめ
本記事のまとめです。
- HyperThreading は無効にする
- -np x -nt が物理コア数を超えないようにする
- HyperThreading は無効にする