% 表題   らくらく DCPAM5 -- 並列計算を行うには
%
% 履歴 
%\Drireki{2011/09/30 高橋芳幸}
%
\chapter{並列計算を行うには}


\section{はじめに}

\Dmodel は, MPI (Message Passing Interface) を用いて並列化されている
\footnote{
\Dmodel の移流計算においてスペクトル変換に用いている ispack が OpenMP を
用いて並列化されているため, 移流計算部分は OpenMP での並列計算が可能で
ある. しかし, 他の部分は OpenMP 並列に対応していないため, OpenMP での並列計算
は実用的ではないだろう. 
}. 
この章では, \Dmodel を用いた並列計算の実行方法について述べる. 


\section{\Dmodel の MPI 並列化の概要}

並列計算のための準備と実行方法について述べる前に, \Dmodel での MPI 並列実装の
概要について簡単に説明しておく.

\subsection{分割方法}

\Dmodel の MPI 並列化においては, 全球の格子点を緯度方向に分割する
\footnote{
  ここでは実空間の分割についてのみ述べる.
  現在の \Dmodel では, 移流の計算にスペクトル法を用いており, 波数空間のデータの
  保有方法・分割方法については別途説明が必要であるが, ここでは省略する. 
}. 
つまり, 各 MPI プロセスは, ある緯度帯の経度-緯度(帯)-高度の 3 次元データを保持
しており, 必要に応じて MPI ライブラリを用いて通信を行う. 
緯度方向の分割方法は, 現在の \Dmodel が移流計算に用いている ispack の MPI 並列化
の方法に従っている. 
例えば, T42 の水平解像度で, 4 並列で計算する場合,
各プロセスは以下の緯度帯のデータを保持する
\footnote{
実際に保持される格子点の緯度は下のようになる. 
\begin{itemize}
  \item [] process 0 :  1.4$^\circ$S/N,  4.2$^\circ$S/N,  7.0$^\circ$S/N,  9.8$^\circ$S/N, 12.6$^\circ$S/N, 15.3$^\circ$S/N, 18.1$^\circ$S/N, 20.9$^\circ$S/N,
  \item [] process 1 : 23.7$^\circ$S/N, 26.5$^\circ$S/N, 29.3$^\circ$S/N, 32.1$^\circ$S/N, 34.9$^\circ$S/N, 37.7$^\circ$S/N, 40.5$^\circ$S/N, 43.3$^\circ$S/N,
  \item [] process 2 : 46.0$^\circ$S/N, 48.9$^\circ$S/N, 51.6$^\circ$S/N, 54.4$^\circ$S/N, 57.2$^\circ$S/N, 60.0$^\circ$S/N, 62.8$^\circ$S/N, 65.6$^\circ$S/N,
  \item [] process 3 : 68.4$^\circ$S/N, 71.2$^\circ$S/N, 73.9$^\circ$S/N, 76.7$^\circ$S/N, 79.5$^\circ$S/N, 82.3$^\circ$S/N, 85.1$^\circ$S/N, 87.9$^\circ$S/N.
\end{itemize}
}$^,$\footnote{
プロセス番号は 0 から始まる. これは MPI の決まり.
}.
%
\begin{itemize}
  \item [] process 0 : -20.9$^\circ$ $\le$ $\phi$ $\le$ 20.9$^\circ$,
  \item [] process 1 : -43.3$^\circ$ $\le$ $\phi$ $\le$ -23.7$^\circ$, 23.7$^\circ$ $\le$ $\phi$ $\le$ 43.3$^\circ$, 
  \item [] process 2 : -65.6$^\circ$ $\le$ $\phi$ $\le$ -46.0$^\circ$, 46.0$^\circ$ $\le$ $\phi$ $\le$ 65.6$^\circ$, 
  \item [] process 3 : -87.9$^\circ$ $\le$ $\phi$ $\le$ -68.4$^\circ$, 68.4$^\circ$ $\le$ $\phi$ $\le$ 87.9$^\circ$.
\end{itemize}
%
分割方法の詳細については, ispack の文書を参照すること. 


\subsection{入出力}

現在の \Dmodel においては, 入出力は各プロセスごとに行っている. したがって, 
入力データは各プロセス用に準備する必要がある. 
同様に, 出力データも各プロセスごとに別のファイルに分割されているため, 必要に
応じてそれらのデータを統合する必要がある. 

この時, \Dmodel の入出力ファイル名には MPI のプロセス番号を含めており, 
ファイル名は *\_rank000000.nc, *\_rank000001.nc, *\_rank000002.nc, ... の
書式となる
\footnote{
この書式は gtool の決まり.
}.

ただし, 設定ファイル (実行時の namelist ファイル) でのファイル名の指定には, 
プロセス番号 \_rank000000, \_rank000001, \_rank000002, ... の部分は含めず, 
例えば, 初期値ファイル・リスタートファイルの名前は, 設定ファイルにおいて
下のように指定する. 
%
\begin{verbatim}
&restart_file_io_nml
  OutputFile = 'init_T21L20.nc'
/
\end{verbatim}
%
このとき, それぞれのプロセスにおいて, 初期値ファイル・リスタートファイルの名前は, 
init\_T21L20\_rank000000.nc, init\_T21L20\_rank000001.nc, 
init\_T21L20\_rank000002.nc, ... と解釈される.


\section{コンパイル}

\subsection{必要なソフトウェアの準備}

\Dmodel の並列計算のためには, 以下のライブラリが必要である, 
%
\begin{itemize}
\item MPI ライブラリ, 
\item MPI コンパイラでコンパイルした ispack,
\item MPI コンパイラでコンパイルした gtool5,
\item MPI コンパイラでコンパイルした spml.
\end{itemize}
%
MPI ライブラリのコンパイル, および ispack, gtool5, spml の MPI コンパイラを
用いたコンパイルの詳細は, 各ライブラリの文書を参照すること. 

\subsection{コンパイル時の注意}

コンパイルの基本的な方法は逐次版と同じであり, 詳細は, 
「\Dmodel インストールガイド」
(\url{http://www.gfd-dennou.org/library/dcpam/dcpam5/dcpam5\_latest/INSTALL.htm}) 
を参照すること.
ただし, 下の点に注意すること. 
%
\begin{itemize}
\item コンパイラとして MPI コンパイラ (例えば mpif90) を用いる,
\item MPI コンパイラでコンパイルした ispack, gtool5, spml を用いる,
\item \Dmodel コンパイル時の configure のオプションに -\hspace{-0.05mm}-enable-mpi を指定する.
\end{itemize}


\section{並列計算の実行}

計算の実行の手順は, 逐次版と同じく, 
%
\begin{itemize}
\item 初期値の準備,
\item 実験用データの準備 (例えば, 海表面温度, 地形, オゾンの分布のデータのことを意味する),
\item 実験の実行,
\end{itemize}
%
である. ただし, 既に述べたように, 入力ファイルはプロセスごとに分割されている
必要がある. 
ここでは, まず Held and Suarez (1994) が提案した力学コア実験を例として
取り上げ, 実行方法について述べる
\footnote{
MPI を用いて並列化されたプログラムの実行方法の一般的な説明・詳細な説明については
MPI ライブラリの文書を参照すること. ここで示す方法がどの程度一般的であるかは
わからない (yot, 2011/09/30). 
}. 

基本的な方法は逐次版と同じであり, 「ごくらく \Dmodel」
(\url{http://www.gfd-dennou.org/library/dcpam/dcpam5/dcpam5_latest/doc/tutorial/gokuraku/}) 
の項目を参照すること. 
Held and Suarez (1994) の実験においては, 初期値を用意し, 実行すればよい.
初期値は下のように用意する.
%
\begin{verbatim}
  % mpiexec -n N ./init_data -N=init_data_hs94_T21L20.nml
\end{verbatim}
%
ここで, N はプロセス数である. 
これにより, 初期値ファイル init\_T21L20\_rank000000.nc, init\_T21L20\_rank000001.nc, 
init\_T21L20\_rank000002.nc, ... が生成される. 

次に, 下のように実行する.
%
\begin{verbatim}
  % mpiexec -n N ./dcpam_main -N=dcpam_hs94_T21L20.nml
\end{verbatim}

なお, \Dmodel で用意してある初期値生成プログラム, init\_data, や, 惑星表面温度
データ生成ブログラム, sst\_data, を用いて入力ファイルを用意する際には, 上記の
ように, それぞれを mpiexec を用いて実行することで, プロセスごとのデータファイル
を生成することができる. 
その他のデータファイルに関しては, 別途プロセスごとに分割する必要がある. 

また, 実行により得られる結果は, 上記のように, プロセスごとに分割されて
いる. 必要に応じて統合する必要がある.


\section{入出力データの分割と統合}
\label{sec:split-merge}

入出力データの分割と統合のためにプログラムを用意している. 
ただし, これらのプログラムは, 今のところ \Dmodel には付属していない. 
(今のところ) 以下の場所からダウンロードすることができる. 
%
\begin{quote}
\url{http://www.gfd-dennou.org/library/dcpam/related-program/}
\end{quote}


\subsection{入力データの分割}
\label{sec:split}

入力データの分割のためにプログラム (util\_split) を用意している. 
使い方については, 当該プログラムに付属する README を参照すること.

\subsection{出力データの統合}
\label{sec:merge}

出力データの統合のためにプログラム (util\_merge) を用意している. 
使い方については, 当該プログラムに付属する README を参照すること.

