量子化学計算プログラムのGAMESSのWindows版で並列計算をする際の負荷について検証します。
2倍のコアを使ってる疑惑
rungms benzene.inp 2023.R1.intel 2 benzene.out
これは並列数を2で指定したときの実行コマンドです。
これで計算を実行したときの標準出力が
=========================================================================
Job Properties
Input Filename : benzene.inp
GAMESS Version : gamess.2023.R1.intel.exe
Compute Processes Requested : 2
Nodes Required : 1
=========================================================================
Compute Processが2です。ここまではいいですね。
一番下には
Microsoft MPI (MS-MPI) will be running GAMESS on 1 node(s).
The binary will be kicked off by 'mpiexec' is gamess.2023.R1.intel.exe
MS-MPI will run 2 compute process(es) and 2 data server(s).
2 compute process(es) and 2 data server(s) ???
計算結果のoutファイルは
----------------------------------------
CPU timing information for all processes
========================================
0: 3.703125 + 0.453125 = 4.156250
1: 3.937500 + 0.421875 = 4.359375
2: 1.281250 + 3.125000 = 4.406250
3: 1.125000 + 3.234375 = 4.359375
----------------------------------------
ということで、並列数2を指定したところ4プロセスが動いていたようです。
なお、タスクマネージャを見ても4プロセスが動いていました。
どういうこと?
GAMESSはcompute processとdata serverの2種類のプロセスが同数動くようになっています。
その名の通り、計算を担当するプロセスとデータ通信を担当するプロセスです。
このようにすることで、通信が計算に与える影響を抑えているらしいです。
6コア12スレッドのCPUだといくつが最適?
ノートPCですが6コア12スレッドのCPUを載せていますので、これで時間を計ってみます。
指定した並列数と、outファイルの一番下の部分の関係ありそうな部分を抜き出しました。
#並列数 = 1
TOTAL WALL CLOCK TIME= 7.4 SECONDS, CPU UTILIZATION IS 96.45%
----------------------------------------
CPU timing information for all processes
========================================
0: 6.890625 + 0.265625 = 7.156250
1: 2.265625 + 5.000000 = 7.265625
----------------------------------------
#並列数 = 2
TOTAL WALL CLOCK TIME= 4.6 SECONDS, CPU UTILIZATION IS 90.61%
----------------------------------------
CPU timing information for all processes
========================================
0: 3.703125 + 0.453125 = 4.156250
1: 3.937500 + 0.421875 = 4.359375
2: 1.281250 + 3.125000 = 4.406250
3: 1.125000 + 3.234375 = 4.359375
----------------------------------------
#並列数 = 3
TOTAL WALL CLOCK TIME= 3.6 SECONDS, CPU UTILIZATION IS 78.10%
#並列数 = 4
TOTAL WALL CLOCK TIME= 4.7 SECONDS, CPU UTILIZATION IS 96.79%
#並列数 = 6
TOTAL WALL CLOCK TIME= 4.4 SECONDS, CPU UTILIZATION IS 77.33%
#並列数 = 12
TOTAL WALL CLOCK TIME= 7.4 SECONDS, CPU UTILIZATION IS 31.78%
というわけで最速は並列数3でした。(奇数???)
OSが認識している論理プロセッサ数と同数である並列数12はかなり遅くなりました。24プロセスが走るので当然ですね。
また6コアCPUに合わせて並列数6を指定した場合も微妙でした。
3並列では6プロセスが稼働しますが、CPUが6コア12スレッドなので実コアと同数の6プロセスが速いのは納得です。
また2並列(4プロセス)のCPU timing information for all processes
を見ると、
0: 3.703125 + 0.453125 = 4.156250
1: 3.937500 + 0.421875 = 4.359375
2: 1.281250 + 3.125000 = 4.406250
3: 1.125000 + 3.234375 = 4.359375
のように、各コアの計算処理の時間とデータ通信処理の時間の足し算になっています。
#0と#1のコアは計算処理をメインで担当して、#2と#3のコアはデータ通信をメインで担当していたようです。
このようにプロセスが2グループに分かれるのは全ての並列数に共通しています。
まとめ
GAMESSのWindows版は、CPUの実コア数の半分を指定しましょう。奇数でも構いません。
コメント