目次


IBM POWER8 システム上で Weather Research and Forecasting をコンパイルして実行する

気象分析の処理時間を短縮してより迅速に通知を行えるようにする

Comments

WRF (Weather Research and Forecasting) モデルは、大気の研究や業務としての予報などのニーズに対処する目的で気象予測をするために使用できる主要なアプリケーションです。WRF はソース・コードを tarball として提供するオープンソース・プログラムであるため、ユーザーは各種のプラットフォーム上で tarball をバイナリーにコンパイルする必要があります。WRF は通常、並列コンピューティングをサポートするハイパフォーマンス・コンピューティング環境で実行されます。Intel x86 プラットフォームと IBM Power プラットフォームは、どちらもハイパフォーマンス・コンピューティングを可能にします。

このチュートリアルでは、以下の内容を学びます。

  • WRF とその依存ライブラリーを、IBM POWER8 プラットフォーム上で IBM XL Fortran コンパイラーと XL C/C++ コンパイラーによってコンパイルする方法。
  • POWER8 プラットフォーム上で、IBM Parallel Environment (PE) を使用して WRF を実行する方法。

オペレーティング・システムに関する情報とディレクトリーの設定

このチュートリアルのために私が使用したオペレーティング・システムは、Power 対応の Red Hat Enterprise Linux Server リリース 6.5 (Santiago) です。使用したソフトウェアおよびソース・コードのバージョンは以下のとおりです。

図 1. ソフトウェアの依存関係
WRF、WPS、NetCDF、および関連ライブラリーの依存関係を示す図

ヒント: コンパイルおよびインストールを実行するために、非 root ユーザーを作成することをお勧めします。例えば、loadl という非 root ユーザーを作成すると、WRF とその関連ライブラリーをコンパイルして loadl ホーム・ディレクトリーにインストールすることができます。PE を使用して並列コンピューティング・ジョブを実行する際にも、非 root ユーザーとして実行する必要があります。

リスト 1. このチュートリアルでの定義
/home/loadl/project/bin --> The folder where the compiled binaries are installed.
/home/loadl/project/include --> The folder where the header files are installed.
/home/loadl/project/lib --> The folder where the libraries are installed.
/home/loadl/project/share --> The folder where the manual, document are installed.
/home/loadl/project/source --> The folder where the source code packages are saved.
/home/loadl/project/netcdf --> The folder where the compiled netcdf are installed. 
                               It has sub folders such as bin,include,lib,share.

また、ユーザー loadl の SSH 鍵ペアを生成し、その鍵ペアの一方である公開鍵を、許可された鍵に追加する必要もあります。こうすることにより、ユーザー loadl のサイレント・ログインが可能になります。サイレント・ログインは、このノード上で PE ジョブを実行するための前提条件です。

WRF モデルのインストールとコンパイル

Linux 上に XL Fortran コンパイラーと XL C/C++ コンパイラーをインストールする

XL Fortran コンパイラーと XL C/C++ コンパイラーをインストールするには、root を使用します。注: XL C/C++ コンパイラーには、以下のリストに示されているパッケージが必要です。これらのパッケージが用意されていない場合は、yum を使用してインストールしてください。32 ビット版パッケージには拡張子 *.ppc、64 ビット版パッケージには拡張子 *.ppc64 が使用されています。

リスト 2. XL C/C++ コンパイラーに必要なパッケージ
yum install libstdc++*.ppc
yum install gcc
yum install gcc-c++
yum install glibc-devel*.ppc64
yum install glibc-devel*.ppc
yum install libstdc++-devel*.ppc64
yum install compat-libstdc++-33*.ppc
yum install compat-libstdc++-33*.ppc64
yum install ksh

Linux 上に PE をインストールする

まず始めに、必要なすべてのパッケージがインストールされていることを確認してください。PE には、bind パッケージと xinetd パッケージが必要です。yum を使用して、yum install bind で bind パッケージをインストールし、yum install xinetd で xinetd パッケージをインストールします。それが終わったら、/etc/selinux/config ファイルを編集し、SELINUX=disabled を設定することで、SELinux を無効にします。

これらの変更を適用するために、オペレーティング・システムをリブートします。

その後、root として以下のステップに従ってコマンドを実行し、PE をインストールします。

  1. export IBM_PPEDEV_LICENSE_ACCEPT=yes
  2. rpm -i ppedev_pa_license-1.3.0-0.ppc64.rpm
  3. rpm -i ppedev_pa_runtime-1.3.0-0.ppc64.rpm
  4. rpm -i ppedev_pa_hpct-1.3.0-0.ppc64.rpm
  5. export IBM_PPE_RTE_LICENSE_ACCEPT=yes
  6. rpm -i ppe_rte_license-1.3.0.8-s008a.ppc64.rpm
  7. rpm -i ppe_rte_1308-1.3.0.8-s008a.ppc64.rpm

このパッケージのインストールの終了時に、推奨されるシステム設定に変更するよう促すプロンプトが出されます。これらのシステム設定の変更は、root として行ってください。ノード設定診断スクリプトを開始して、以下のように変更します。

問題 1: net.core.wmem_max は 124928 に設定されていますが、推奨される値は 1048576 です。

sysctl -w net.core.wmem_max=1048576

問題 2: net.core.rmem_max は 124928 に設定されていますが、推奨される値は 8388608 です。

sysctl -w net.core.rmem_max=8388608

問題 3: net.ipv4.ipfrag_low_thresh は 196608 に設定されていますが、推奨される値は 1048576 です。

sysctl -w net.ipv4.ipfrag_low_thresh=1048576

問題 4: net.ipv4.ipfrag_high_thresh は 262144 に設定されていますが、推奨される値は 8388608 です。

sysctl -w net.ipv4.ipfrag_high_thresh=8388608

問題 5: nofileulimit は 1024 に設定されていますが、推奨される値は 4096 です。

Update nofile to be 4096 in /etc/security/limits.conf

問題 6: memlockulimit は 64 に設定されていますが、推奨される値は unlimited です。

Update memlock to be unlimited in /etc/security/limits.conf

service xinetd restart を実行して xinetd を再起動します。

問題 7: per_source/etc/xinetd.conf で 10 に設定されていますが、推奨される値は 80 です。

Change per_source to 80 in /etc/xinetd.conf

service xinetd restart を実行して xinetd を再起動します。

ulimit 関連の設定に従って、/etc/profile の中で ulimit -n 4096 および ulimit -l unlimited を設定します。その後、xinetd サービスを再起動します。

リスト 3. xinetd サービスを再起動する
rpm -i pperte-1.3.0.8-s008a.ppc64.rpm
rpm -i ppe_rte_samples-1.3.0.8-s008a.ppc64.rpm
rpm -i ppertesamples-1.3.0.8-s008a.ppc64.rpm

NetCDF をコンパイルする

loadl としてログインしてから、以降に説明するステップに従います。NetCDF をコンパイルするには、その前に、以下に示すシステム環境変数を有効にする必要があります。

リスト 4. システム環境変数
export CC="xlc_r"
export CFLAGS="-q64 -O3 -qstrict -DIBMR2Fortran"
export CPP="xlc_r -E"
export CXX="xlC_r"
export CXXFLAGS="-q64 -O3 -qstrict"
export CXXCPP="xlC_r -E"
export F77="xlf_r"
export FC="xlf_r"
export F90="xlf90_r"
export FFLAGS="-q64 -O3 -qstrict"

C/C++ コンパイラーとしては xlc_r を使用し、Fortran コンパイラーとしては xlf_r を使用します。この環境変数の設定は、NetCDF (およびその他の関連ライブラリー) から WRF へのコンパイルのすべてに適用する必要があります。そうすることで、WRF の依存ライブラリーが WRF のコンパイルに対応するようになります。そうしなかった場合には、WRF のコンパイル中に依存ライブラリーが呼び出されたときに非対応のエラーが発生してしまいます。

コンパイルされた出力のインストール先フォルダーを指定するには、以下のコードを使用します。

リスト 5. ターゲット・フォルダーでのコンパイル済み出力のインストール
./configure --prefix=/home/loadl/project/netcdf
make
make install

zlib をコンパイルする

以下のリストに示されているステップに従います。

リスト 6. zlib をコンパイルする
./configure --prefix=/home/loadl/project
make
make install

JasPer をコンパイルする

以下のリストに示されているステップに従います。

リスト 7. JasPer をコンパイルする
./configure --prefix=/home/loadl/project
make
make install

libpng をコンパイルする

以下のリストに示されているステップに従います。

リスト 8. libpng をコンパイルする
export LD_LIBRARY_PATH=/home/loadl/project/lib/:$ LD_LIBRARY_PATH
export LDFLAGS="-L/home/loadl/project/lib/ -L/home/loadl/project/netcdf/lib"
 export CPPFLAGS="-I/home/loadl/project/include/ -I/home/loadl/project/netcdf/include"
./configure --prefix=/home/loadl/project
make
make install

WRF をコンパイルする

WRF をコンパイルするための前提条件として、以下の環境変数を有効にする必要があります。

リスト 9. WRF をコンパイルするために環境変数を有効にする
export JASPERLIB=/home/loadl/project/lib
export JASPERINC=/home/loadl/project/include
export WRF_EM_CORE=1
export NETCDF=/home/loadl/project/netcdf

WRF の並列コンピューティング機能を有効にするには、-lmpi を指定した xlc_r および xlf95_r を使用してコンパイルを行います。

WRFV3.5.1.TAR.gz を解凍したら、make ファイルを作成できるようにするために、最初に構成スクリプトを実行します。これによって、多数の変数定義が含まれる configure.wrf ファイルが生成されます。このファイルは make の実行中に読み取られます。

configure を実行します。プラットフォームを選択するよう促されたら、サポートされている以下のプラットフォームのいずれかを選択します。

  1. Linux ppc64 BG /L blxlf compiler with blxlc (dmpar)
  2. Linux ppc64 BG /P xlf compiler with xlc (smpar)
  3. Linux ppc64 BG /P xlf compiler with xlc (dmpar)
  4. Linux ppc64 BG /P xlf compiler with xlc (dm+sm)
  5. Linux ppc64 IBM Blade Server xlf compiler with xlc (dmpar)

POWER8 はまだ新しいため、構成スクリプトが CPU として認識するのは (BlueGene) だけですが、これによってコンパイル結果に影響が出ることはありません。3 番目の選択肢「Linux ppc64 BG /P xlf compiler with xlc (dmpar)」を選択してください。

プラットフォームを選択すると、以下のプロンプトが出されます。

リスト 10. WRF のコンパイル構成での「ネスト用コンパイル」によるプロンプト
Compile for nesting?
   1=basic
   2=preset moves
   3=vortex following 
[default 1]

デフォルトの「1=basic」を選択します。この項目を選択することで、使用中のエディションに対応する構成テンプレート・ファイルが生成されます。configure.wrf ファイルを編集して、以下のようにフィールドを更新します。

リスト 11. 構成ファイルのフィールドを更新する
SFC   =  xlf95_r -q64 -I/opt/ibmhpc/pecurrent/mpich2/gnu/include64 -L/opt/ibmhpc/pecurrent/
         mpich2/gnu/fast/lib64
SCC   =  xlc_r -q64 -I/opt/ibmhpc/pecurrent/mpich2/gnu/include64 -L/opt/ibmhpc/pecurrent/
         mpich2/gnu/fast/lib64
CCOMP =  xlc_r -q64 -I/opt/ibmhpc/pecurrent/mpich2/gnu/include64 -L/opt/ibmhpc/pecurrent/
         mpich2/gnu/fast/lib64
DM_FC =  xlf95_r -q64 -I/opt/ibmhpc/pecurrent/mpich2/gnu/include64 -L/opt/ibmhpc/pecurrent/
         mpich2/gnu/fast/lib64 -lmpi
DM_CC =  xlc_r -q64 -I/opt/ibmhpc/pecurrent/mpich2/gnu/include64 -L/opt/ibmhpc/pecurrent/
         mpich2/gnu/fast/lib64 -DMPI2_SUPPORT –lmpi
CPP   =  /opt/ibm/xlf/15.1.0/exe/cpp -C -P

構成ファイルのフィールドの更新が完了したら、./compile em_real >& compile.log を実行します。これにより、コンパイルが実行されて、デバッグに使用できるようにコンパイル・ログが compile.log に書き込まれます。コンパイルが成功すると、以下の exe ファイルが生成されます。

リスト 12. exe の生成
-bash-4.1$ ll run/*.exe
lrwxrwxrwx 1 loadl loadl 17 Aug 22 07:55 run/ndown.exe -> ../main/ndown.exe
lrwxrwxrwx 1 loadl loadl 15 Aug 22 07:55 run/nup.exe -> ../main/nup.exe
lrwxrwxrwx 1 loadl loadl 16 Aug 22 07:55 run/real.exe -> ../main/real.exe
lrwxrwxrwx 1 loadl loadl 14 Aug 22 07:55 run/tc.exe -> ../main/tc.exe
lrwxrwxrwx 1 loadl loadl 15 Aug 22 07:53 run/wrf.exe -> ../main/wrf.exe

WPS をコンパイルする

WPSV3.5.1.TAR.gz を解凍し、make ファイルを作成するための構成スクリプトを実行します。構成スクリプトを実行すると、プラットフォームを選択するよう求めるプロンプトが出されます。

リスト 13. 構成スクリプトの実行結果
Please select from among the following supported platforms.
    
    1.  Linux ppc64 Power775 xl compilers & MPICH2 comms  (serial)
    2.  Linux ppc64 Power775 xl compilers & MPICH2 comms  (serial_NO_GRIB2)
    3.  Linux ppc64 Power775 xl compilers & MPICH2 comms  (dmpar)
    4.  Linux ppc64 Power775 xl compilers & MPICH2 comms  (dmpar_NO_GRIB2)
    5.  Linux ppc64 BG bglxf compiler with blxlc   (dmpar)
    
Enter selection [1-5] :

3. Linux ppc64 Power775 xl compilers & MPICH2 comms (dmpar)」を選択します。

WPS3.5.1 ではまだ、最新の POWER8 システムを認識することができません。この構成スクリプトによって生成される configure.wps という名前のファイルには、多数の変数定義が含まれます。make の実行中にはこのファイルが読み取られるため、configure.wps 内の WRF 相対パスの値を変更する必要があります。

WRF_DIR                 =       ../../wrf_arw/WRFV3

: wrf_arw/WRFV3 の後にスペースがないようにしてください。スペースがあると、エラーが発生します。

上記のフィールドを以下のように変更します。

リスト 14. フィールドを変更する
CPP                 = /opt/ibm/xlf/15.1.0/exe/cpp -C -P
MPICH2_SYS          = /opt/ibmhpc/pecurrent/mpich2/gnu
MPI_INC             = -I$(MPICH2_SYS)/include64
MPI_LIB             = -L$(MPICH2_SYS)/lib64 –lmpi
FC                  = xlf95_r
SFC                 = xlf95_r
CC                  = mpicc -DMPI2_SUPPORT -DFSEEKO64_OK
CPPFLAGS            = -DAIX -DIBM4 -DIO_NETCDF -DIO_BINARY -DIO_GRIB1 -DBIT32 -D_MPI

変更を保存して、execute ./compile > &compile.log を実行します。これで、コンパイルが開始され、ログが compile.log ファイルに書き込まれます。WPS のコンパイルが完了すると、以下の exe ファイルが生成されます。

リスト 15. コンパイルが成功すると生成される exe
[loadl@tul237p5 WPS]$ ll *.exe
lrwxrwxrwx 1 loadl loadl 23 Aug 12 00:37 geogrid.exe -> geogrid/src/geogrid.exe
lrwxrwxrwx 1 loadl loadl 23 Aug 12 00:37 metgrid.exe -> metgrid/src/metgrid.exe
lrwxrwxrwx 1 loadl loadl 21 Aug 12 00:37 ungrib.exe -> ungrib/src/ungrib.exe

POWER8 上で WRF を実行する

WRF を実行するには、WRF の入力データを用意する必要があります。それには、気象入力データを WPS で前処理しなければなりません。geogrid.exe を実行して地球の静的データを生成し、ungrib.exe を実行して気象入力用の GRIB 気象データをアンパックします。WRF の入力データを生成するには、さらに metgrid.exe を実行して気象データをモデル・ドメイン上で水平方向に補間し、real.exe を実行してモデル座標上でデータを垂直方向に補間します。

図 2. WRF の入力データ生成処理
WRF の入力データ生成の手順を示す図
WRF の入力データ生成の手順を示す図

ungrib.exegeogrid.exemetgrid.exe は単一のプロセスで実行されます。real.exewrf.exe は並列モードで実行されます。つまり、real.exewrf.exe は PE によって対話式で実行されます。

PE で WRF を対話式で実行する方法の例は以下のとおりです。

SMT4 が有効にされている POWER8 システム上では、CPU の数はコア数の 4 倍あります。20 コア搭載の POWER8 システムでは、この例に示すように nmon を使用してシステム・リソースと使用状況をモニターすることをお勧めします。

図 3. nmon ツールによる CPU 情報の読み込み
nmon ツールによる CPU 情報の読み込み画面のスクリーンキャプチャー
nmon ツールによる CPU 情報の読み込み画面のスクリーンキャプチャー

POWER8 チップは登場して間もないため、nmon はそのモデルを正しく認識することができませんが、CPU 周波数 (4.1GHz) と SMT 値 (SMT=4) を読み込むことはできます。

MP_TASK_AFFINITY=core が設定されている場合、並列タスクの最大数は、合計コア数と同じです。したがって、この 20 コアの POWER8 環境では、並列タスクの最大数は 20 となります。

MP_TASK_AFFINITY=cpu が設定されている場合、並列タスクの最大数は、合計 CPU 数と同じです。したがって、この 20 コアの POWER8 (SMT4) 環境では、並列タスクの最大数は 80 となります。

poe コマンドは PE の主要な実行プログラムです。並列コンピューティング・タスクを呼び出すには、このコマンドを使用します。poe は、hostfile オプションに指定するファイルが必要です。このファイルは、このホスト上で使用可能な合計 CPU リソースを記述するために使用されます。このファイルには host.list という名前を付けて、各行に <ホスト名>*<数> という形でリソースを記述することができます。以下はその一例です。

myhost01*20
myhost02*10

この例では、host.list の内容を myhost*80 として設定しています。

次に、以下の poe コマンドを使用して WRF の並列コンピューティングを開始します。

poe /home/loadl/project/wrf.exe -hostfile /home/loadl/project/host.list –procs 78

-procs 78 は、合計 78 の並列タスクが開始されることを意味します。この数は、hostfile オプションとして指定するファイルに記述されている合計リソース数より少なくなければなりません。

MP_TASK_AFFINITY=core を設定したにも関わらず、78 の並列タスクを開始しようとすると、以下のようなエラーが発生します。

ERROR: 0031-758 AFFINITY: Oversubscribe: 78 tasks in total, each task requires 1 resource, but there are only 20 available resource. Affinity can not be applied. (エラー: 0031-758 AFFINITY: オーバーサブスクライブ: 合計 78 タスクの各タスクに 1 リソースが必要ですが、使用可能なリソースは 20 しかありません。アフィニティーを適用できません。)

ERROR: 0031-161 EOF on socket connection with node myhost (エラー: 0031-161 myhost ノードとのソケット接続での EOF)

1 つの WRF ドメイン・モデルに対して、20 コア搭載 POWER8 ボックス上で設定をいろいろと変えてテストしてみました。その結果、以下のことがわかりました。

  • MP_TASK_AFFINITY=cpu および procs=78 を設定することで、最大のパフォーマンスを得ることができます。WRF 実行中の CPU 使用率は以下のようになります。
    図 4. MP_TASK_AFFINITY=cpu および procs=78 を設定した場合の CPU 使用率
    MP_TASK_AFFINITY=cpu および procs=78 を設定した場合の CPU 使用率を示す画面のスクリーンキャプチャー
    MP_TASK_AFFINITY=cpu および procs=78 を設定した場合の CPU 使用率を示す画面のスクリーンキャプチャー
  • MP_TASK_AFFINITY=cpu および procs=80 を設定すると、すべての CPU リソースが使用されることになりますが、パフォーマンスは低下します。なぜなら、I/O 管理が委任される CPU リソースがなくなるためです。これは、全体的なパフォーマンスに影響を及ぼします。
  • MP_TASK_AFFINITY=core および procs = 20 は悪くない設定ですが、MP_TASK_AFFINITY=cpu を設定した場合に比べるとパフォーマンスに劣ります。WRF 実行中の CPU 使用率は以下の出力のようになります。
    図 5. MP_TASK_AFFINITY=core を設定した場合の CPU 使用率
    MP_TASK_AFFINITY=core を設定した場合の CPU 使用率を示す画面のスクリーンキャプチャー
    MP_TASK_AFFINITY=core を設定した場合の CPU 使用率を示す画面のスクリーンキャプチャー

まとめ

このチュートリアルでは、基本的な WRF (Weather Research and Forecasting) モデルをコンパイルして POWER8 システム上で実行する方法を説明しました。WRF の並列コンピューティングは、XL C/Fortran コンパイラーと POWER8 CPU によってサポートされます。POWER8 CPU を使用することで、気象予測のプロセスに要する時間が短縮され、より大きなビジネス価値が生み出されます。


ダウンロード可能なリソース


関連トピック


コメント

コメントを登録するにはサインインあるいは登録してください。

static.content.url=http://www.ibm.com/developerworks/js/artrating/
SITE_ID=60
Zone=Linux
ArticleID=998146
ArticleTitle=IBM POWER8 システム上で Weather Research and Forecasting をコンパイルして実行する
publish-date=02262015