<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="ja">
	<id>http://comp.chem.tohoku.ac.jp/mediawiki/index.php?action=history&amp;feed=atom&amp;title=%E3%83%81%E3%83%A5%E3%83%BC%E3%83%88%E3%83%AA%E3%82%A2%E3%83%AB02%EF%BC%9A%E4%B8%A6%E5%88%97%E5%AE%9F%E8%A1%8C</id>
	<title>チュートリアル02：並列実行 - 版の履歴</title>
	<link rel="self" type="application/atom+xml" href="http://comp.chem.tohoku.ac.jp/mediawiki/index.php?action=history&amp;feed=atom&amp;title=%E3%83%81%E3%83%A5%E3%83%BC%E3%83%88%E3%83%AA%E3%82%A2%E3%83%AB02%EF%BC%9A%E4%B8%A6%E5%88%97%E5%AE%9F%E8%A1%8C"/>
	<link rel="alternate" type="text/html" href="http://comp.chem.tohoku.ac.jp/mediawiki/index.php?title=%E3%83%81%E3%83%A5%E3%83%BC%E3%83%88%E3%83%AA%E3%82%A2%E3%83%AB02%EF%BC%9A%E4%B8%A6%E5%88%97%E5%AE%9F%E8%A1%8C&amp;action=history"/>
	<updated>2026-07-08T22:32:01Z</updated>
	<subtitle>このウィキのこのページに関する変更履歴</subtitle>
	<generator>MediaWiki 1.36.2</generator>
	<entry>
		<id>http://comp.chem.tohoku.ac.jp/mediawiki/index.php?title=%E3%83%81%E3%83%A5%E3%83%BC%E3%83%88%E3%83%AA%E3%82%A2%E3%83%AB02%EF%BC%9A%E4%B8%A6%E5%88%97%E5%AE%9F%E8%A1%8C&amp;diff=1049&amp;oldid=prev</id>
		<title>Hirano: ページの作成:「　本章ではFreeFlexにより同時に複数のMD計算を行う方法について説明する。なお、MPI計算はサーバーごとに使用方法が微妙に異…」</title>
		<link rel="alternate" type="text/html" href="http://comp.chem.tohoku.ac.jp/mediawiki/index.php?title=%E3%83%81%E3%83%A5%E3%83%BC%E3%83%88%E3%83%AA%E3%82%A2%E3%83%AB02%EF%BC%9A%E4%B8%A6%E5%88%97%E5%AE%9F%E8%A1%8C&amp;diff=1049&amp;oldid=prev"/>
		<updated>2026-05-26T02:34:38Z</updated>

		<summary type="html">&lt;p&gt;ページの作成:「　本章ではFreeFlexにより同時に複数のMD計算を行う方法について説明する。なお、MPI計算はサーバーごとに使用方法が微妙に異…」&lt;/p&gt;
&lt;p&gt;&lt;b&gt;新規ページ&lt;/b&gt;&lt;/p&gt;&lt;div&gt;　本章ではFreeFlexにより同時に複数のMD計算を行う方法について説明する。なお、MPI計算はサーバーごとに使用方法が微妙に異なることが多く、大まかな流れ以外は各自で実行方法を確認する必要が出てくることがある。&lt;br /&gt;
&lt;br /&gt;
本研究室では現在PBSを用いて並列計算の投入を行っており、PBSの利用が推奨される。詳細については[[PBS Pro マニュアル]]参照&lt;br /&gt;
&lt;br /&gt;
== MPI環境の準備 ==&lt;br /&gt;
（私の環境では完全にはじめから始めたわけではないので、他にも初期設定がいる可能性が高いです。）&lt;br /&gt;
&lt;br /&gt;
　MPIを用いたプログラムの実行ではサーバーマシン起動後の初回に&lt;br /&gt;
&lt;br /&gt;
 &amp;gt; mpdboot –f /etc/mpd.hosts –n 15 &amp;amp;&lt;br /&gt;
&lt;br /&gt;
のようなコマンドを用いる必要がある。 ここでmpd.hosts は&lt;br /&gt;
&lt;br /&gt;
 === mpd.hosts ==================================================================================&lt;br /&gt;
 naruko00&lt;br /&gt;
 naruko01&lt;br /&gt;
 naruko02&lt;br /&gt;
   .&lt;br /&gt;
   .&lt;br /&gt;
   .&lt;br /&gt;
 ================================================================================================&lt;br /&gt;
&lt;br /&gt;
のようにクラスタ化されているマシン名を一覧にしたファイルであり、”-n” で指定している数字はマシンの総数である。&lt;br /&gt;
　&lt;br /&gt;
&lt;br /&gt;
== OpenMP並列化による計算の高速化 ==&lt;br /&gt;
&lt;br /&gt;
===基本の実行===&lt;br /&gt;
　FreeFlex でOpenMP による並列実行を行うには、&amp;amp;FreeFlex ネームリストにおいて、&lt;br /&gt;
&lt;br /&gt;
 === input_omp.nml ==============================================================================&lt;br /&gt;
 &amp;amp;FreeFlex&lt;br /&gt;
   ms_init_file = &amp;quot;system3.ms&amp;quot;,&lt;br /&gt;
   xyz_traj_file = &amp;quot;traj_omp.xyz&amp;quot;,&lt;br /&gt;
   log_file = &amp;quot;log_omp&amp;quot;,&lt;br /&gt;
   ms_last_file = &amp;quot;system4_omp.ms&amp;quot;,&lt;br /&gt;
   nml_output_file = &amp;quot;output_omp.nml&amp;quot;&lt;br /&gt;
   ms_restart_file = &amp;quot;restart_omp.ms&amp;quot;&lt;br /&gt;
   nstep = 100&lt;br /&gt;
   dt = 1.0d-15&lt;br /&gt;
   omp_number = 16&lt;br /&gt;
 /&lt;br /&gt;
 ================================================================================================&lt;br /&gt;
&lt;br /&gt;
 &amp;gt; ./FreeFlex.exe input_omp.nml &amp;amp;&lt;br /&gt;
&lt;br /&gt;
のように omp_number を指定して実行すればよい（系は[[チュートリアル01：水-DCM 界面のシミュレーション|Tutorial01]]のものと同様。&amp;lt;span style=&amp;quot;color:red&amp;quot;&amp;gt;/sample/tutorial/02 内の ms_init_file が古い version のものである場合があるため，[[チュートリアル01：水-DCM 界面のシミュレーション|Tutorial01]] で作成したものを使用すること．&amp;lt;/span&amp;gt;）。 ただし一度に多くの計算を回す場合は、&lt;br /&gt;
&lt;br /&gt;
 &amp;gt; export OMP_NUM_THREADS=4; ./FreeFlex.exe input_omp.nml &amp;amp;&lt;br /&gt;
&lt;br /&gt;
のように環境変数側でも並列数を指定する方が無難なようである。以前この指定を行わなかったところ使用プロセッサ数が多すぎるとのエラーメッセージが出たことがある。これは、 OMP_NUM_THREADS の初期値が最大並列可能数に設定されており、実行時に一度このプロセッサ数を確保したうえでプログラム中の命令で使用プロセッサ数を制限するためと考えられる。&lt;br /&gt;
&lt;br /&gt;
===PBSを利用した実行===&lt;br /&gt;
PBSを利用したOMPジョブの投入例を以下に示す。この投入例はmpi1、omp16の投入ファイルである。&lt;br /&gt;
&lt;br /&gt;
なお、PBSを用いる際は他計算機にFreeFlexをコピーし、rsh接続ができることを確認すること。詳細は[[PBS Pro マニュアル]]を参照。&lt;br /&gt;
&lt;br /&gt;
細かい内容、例えば３行目の値の設定(ncpusなど)は、[[チュートリアル02:並列計算]]などのPBSのチュートリアルを参考にすること。&lt;br /&gt;
&lt;br /&gt;
 === sub_omp.sh ==============================================================================&lt;br /&gt;
 #!/bin/bash&lt;br /&gt;
 #PBS -N tutorial02&lt;br /&gt;
 #PBS -l select=1:ncpus=16:mpiprocs=1:ompthreads=16&lt;br /&gt;
 #PBS -j oe&lt;br /&gt;
 &lt;br /&gt;
 ###### ユーザー指定の変数の default 以外を設定する。###########################&lt;br /&gt;
 RNODE=node00&lt;br /&gt;
 RDIR=/home/user/FreeFlex/sample/tutorial/02&lt;br /&gt;
 RFILE=&lt;br /&gt;
 WDIR=&lt;br /&gt;
 SAVE=&lt;br /&gt;
 &lt;br /&gt;
     echo -n 'START: '; date&lt;br /&gt;
     ###### initialization #####################################################&lt;br /&gt;
     ######  [1] mpd  ######&lt;br /&gt;
     touch /tmp/node_$$&lt;br /&gt;
     trap 'rm /tmp/node_$$' 1 2 3 15&lt;br /&gt;
     uniq $PBS_NODEFILE &amp;gt; /tmp/node_$$&lt;br /&gt;
     NPROCS=`cat $PBS_NODEFILE | wc -l`&lt;br /&gt;
     NHOSTS=`cat /tmp/node_$$ | wc -l`&lt;br /&gt;
     for i in `cat /tmp/node_$$`&lt;br /&gt;
     do&lt;br /&gt;
         rsh $i mpdcleanup &amp;gt;/dev/null&lt;br /&gt;
     done&lt;br /&gt;
     mpdboot -f /tmp/node_$$ -n $NHOSTS -r rsh&lt;br /&gt;
 &lt;br /&gt;
     EXIST=`rsh $RNODE &amp;quot;test -e $RDIR; echo \\$?&amp;quot;` # $RNODE:$RDIR の存在を確認する。&lt;br /&gt;
     if [ $EXIST != 0 ]; then&lt;br /&gt;
         echo ' Error! No such a dirctory. Confirm RNODE and RDIR. '$RNODE&amp;quot;:&amp;quot;$RDIR&lt;br /&gt;
         exit&lt;br /&gt;
     fi&lt;br /&gt;
 &lt;br /&gt;
     ###### [2] files  ######&lt;br /&gt;
     echo 'RNODE: '${RNODE:='fep'}          # default は、'fep'になる。&lt;br /&gt;
     echo 'RDIR:  '${RDIR:=$PBS_O_WORKDIR}  # defalut は、サブミットした場所。&lt;br /&gt;
     echo 'RFILE: '${RFILE:=&amp;quot;*&amp;quot;}            # default は、すべて。&lt;br /&gt;
     echo 'WDIR:  '${WDIR:=$HOME/$$}        # default は、$HOME/$$&lt;br /&gt;
     echo 'SAVE:  '${SAVE:=0}               # default は、0&lt;br /&gt;
     echo 'PBS_NODE: '`cat /tmp/node_$$`&lt;br /&gt;
 &lt;br /&gt;
     test -e $WDIR || mkdir -p $WDIR        # WDIR をつくる。&lt;br /&gt;
     cd $WDIR&lt;br /&gt;
     touch touch_$$&lt;br /&gt;
     if [ &amp;quot;`rsh $RNODE ls $RDIR/touch_$$ 2&amp;gt;/dev/null`&amp;quot; == &amp;quot;$RDIR/touch_$$&amp;quot; ]; then&lt;br /&gt;
         IDENTICAL=0     # RDIR と WDIR が同一のとき、何もしない。&lt;br /&gt;
     else&lt;br /&gt;
         IDENTICAL=1     # RDIR と WDIR が別ディレクトリのとき、RNODE の入力ファイルを WDIR にコピー。&lt;br /&gt;
         rsh $RNODE &amp;quot;cd $RDIR; tar czf - $RFILE&amp;quot; | tar xzf -&lt;br /&gt;
     fi&lt;br /&gt;
     rm touch_$$&lt;br /&gt;
 &lt;br /&gt;
 #######  execution  ###########################################################&lt;br /&gt;
 export FreeFlex='/home/user/FreeFlex'&lt;br /&gt;
 mpiexec -machinefile $PBS_NODEFILE -n $NPROCS $FreeFlex/FreeFlex.exe input_omp.nml&lt;br /&gt;
 ###############################################################################&lt;br /&gt;
 &lt;br /&gt;
     ####### termination #######################################################&lt;br /&gt;
     ###### [2] files  ######&lt;br /&gt;
     cd&lt;br /&gt;
     if [ $IDENTICAL -ne 0 ]; then&lt;br /&gt;
     # RDIR と WDIR が別ディレクトリのとき、WDIR の出力ファイルを RDIR にコピー。&lt;br /&gt;
     #       rsync -azu -e rsh $WDIR&amp;quot;/&amp;quot; $RNODE:$RDIR&lt;br /&gt;
         ionice -c 3 nice -n 10 rsync -azu -e rsh --rsync-path=&amp;quot;ionice -c 3 nice -n 10 rsync&amp;quot; $WDIR&amp;quot;/&amp;quot; $RNODE:$RDIR&lt;br /&gt;
         if [ $? -eq 0 ]; then&lt;br /&gt;
                 [ $SAVE -eq 0 ] &amp;amp;&amp;amp; rm -rf $WDIR    # SAVE=0 のとき、WDIR を削除。&lt;br /&gt;
         else&lt;br /&gt;
                 echo &amp;quot;rsync failed in terminating the job.&amp;quot;&lt;br /&gt;
         fi&lt;br /&gt;
     fi &lt;br /&gt;
     ###### [1] mpd  ######&lt;br /&gt;
     mpdcleanup -r rsh -f /tmp/node_$$&lt;br /&gt;
     rm /tmp/node_$$&lt;br /&gt;
     ###########################################################################&lt;br /&gt;
     echo -n 'END: '; date&lt;br /&gt;
 ================================================================================================&lt;br /&gt;
&lt;br /&gt;
上記のファイルのRNODEを現在のノードに、user部分をFreeFlexが置いてあるディレクトリへと変更すること。ジョブの投入には以下のコマンドを実行すればよい。&lt;br /&gt;
&lt;br /&gt;
 &amp;gt; qsub sub_omp.sh&lt;br /&gt;
&lt;br /&gt;
== MPI並列化による複数計算（とりあえず回してみる） ==&lt;br /&gt;
　FreeFlex で複数の計算を同時に行うには下記のようにMPIによる実行を行えばよい。&lt;br /&gt;
&lt;br /&gt;
 === input_mpi.nml ==============================================================================&lt;br /&gt;
 &amp;amp;FreeFlex&lt;br /&gt;
   ms_init_file = &amp;quot;system3.ms&amp;quot;,&lt;br /&gt;
   xyz_traj_file = &amp;quot;traj_mpi.xyz&amp;quot;,&lt;br /&gt;
   log_file = &amp;quot;log_mpi&amp;quot;,&lt;br /&gt;
   ms_last_file = &amp;quot;system4_mpi.ms&amp;quot;,&lt;br /&gt;
   nml_output_file = &amp;quot;output_mpi.nml&amp;quot;&lt;br /&gt;
   ms_restart_file = &amp;quot;restart_mpi.ms&amp;quot;&lt;br /&gt;
   nstep = 100&lt;br /&gt;
   dt = 1.0d-15&lt;br /&gt;
   omp_number = 4&lt;br /&gt;
 /&lt;br /&gt;
 ================================================================================================&lt;br /&gt;
&lt;br /&gt;
 &amp;gt; mpiexec –machinefile machinefile –n 4 ./FreeFlex.exe input_mpi.nml &amp;amp;&lt;br /&gt;
&lt;br /&gt;
ここで machinefile はMPIを実行するマシンの名前を一覧にしたもので、&lt;br /&gt;
&lt;br /&gt;
 === machinefile ================================================================================&lt;br /&gt;
 naruko00&lt;br /&gt;
 naruko00&lt;br /&gt;
 naruko00&lt;br /&gt;
 naruko00&lt;br /&gt;
 ================================================================================================&lt;br /&gt;
&lt;br /&gt;
のような形式で –nで指定した数以上のマシン名を列記する必要がある。 なお、今回の計算ではinput_mpi.nml 中で omp_number も 4 に設定されており、計 (omp)×(mpi)=4×4=16 個のプロセッサを使用することになる。&lt;br /&gt;
&lt;br /&gt;
　上記コマンドを実行するとディレクトリ内に 0000/, 0001/, 0002/, 0003/ の4つのディレクトリが作られる計算結果はこの中に格納されている。&lt;br /&gt;
&lt;br /&gt;
== MPI並列化（条件を変える） ==&lt;br /&gt;
　先のMPI計算では4つの計算はすべて全く同じ条件で実行されている。 この条件を変えるには 0000/ 等のディレクトリ内にもネームリストを作成する必要がある。 例えば、並列数を1, 2, 4, 8 と変えて実行したい場合、&lt;br /&gt;
&lt;br /&gt;
 === input_mpi2.nml =============================================================================&lt;br /&gt;
 &amp;amp;FreeFlex&lt;br /&gt;
   ms_init_file = &amp;quot;system4_mpi.ms&amp;quot;,&lt;br /&gt;
   xyz_traj_file = &amp;quot;traj_mpi2.xyz&amp;quot;,&lt;br /&gt;
   log_file = &amp;quot;log_mpi2&amp;quot;,&lt;br /&gt;
   ms_last_file = &amp;quot;system5_mpi.ms&amp;quot;,&lt;br /&gt;
   nml_output_file = &amp;quot;output_mpi2.nml&amp;quot;&lt;br /&gt;
   ms_restart_file = &amp;quot;restart_mpi2.ms&amp;quot;&lt;br /&gt;
   nstep = 100&lt;br /&gt;
   dt = 1.0d-15&lt;br /&gt;
   omp_number = 4&lt;br /&gt;
 /&lt;br /&gt;
 ================================================================================================&lt;br /&gt;
&lt;br /&gt;
のような全体の基準となるファイルの他に、&lt;br /&gt;
&lt;br /&gt;
 === 0000/input_mpi2.nml ========================================================================&lt;br /&gt;
 &amp;amp;FreeFlex&lt;br /&gt;
   omp_number = 1&lt;br /&gt;
 /&lt;br /&gt;
 ================================================================================================&lt;br /&gt;
&lt;br /&gt;
 === 0001/input_mpi2.nml ========================================================================&lt;br /&gt;
 &amp;amp;FreeFlex&lt;br /&gt;
   omp_number = 2&lt;br /&gt;
 /&lt;br /&gt;
 ================================================================================================&lt;br /&gt;
&lt;br /&gt;
 === 0002/input_mpi2.nml ========================================================================&lt;br /&gt;
 &amp;amp;FreeFlex&lt;br /&gt;
   omp_number = 4&lt;br /&gt;
 /&lt;br /&gt;
 ================================================================================================&lt;br /&gt;
&lt;br /&gt;
 === 0003/input_mpi2.nml ========================================================================&lt;br /&gt;
 &amp;amp;FreeFlex&lt;br /&gt;
   omp_number = 8&lt;br /&gt;
 /&lt;br /&gt;
 ================================================================================================&lt;br /&gt;
&lt;br /&gt;
のようなファイルを各ディレクトリ内に作成する必要がある（各自作成すること。）。なおinput_mpi2.nml 内ではインプットとなるmsファイル名に２-２  で各ディレクトリ内に作成された &amp;quot;system4_mpi.ms&amp;quot; を指定している（ワークディレクトリ内にはこのファイルは存在しない。存在していても各ディレクトリ内が優先される）。 このような指定により、MPI実行で得られた最終構造からMD計算を再開できる。 また、msファイルの中身をそれぞれ別のデータと差し替えることで、複数の構造（初期条件）からの計算が可能になる。&lt;br /&gt;
&lt;br /&gt;
　本計算を下記コマンドにより実行すると（OMP_NUM_THREADSを指定している場合は解除すること）、&lt;br /&gt;
&lt;br /&gt;
 &amp;gt; mpiexec –machinefile machinefile –n 4 ./FreeFlex.exe input_mpi2.nml &amp;amp;&lt;br /&gt;
 &lt;br /&gt;
 FreeFlex.F(246): WARNNING: ファイル system4_mpi.ms が存在しません。&lt;br /&gt;
 MPI用ディレクトリからの読み込みを試みます。&lt;br /&gt;
&lt;br /&gt;
のような警告メッセージが出力されるがこれは各ディレクトリ内のmsファイルを読みに行っていることを示す正常な動作である。 実行結果として計算時間を見てみると、&lt;br /&gt;
&lt;br /&gt;
 0000/log_mpi2:    total:                                215.238 s&lt;br /&gt;
 0001/log_mpi2:    total:                                136.926 s&lt;br /&gt;
 0002/log_mpi2:    total:                                 85.610 s&lt;br /&gt;
 0003/log_mpi2:    total:                                 60.399 s&lt;br /&gt;
&lt;br /&gt;
のようにOpenMPによる実行で計算速度がある程度速くなっていることが分かる。&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== 実際に系を作成する　==&lt;br /&gt;
実際に初期構造を作る際、チュートリアル01のような作業を数十回やるのは骨が折れるので、そういった作業を自動で行うスクリプトのサンプルを以下に示す。&lt;br /&gt;
&lt;br /&gt;
[[ファイル:makesystem.txt]]&lt;br /&gt;
&lt;br /&gt;
 === makesystem.sh =================================================================&lt;br /&gt;
 #!/bin/bash&lt;br /&gt;
 # 系の作成個数を決める。&lt;br /&gt;
 ndir=80&lt;br /&gt;
 &lt;br /&gt;
 $HOME/FreeFlex/add2.exe add.nml system1.ms&lt;br /&gt;
 &lt;br /&gt;
 #水、DCMのmsファイルが存在する場合、xyzファイルを作成する。&lt;br /&gt;
 if test -e DCM.ms&lt;br /&gt;
 then&lt;br /&gt;
 $HOME/FreeFlex/ms2xyz.exe DCM.ms DCM.xyz&lt;br /&gt;
 fi&lt;br /&gt;
 &lt;br /&gt;
 if test -e water.ms&lt;br /&gt;
 then &lt;br /&gt;
 $HOME/FreeFlex/ms2xyz.exe water.ms water.xyz&lt;br /&gt;
 fi&lt;br /&gt;
 &lt;br /&gt;
 #系の作成&lt;br /&gt;
 #packmolを用いる際、system.inpに&amp;quot;seed -1&amp;quot;を追加すること。 &lt;br /&gt;
 &lt;br /&gt;
 for ((i=0 ; i&amp;lt;$ndir ; i++))&lt;br /&gt;
 do&lt;br /&gt;
   dir=$(printf &amp;quot;%04d&amp;quot; &amp;quot;${i}&amp;quot; )&lt;br /&gt;
 &lt;br /&gt;
   echo $dir&lt;br /&gt;
   packmol &amp;lt; system.inp&lt;br /&gt;
   $HOME/FreeFlex/xyz2ms.exe system.xyz system1.ms system2.ms&lt;br /&gt;
   mkdir -p ../$dir&lt;br /&gt;
   mv ./system2.ms ../$dir/system1.ms                                                                             &lt;br /&gt;
 done&lt;br /&gt;
 =========================================================================================&lt;br /&gt;
&lt;br /&gt;
上記のスクリプトはあくまでも個人用なので、用いる際は個々人でカスタマイズすること。&lt;/div&gt;</summary>
		<author><name>Hirano</name></author>
	</entry>
</feed>