システムの紹介 各種手続き 使い方と注意事項 アプリケーション一覧 講習会情報 FAQ

Gromacs

機能概要

Gromacs は、分子動力学を実行するための汎用性のある計算パッケージです。

利用方法

利用範囲

特になし

利用キュー

すべて

実行方法

Gromacs の実行コマンドは gmx または gmx_mpi です。 コマンド実行前に、module コマンドで環境設定をしてください。

% module load gromacs/モジュール名

現在利用可能なバージョンとそれに対応したモジュール名は以下の通りです。

バージョンモジュール名
2021.22021.2
2020.42020.4

バッチスクリプトでの実行例(シングルノードでの実行)

シングルノードでの実行の場合は、通常gmxコマンド(GPUカード内で複数のGPUプロセスを生成したい場合のみgmx_mpi)を利用します。 設定が比較的わかりやすいため、特に理由がなければ、まずはシングルノードでの実行例を参考にジョブを実行するのがおすすめです。

OpenMP + MPI での実行

以下にMD計算に対するバッチスクリプトのサンプルを示します。

#!/bin/csh
#PBS -q APC
#PBS -N title
#PBS -l select=1:ncpus=8:mpiprocs=2

source /etc/profile.d/modules.csh
module load gromacs/xxx   (xxx は、上記のモジュール名を参考にしてください。)

unsetenv OMP_NUM_THREADS
cd $PBS_O_WORKDIR

gmx mdrun -nt 8 -ntmpi 2 -deffnm md

  • gmxコマンドの-nt オプションは、全スレッド数を指定します。
  • -ntmpi オプションは、MPIプロセス数を指定します。
  • この例では、全スレッド数は8、そしてMPIプロセスを2と指定しているため、1つのMPIプロセスあたり4つのOpenMPスレッドを生成することになります。
  • OpenMPスレッド数の指定は -ntomp オプションで可能です。したがって、-nt 8 -ntmpi 2-ntomp 4 -ntmpi 2 としても同じ意味になります。
  • -ntomp 4を指定する代わりに、環境変数 OMP_NUM_THREADS で OpenMPスレッド数を指定することも可能です。
  • #PBS -l での mpiprocs= は、MPIプロセス数となります。
  • #PBS -l での ncpus= は、全スレッド数となります。

OpenMP + MPI + GPU(シングルプロセス) での実行

次にGPUを使ったMD計算に対するバッチスクリプトのサンプルを示します。 なお、先ほどと異なる行のみを表示しています。

#PBS -q APG
#PBS -l select=1:ncpus=8:mpiprocs=4:ngpus=1

gmx mdrun -nt 8 -ntmpi 4 -gpu_id 0 -deffnm md
  • GPUを使用する場合、#PBS -l では ngpus=1を追加してください。
  • GPUを使用する場合、gmx コマンドでは -gpu_id 0を追加してください。

OpenMP + MPI + GPU(複数プロセス)での実行

上記の例ではGPUで実行されるプロセスは1つです。 もし、1枚のGPUカード内で複数のプロセスを実行させたい場合には、gmx_mpi コマンドを使います。

#PBS -q APG
#PBS -l select=1:ncpus=6:mpiprocs=2:ngpus=1

mpirun --hostfile $PBS_NODEFILE -np 2 gmx_mpi mdrun -ntomp 3 -gpu_id 0 -deffnm md
  • gmx_mpiを使ったMPIプロセスでの並列化では-ntmpiは利用できません。
  • mpirunコマンド行の見方は、gmx_mpi から最後までを1つのMPIプロセスとみなし、そのMPIプロセス数を -npオプションで指定する、という意味になります。
  • 上記は -np 2 の指定により2つのMPIプロセスが生成されます。そして、各MPIプロセスが3つのOpenMPスレッドおよびGPUプロセスを生成します。したがって、OpenMPの全スレッド数は 2 MPI * 3 OpenMPスレッド = 6 となります。
  • MPIプロセスに対して1つのGPUプロセスが生成されますので、この場合は、1枚のGPUカード内で2つのGPUプロセスが生成されることになります。

バッチスクリプトでの実行例(複数ノードでの実行)

ノードをまたぐ、複数ノードでの実行の場合は、gmx_mpiコマンドを利用します。 設定が複雑であり、また性能が必ずしも向上するとは限りません。 本格的に複数ノードでの計算を実行する前に、まずはシングルノードよりも性能が向上することを最初にご確認いただくことをおすすめします。

OpenMP + MPI での実行

まずはmpirunコマンドの行で、利用したいOpenMPスレッド数や全体のMPIプロセス数を検討します。 その結果に応じて、#PBS -l select= での指定内容を検討することになります。

#PBS -q APC
#PBS -l select=3:ncpus=8:mpiprocs=4

mpirun --hostfile $PBS_NODEFILE -np 12 gmx_mpi mdrun -ntomp 2 -deffnm md
  • gmx_mpiを使ったMPIプロセスでの並列化では-ntmpiは利用できません。
  • mpirunコマンド行の見方は、gmx_mpi から最後までを1つのMPIプロセスとみなし、そのMPIプロセス数を -npオプションで指定する、という意味になります。
  • -ntomp 2より各MPIプロセスが2つのOpenMPスレッドを生成します。
  • -np 12よりMPIプロセスを12プロセス生成します。したがって、この例では、12 MPI * 2 OpenMPスレッド = 24 スレッドとなります。
  • #PBS -l select= の見方は、ncpus= から最後までを1つの塊(チャンクと呼びます)とみなし、その数を select=オプションで指定する、という意味になります。
  • 各チャンクは必ず1つのノード内で実行されます。チャンクがノードをまたぐことはできません。言い換えれば、各チャンクをそれぞれ別のノードに割り当てることで、複数ノードを使った計算が可能になります。
  • この例では select=3 ですので、最大で3ノードを使った計算になります。 (「最大」と言っているのは、この例ではチャンクのサイズが小さいため、1つのノードに3つのチャンクを押し込んで実行することも可能なためです。)
  • mpiprocs=4とすることで、各チャンクに対して4つのMPIプロセスを割り振ります。
  • -ntomp 2より各MPIプロセスが2つのOpenMPスレッドを生成するため、4 MPI * 2 OpenMPスレッド = 8 スレッドです。よって、ncpus=8となります。 これにより、各チャンクに対して8つのOpenMPスレッドが割り振られます。
  • -np 12よりMPIプロセスを12プロセス生成します。mpiprocs=4によりチャンクあたりのMPIプロセスは4と指定したため、3つのチャンクが必要なので、select=3となります。
  • まとめると、-ntomp,-npの2つの値を決めることでGromacsの並列度を設定します。 そして、チャンク当たりのMPIプロセス数をmpiprocsで設定することで、ncpus および selectの値が決まります。

OpenMP + MPI + GPU(複数プロセス)での実行

#PBS -q APG
#PBS -l select=2:ncpus=6:mpiprocs=2:ngpus=1
#PBS -l place=scatter

mpirun --hostfile $PBS_NODEFILE -np 4 gmx_mpi mdrun -ntomp 3 -gpu_id 0 -deffnm md
  • gmx_mpiを使ったMPIプロセスでの並列化では-ntmpiは利用できません。
  • -ntomp 3より各MPIプロセスが3つのOpenMPスレッドを生成します。
  • -np 4よりMPIプロセスを4つ生成します。
  • mpiprocs=2とすることで、各ノードに対して2つのMPIプロセスを割り振ります。
  • 全部で4のMPIプロセスが生成されることから、2つのノードが必要なので、select=2となります。 なお、GPUノードは最大2つまでしか利用できませんので、ngpus=1の指定がある場合、select=では最大でも2となります。
  • #PBS -l place=scatter の指定により、各チャンクは必ず別のGPUノードを使うことになります。 そして、-np 4なので、GPUは各ノード当たり(つまり各GPUカードあたり)2プロセスが生成されます。

マニュアル

Gromacs Documentation(公式ホームページ)

関連サイト

Gromacs(公式ホームページ)