moku-moku

AkaiKKRの練習

はじめに

AkaiKKRは、KKRグリーン関数法による電子状態計算プログラムです。 コヒーレントポテンシャル近似 (CPA) と組み合わせて、不規則合金の計算に良く用いられます。

インストール

コンパイル方法は、こちらで詳しく説明されています。 開発者の赤井先生が在籍なさっている組織が発出している、信頼できる情報です。

スレッド並列の調整

説明通りに作業すると、スレッド並列に対応した実行形式ファイルが生成されます。 けれども実行時に、スレッド並列数を指定する方法がわかりません (コンパイル時にスレッド並列を無効にすることはできます)。

スレッド並列化された多くのプログラムでは、実行時に環境変数OMP_NUM_THREADSにスレッド数を指定して、並列数を調整します。 AkaiKKRではこの方法が使えません (過去のバージョンでは使えたそうです)。

私が使っているMacBook Pro (13-inch, M1, 2020)は、高性能4コア+高効率4コアの計8コアを搭載しています。 並列数を調整しなければ、AkaiKKRは8スレッド並列で実行します。 高性能と高効率なコアが混在しても、スレッド並列に悪影響がないのかわかりません。 また、全コアを利用した計算の最中は、その他作業の実行性能が低下することを不自由に感じます (多くの計算は、これが気にならない程度の短時間で終わります。またシミュレーション専用の計算機では無関係です)。

AkaiKKRでは、スレッド並列数の決定(コア数の取得)には、次のコマンド実行結果が用いられています。

getconf _NPROCESSORS_ONLN

上記MacBook Proでの実行結果は8でした。 このコマンドは、ハイパースレッディング付きのCPUでは、(パイパースレッディング分を含む)論理コアの数を返します。 (シミュレーション専用に設定されたPCでは、ハイパースレッディングが無効化されている場合があります; その場合のコマンド出力は物理コア数に一致します。) ハイパースレッディングは、シミュレーションの並列計算には効果的でない場合が多いです。 スレッド並列数を(物理コア以下に)調整した実行をお勧めします。

そこで、スレッド並列数を調整できるように改変します。 OpenMPの設定はsetomp.fで行われています。 二箇所の

call omp_set_num_threads(nthread)

がスレッド数の(再)設定です。 これらを無効化(コメントアウト)してから再コンパイルします。

実行時に、環境変数OMP_NUM_THREADSを指定してください。

export OMP_NUM_THREADS=4
./specx < in

一行目のexportコマンドは一度実行すると、その後実行する計算のスレッド数に影響を及ぼします。 ログインし直した場合、新たなターミナルを起動した場合などは、再度実行してください。

頻繁にスレッド数を変更する場合は、以下の実行コマンドが便利です。

env OMP_NUM_THREADS=4 ./specx < in

スレッド数無指定の場合は、全コア利用したスレッド並列で実行します(変更前と同じ)。

なお、計算実行時の(標準)出力末尾のスレッド数表示は変更していません。

 Machine: arm64
 numcor: 8
 elapsed time         3.45 sec (  8 threads)

実行に用いたスレッド数に関係なく、従来通り利用可能な全コア数分のスレッドで並列実行したかのように出力されます。