更新日: 17/03/03

メモリ設定と並列計算について

 

メモリ設定の目安

分子サイズや基底関数が大きくなると、メモリの割り当ても大きくする必要があります。例えば、原子数が 50 以上もしくは基底関数が 500 以上、または、原子数が 50 以上かつ基底関数が 500 以上の場合における推奨値は、4GB 以上となります

計算に必要なメモリを見積もる手段として、freqmem があります。freqmem により、基底状態の振動計算における最適な値、励起状態の振動計算における妥当な値、基底状態や励起状態の構造最適化計算における十分な量を見積もることが可能です

ここでのメモリは、1 プロセッサあたりの見積もりです。共有メモリ並列計算時には、並列数に応じてメモリを増やす必要があります。詳細は、メモリ設定における注意事項 をご参照ください。

 

共有メモリ並列計算 (SMP 並列計算)

メモリ設定における注意事項

効率的な並列計算のためには、並列数 (指定したプロセッサ数) に応じ、メモリの割り当てを大きくする必要があります。例えば、1プロセッサあたりに 4GB のメモリの割り当てを必要とする計算において、効率的な 8 CPU 並列計算を実現するためには、メモリ設定を 32GB とする必要があります。もちろん、特定のハードウェアに課されるメモリ制限がより小さい場合もあるでしょう。しかし、CPU 数に比例した大きさのメモリを割り当てることが望ましいです。特に、メモリの割り当てはそのままでCPU 数のみを増やした場合には、プロセッサ数が多くなるにつれ、良いパフォーマンスには繋がらないでしょう。

大きな分子の振動計算、CCSD およびEOM-CCSD エネルギー計算における注意事項

大きな分子の振動計算、CCSD および EOM-CCSD エネルギー計算時には、計算に割り当てるメモリとは別に、大きなディスクファイルをバッファリングするための十分なメモリ領域を確保しておくことが理想的です。そのため、Gaussian ジョブへのメモリ割り当ては、システムの全メモリ容量の50-70% までとするべきです。例えば、全メモリ容量が 128GB であるマシンにて、全 CPU を利用した Gaussian 並列計算を実行する場合、一般的には 64-80GB を割り当て、OS がディスクキャッシュとして利用するためのメモリを残しておくべきです。

CPU へのスレッド割り当て (G16 以降)

ある CPU から別の CPU にスレッドが移動すると効率が悪くなってしまい、キャッシュの無効化や他のオーバーヘッドが生じてしまいます。大部分のマシンにおいて、Gaussian は特定の CPU とスレッドを紐づけることが可能であり、多くのプロセッサを利用する場合には、強く推奨します。

Link 0 の %CPU 行に、利用する CPU 数を指定します。8 コアのチップをひとつ搭載したマシンの場合、%NProc=8 よりも %CPU=0-7 と指定するべきです。なぜならば、%CPU=0-7 と指定することにより、最初のスレッドは CPU 0 に、次のスレッドは CPU 1 にと紐づけることが出来るからです。

古い Intel プロセッサ (Nehalem およびそれ以前) では、チップ上の全 CPU をビジー状態に保つための十分なメモリバンド幅がありません。そのため、利用するCPU 数を半分とし、各 CPU に全CPU を利用したときの 2 倍のメモリを割り当てたほうが望ましいケースが多いでしょう。

例えば、12 コアのチップを 4 つ (1 番目のチップには 0-11 の CPU、2 番目のチップには 12-23 の CPU のように搭載。全 48 プロセッサ) と、128GB のメモリを搭載したマシンについて述べ ます。各チップ上の 6 つの CPU を利用した 24 並列計算とし、各 CPU に 3GB のメモリ (72 GB / 24 プロセッサ) を割り当てる方が、各 CPU に 1.5GB のメモリを割り当てた 48 並列計算よりも、効率的な並列計算が可能となります。このような設定を行うためには、以下のようにキーワードを指定します:

%Mem=72GB
%CPU=0-47/2

%CPU にある /2 は、ひとつおきのコアを利用することを意味しています。つまり、0, 2, 4, 6, 8,10 のコア (チップ0 に存在) 、12, 14, 16, 18, 20, 22 のコア (チップ1 に存在) のように利用します。

最新の Intel プロセッサ (Haswell およびそれ以降) ではメモリバンド幅が改良され、各チップ上にある全コアを利用した並列計算でも、効率的に実行することが可能です。

十分なメモリ利用が可能であり、全スレッドが特定のコアに紐づけられている場合、大きな分子の並列計算は、64 並列もしくはそれ以上においても効率的に実行可能です。

ハイパースレッディングの無効化

物理的に同じ CPU において、メモリバンド幅などのリソースを各スレッドに効率的に分割するためのハイパースレッディングは、Gaussian ジョブでは有用ではありません。もし、ハイパースレッディングを無効化できない場合には、各物理 CPU 上のひとつのハイパースレッドのみを、Gaussian ジョブに割り当てるようにするべきです。

Linux では、異なるプロセッサ上のハイパースレッドが一緒にグループ化されます。例えば、8 コアのチップ 2 つを搭載し、3 ウェイ・ハイパースレッディングのマシン環境では、CPU 番号 0-7 の8 つのスレッドはチップ0 に、CPU 番号 8-15 の 8 つのスレッドはチップ 1 に、CPU 番号 16-23 の 8 つのスレッドはチップ 0 にある第 2 のハイパースレッドに、のようになります。そのため、このようなマシン環境では、%CPU=0‑15 と設定したジョブが最適です。

AIX では、ハイパースレッド利用数を少なくしても、各 CPU に対して最大 8 つのハイパースレッドを一緒にグループ化します。例えば、8 コアのチップ 2 つを搭載し、4 ウェイ・ハイパースレッディングのマシン環境では、CPU 番号 0-3 の 4 つのスレッドはチップ0 のコア0 に、CPU 番号 8-11 の 4 つのスレッドはチップ 0 のコア 1 に、のようになります。そのため、このようなマシン環境では、%CPU=0‑127/8 のように設定し、CPU 番号 0, 8, 16, ...を選択したジョブが最適です。

 

クラスタおよび複数マシンでの並列計算 (Linda 並列)

有効性

Hartree-Fock と DFT によるエネルギーや勾配および振動計算、MP2 によるエネルギーおよび勾配計算において、クラスター間の並列計算が可能です。MP2 振動計算、CCSD と EOM-CCSD によるエネルギーおよび構造最適化計算は、共有メモリ並列計算 (SMP 並列計算) は可能ですが、クラスター間の並列計算には対応していません。DFT の非調和振動計算や CCSD 振動計算などの数値微分は、各ノードにて完全な勾配計算もしくは 2 次微分計算を実行し、クラスター上の各 worker に微分の方向を分配することにより、クラスターのノード間で並列化されています。

共有メモリ並列計算との併用

共有メモリ並列計算とクラスター並列計算は、併用可能です。一般的には、クラスターの各ノード上の全 CPU を利用した共有メモリ並列計算を実行します。%CPU および %Mem の設定は、クラスターの各ノードに適用されることに注意してください。例えば、apple / banana / cherry の名前からなる 3 ノード、各ノードには 8 コアのチップ 2 つを搭載したマシン環境においては、以下のように指定します:

%Mem=64GB
%CPU=0-15
%LindaWorkers=apple,banana,cherry
# B3LYP/6-311+G(2d,p) Freq …

この指定では、3 つのノードの各々にて CPU を 0-15 に固定した 16 スレッドの並列計算を実行し、合計 48 スレッドの各々に 4GB のメモリ量を割り当てています。

ただし、Freq=AnharmCCSD Freq などの特別な数値微分においては、結果を収集するための worker をひとつ追加する必要があります。そのため、これらのジョブでは、マスターノード (Gaussian16 を開始するノード) 上に 2 つの worker を設定する必要があります。上述のマシン環境にて非調和振動計算を実行するジョブには、以下のように設定します:

%Mem=64GB
%CPU=0-15
%LindaWorkers=apple:2,banana,cherry
# B3LYP/6-311+G(2d,p) Freq=Anharm …

apple ノードで Gaussian16 を開始しているものとしています。この指定により、apple ノード では 2 つの worker を起動し、ひとつは結果を集めるためだけに利用され、残りのひとつおよび banana と cherry の worker を利用して、計算が実行されます。

Linda 並列を実行するためには、別途 TCP Linda が必要です。