11. 並列版のための指定方法

並列計算には、メモリ分散型並列とメモリ共有型並列計算があり、PHITS ではその両方に対応しています。 また、両者を組み合わせたハイブリッド並列も可能です。 メモリ分散型並列のためには、お使いのコンピュータに MPI をインストールする必要があります。 メモリ共有型並列は、特にプロトコルなどをインストールする必要はありません。 ただし、同じ数のCPUを使った場合は、メモリ分散型並列の方が計算時間が短くなる場合が多いです。 シングル・並列計算の切り替えはコンパイラオプションで行い、それぞれ別の実行ファイルを作る必要があります。 詳しくは 10 章 を参照してください。

メモリ分散型並列では、各CPUコアにそれぞれバッチ単位でJobを渡して、全てのコアがそのバッチ計算を終了した時点でメインのコアが結果を集計します。 全てのコアがジオメトリやタリーの情報をそれぞれ読み込むため、メモリはシングルで走らせるときのコア数倍必要となります。 したがって、ボクセルファントムなど巨大なメモリを必要とする計算には不向きです。 また、全てのコアが計算終了するまで集計を待つため、バッチ当たりのヒストリー数 maxcas が少ないなど、各コア間での計算時間にばらつきが大きい場合は、計算時間が不必要に長くなってしまいます。

メモリ共有型並列では、各コアにヒストリー単位でJobを渡して、各コアはジオメトリやタリーなどの情報を共有しながら計算します。 したがって、メモリの使用量はシングルで走らせる場合と大差ありません。 しかし、メモリへの書き込みアクセスが競合するため、タリー結果などを頻繁に書き込む計算 ([t-sed] を使った計算など) では、計算時間が不必要に長くなってしまいます。

11.1. メモリ分散型並列

11.1.1. セットアップ方法

メモリ分散型(MPI)並列を実行するためには、MPIプロトコルをインストールする必要があります。 Windowsにおいて、1台のPCを用いて並列計算を行う場合は、Intel oneAPIパッケージに含まれるMPIプロトコルを利用してください。 インストールについては、 phits/document/Install-IntelFortran-OneAPI-en.pdf10.1 章 を参照してください。 複数台のWindows PCを接続して並列計算を行う場合は、 phits/document/mpi フォルダに含まれる Windows-MPI-setup-jp.docx を参照してください。 また、Mac および Linux に関しては、インターネットなどを参照して各自で MPI プロトコルをインストールしてください。

11.1.2. バッチファイルやシェルスクリプトを用いた実行方法

1台のPCでMPI並列版のPHITSを実行するためには、PHITS入力ファイルの最初のセクションの前に $MPI=M (M は並列数)と書きます。 例えばCPUコアが4つ搭載されたPCで最も効率よく計算したい場合は次のようにします。

$MPI = 4

なお、実際の並列実行 PE (processing element) 数は、コントロール用に1つ追加されるため M+1 となります。 この状態で入力ファイルを保存することで、通常の実行方法により、MPI並列でPHITSを実行できます。 ただし、Windowsの場合、初めて実行する際にユーザー名とパスワードを聞かれますので、それぞれ入力してください。 なお、現在のところOpenMPと組み合わせたハイブリッド並列には対応していないため、OpenMP用の $OMP とMPI用の $MPI の両方が入力ファイルに書かれた場合は、後ろに書いた方を優先する仕様になっています。

11.1.3. コマンドラインでの実行方法

各OSにおいて用意されたコマンドラインインターフェイスを用いて実行する場合は、例えば次のようになります。

mpirun -np 5 phits_LinIfort_MPI

ここで mpirun はインストールしたMPIプロトコルの実行ファイル名で、 -np の後の数字は並列の実行PE数、 phits_LinIfort_MPI はPHITSの実行ファイル名です。 このコマンドを qsub など各コンピュータに合わせた方法で投入してください。

また、メモリ分散型並列版では、自動的に phits.in ファイルから入力ファイル名を読み込みます。 この phits.in はファイル名は固定です。 このファイルの1行目に次のように入力ファイル名を記述します。

file = input_file_name

従って、起動シェルでインプットファイルのリダイレクトはできませんので注意してください。 これは、メモリ分散型並列だけの制約です。

なお、 phits.in の1行目に file=phits.in と書けば、それ以下の行に通常のインプットファイルを書いて実行することもできます。

11.1.4. maxcas, maxbch の指定方法

PHITSのメモリ分散型並列計算では、バッチ単位で並列化しています。 従って、入力のバッチ数 maxbch は、並列の実行PE数 (コントロールに1PE 使うので全PE数-1)の整数倍になるように指定してください。 もし整数倍でないときは、整数倍になるように、またトータルヒストリー数が入力データとほぼ同じになるように、プログラムが自動で変換します。 変換した場合は、出力のインプットエコーの最後にコメントが出力されます。 また、バッチ毎の情報は、メモリ分散型並列の場合は バッチ数 × (PE - 1) 毎に出力されます。 途中停止もこの単位で行うことができます。

なお、再開始計算の場合 (istdev < 0) は、 maxcas を過去の計算結果と一致するよう自動調整するため、全ヒストリー数を合わせる上記調整は行いません。 maxbch を(PE - 1)の整数倍にする調整のみ行います。

11.1.5. 異常終了の処理

プログラムが異常終了した場合、その異常終了した PE を切り離して実行します。 最終的に残った PE の計算結果の合計を全体の結果として出力します。 バッチ毎の情報と計算のサマリーの中にPEの状態が出力されます。

11.1.6. Dump, dumpall, [t-userdefined] の出力ファイル名

メモリ分散型並列を使用した場合、Dumpdumpall[t-userdefined] の出力ファイルが分割され、各ファイル名の最後に .005 のように IP 番号と関連した数字が割り振られます。 並列数が4桁、5桁の場合は、付与される番号の桁も増えます。

11.1.7. PHITSでの読み込みファイルの指定

PHITSで読み込みが必要となるファイルの代表例は、Decay-Turtleからの出力をソースとして使うときのソースファイルです。 前者は2.6MB程度のファイルで、各PEが同じファイルを同時に読み込み始めても、それほどネットワークに負担を掛けないと考えられます。 しかし、後者は100 MB近くある大きなファイルで、ソースの読み込みのたびにファイルをアクセスしに行くため、1 箇所からの読み込みには問題が生じる可能性があります。 そこで、Decay-Turtleのデータファイルを利用する場合は、あらかじめこのファイルを各 PE のワークディレクトリ /wk の下に、例えば /wk/j9999/turtle/sours.dat のようにコピーして、PHITS のインプットで file = /wk/j9999/turtle/sours.dat のように指定してください。

11.2. メモリ共有型並列

11.2.1. バッチファイルやシェルスクリプトを用いた実行方法

メモリ共有型並列版PHITSは、PHITSのインプットファイルにおいて最初のセクションの前に $OMP=N (N は使用する CPU コア数) を加えることで、通常の実行方法で利用できます。 その際、 N=1 の場合は並列計算を使用しません。 また、 N=0 の場合は計算機が持つ全てのコアを使用します。 これらは、 phits.bat (Windows OS の場合) や phits.sh (Mac OS, Linuxの場合)を利用してPHITSを実行する場合に動作します。

11.2.2. コマンドラインでの実行方法

コマンドラインから直接実行ファイルを指定する場合は、シングル版PHITSの実行方法と同じく、次のようになります。

phits_LinIfort_OMP < phits.inp

ここで phits_LinIfort_OMP は実行ファイル名です。 メモリ分散型並列と異なり、リダイレクトが使えるため、インプットファイル名 (phits.inp) は可変です。 ただし、並列数を指定するために、環境変数 OMP_NUM_THREADS をコア数に合わせて設定する必要があります。 通常、この環境変数はデフォルトでコア数に設定されていますが、最新のコンピュータは1つのコアで複数のスレッドを処理することが可能なため、コア数よりも多く設定されている場合があります。 しかし、PHITS の並列処理では、 OMP_NUM_THREADS にコア数以上の値を設定しても、ファイルの書き込み競合による計算遅延が起きてしまい、計算時間が長くなってしまいます。 そのような場合は、手動で環境変数を変更してください。 環境変数の変更は次のように行います。

export OMP_NUM_THREADS=8

また、ハイブリッド並列の場合は、各実行ノードの環境変数をそれぞれ変更する必要があります。

バージョン 2.73 より、Windows OSについては、メモリ共有型並列版PHITSの実行ファイルとして64bit版をインストールするようになりました。 32bit版のメモリ共有型並列の実行ファイルの場合、使用するコア数が増えるとヒープメモリが不足してエラーが発生していましたが、64bit版を使用することでこれが回避される可能性があります。

Linux の場合、メモリ共有型並列の実行のために libiomp5.so のライブラリが必要とされる場合があります。 この場合には以下の手順に従い、設定を行ってください。 まず、 libomp-dev のパッケージを各ディストリビューションの手順に従いインストールしてください。 例えばUbuntuの場合は、

sudo apt-get install libomp-dev

でインストールできます。 これにより、 /usr/lib/x86_64-linux-gnu/libomp.so.5 のライブラリがインストールされます。 次に、このディレクトリに移動し、

cd /usr/lib/x86_64-linux-gnu/

libiomp5.so にシンボリックリンクを作ります。

sudo ln -s libomp.so.5 libiomp5.so

これにより、 libiomp5.so のライブラリが認識されるようになり、PHITS によるメモリ共有型並列計算が実行できるようになります。

11.2.3. メモリ共有型並列計算の注意点

CPUコア数が1つの場合、メモリ共有型並列版PHITSの計算時間は、シングル版PHITSの計算時間よりも2倍程度長くなります。 したがって、コア数が2以下のコンピュータでは、メモリ共有型並列計算による計算時間短縮のメリットはほとんどありません。

Linuxで実行時にセグメンテーションエラーが生じる場合は、実行前にスタックサイズを広げることにより解決する場合があります。 スタックサイズの広げ方は、

export OMP_STACKSIZE=1G

のようになります。ここではスタックメモリを 1 GB にする例です。

メモリ共有型並列計算結果は、シングルでの計算結果と一致するように設計しています。 両者で結果が異なる場合は、バグの可能性がありますのでPHITS事務局まで連絡してください。