#topicpath ** WRF の導入 [#i4bc8d56] 導入についての個人的なまとめ Debian/GNU Linux の標準的なパッケージだけで簡単に並列処理で動作するので、Intel のコンパイラなど、Debian 非標準のコンパイラでライブラリを作り直す気が失せてしまった。また、MPI よりも SMP の方が少しだけ速いし、 実行のしかたもちょっとだけ簡単で、1,2次元の計算にも対応している。MPI が推奨されていたりするけれど、特に 問題が発生しなければ gfortran の smpar で使うことになると思う。 *** WRF 導入準備 [#e1642ebc] + 導入の前に ++ 並列処理について~ ~ 並列処理が行われると格段にスピードが向上するので、並列処理に関わる情報はある程度知っておく必要がある。あきらめて、少しだけ勉強した。~ ~ 近年のコンピュータは、1つの CPU(中央演算処理装置)の中に複数のコア(実際に演算する装置)が埋め込まれていることが多い上に、~ ネットワークを介して複数のコンピュータで仕事を分散して計算することが多い。計算機の処理速度が上がっているのは、主として~ 複数の演算処理装置を同時に動かす技術「並列処理」の発達に支えられている。~ ~ ところが、並列処理は、そもそも複雑な操作を行いながらの最適化であるので、何が最適かはハードウエア側の事情によって変わっ~ てくる。そこで、並列処理には、いくつかのハードウエアのモデルを想定し、そのモデルに沿った並列処理用のソフトウエアを用意~ している(多分)。WRFのような複雑で計算量の多い計算ソフトは、あらかじめ、複数の並列処理方法に配慮してプログラムされている。~ 具体的には次の三つである。ただし、最後の GPGPU は正式にはサポートされていないし、また、これらの名称は並列で述べられる~ ような概念ではないことに注意が必要である。~ ~ --- MPI (Message Passing Interface)~ ネットワークを介しても並列できるような分散処理のためのソフトウエア。~ Debian の場合、OpenMPI と MPICH2 がある。以下では OpenMPI を使う。~ ~ --- SMP (Symmetric Multiprocessing)~ メモリを共有する複数の CPU がある時の並列処理。~ Debian の場合、コンパイラである gcc にその機能が組み込まれている他、libgomp を利用する。~ こちらは OpenMP と呼ばれていて、上述の全く別物の OpenMPI と紛らわしい。~ ~ --- GPGPU (General-purpose computing on Graphics Processing Unit)~ グラフィックス用の演算処理装置を一般の数値計算に利用すること。WRF は基本的には対応していない。~ ~ ※ [[ここ>http://www.nvidia.co.jp/object/weather_jp.html]]の記述を見ると、一見、GPGPU は圧倒的なパフォーマンスを示しているように見える。~ しかし、よく見ると、Micro Physics のプログラムについてであり、全体のパフォーマンスは 1.25倍であるときちんと書いてある。~ 現時点では、WRF 全体で速くなることはほとんどなさそうである。~ ~ ※ ただし、[[Smiling Life の記事>http://blog.livedoor.jp/rootan2007/archives/51411320.html]]は期待を持たせる。~ ~ ++ ハードウエア環境~ --- CPU~ AMD Phenom(tm) II X6 1065T Processor : 6コア, 2.90 GHz~ ~ --- GPGPU~ Nvidia "Geforce GTX 660" with compute capability 3.0~ ※ 今のところ使っていない。~ ~ ++ ソフトウエア環境~ Debian GNU/Linux (squeeze) で、主な導入済みパッケージは次のとおり。~ | 用途| パッケージ名 | バージョン | 説明 |h |全般 | | | | | | gfortran |4:4.4.5-1| The GNU Fortran 95 compiler| | | gcc |4:4.4.5-1| The GNU C compiler| | | libnetcdf-dev |1:4.1.1-5| Development kit for NetCDF| | | libnetcdf6 |1:4.1.1-5| An interface for scientific data access to large binary data| | | csh |20070713-2| Shell with C-like syntax, standard login shell on BSD systems| |dmpar (MPIを使う場合。Distributed Memory Parallel) | | | | | |libopenmpi-dev |1.4.2-4| high performance message passing library -- header files| | |libopenmpi1.3 |1.4.2-4| high performance message passing library -- shared library| | |openmpi-bin |1.4.2-4| high performance message passing library -- binaries| | |openmpi-checkpoint |1.4.2-4| high performance message passing library -- checkpoint support| | |openmpi-common |1.4.2-4| high performance message passing library -- common files| |smpar (SMPを使う場合。Shared Memory Parallel) | | | | | |libgomp1 |4.4.5-8| GCC OpenMP (GOMP) support library| ~ ~ ++ コンパイラの選択~ ~ WRF を Linux 上で動作させるとき、標準でサポートされているコンパイラは、PGI, Intel, Pathscale, gfortran である。~ このうち、無料で利用できるのは Intel と gfortran であり、さらに、「何の対価もなくプログラム開発するときだけ無償」~ とする Intel のコンパイラは使えない。そこで gfortran を使うことになる。~ ~ その他の情報とコメント~ --- コンパイラを変更すると、OpenMPI などのライブラリも同じコンパイラでコンパイルしなおす必要がある。 --- 標準的な Debian の環境で WRF を並列処理できるので、環境を破壊してまで他のコンパイラを使う必要性を感じなくなった。 --- フリーで Open64 というコンパイラの選択肢もある。しかし、情報が極端に少ない。[[ここ>http://devgurus.amd.com/message/1285636#1285636]]の一番最後に、Open64 用の configure.wrf がある。~ ~ ~ // 現在、Fortran は過去の言語となりつつあり、高性能なコンパイラの選択肢は限られる。まして、~ // 入手価格が低廉であるか、またはゼロであるようなコンパイラは極めて限られてくる。~ + ソースプログラムの取得 ++ ユーザー登録~ WRF は無償で手に入れることができる。しかし、ユーザー登録は必要である。~ http://www.mmm.ucar.edu/wrf/users/download/get_source.html にアクセスしてユーザー登録をする。~ 二度目からは、Returning User をクリックすれば、メールアドレスを入力するだけでダウンロードページへつながる。~ (更新 : 2013-03-25 (月) 14:11:54)~ ~ ++ プログラムの種類~ WRF を利用するために、ソースプログラムをダウンロードしようとすると、いくつかの種類のファイルに分かれている~ ことに気づいて戸惑う。これらのソースプログラムはそれぞれ役割がある。(更新 : 2013-03-25 (月) 14:41:27)~ --- ARW : Advanced Research WRF~ 力学計算や放射計算などが組み込まれたソースプログラム。WRF の中核的なプログラム。~ ~ --- WPS : WRF Preprocessor System~ 現実のデータを ARW に与えるための前処理プログラム。 理想的な地形、簡単な初期条件を用いて計算する場合には不必要である。~ ~ --- WRF-DA : WRF Data Assimilation~ データ同化システムのようである。詳しくはわからない。~ ~ --- WRF-Chem : ~ 大気中の化学物質の輸送を計算するプログラムのようである。詳しくはわからないが、現在は ARW に組み込んで使うようだ。~ ~ --- Post-Processing Software : ~ WRF から出力されたものを図にするためのソフトウエア~ ~ --- Utilities : ~ その他の補助的なソフトウエア~ ~ ++ ダウンロード~ --- 本体~ ソフトウエアの種類は上述のとおりなので、とりあえず必要なのは、ARW と Post-Processing Software である。~ とりあえずコンパイルできること、実行できることを確かめるためには、ARW だけでよい。~ http://www.mmm.ucar.edu/wrf/users/download/get_sources.html#V341 から ARW をダウンロードする。~ 現時点で、Ver 3.4.1 が最新である。30MB 弱の大きさである。~ (更新 : 2013-03-25 (月) 14:41:27)~ ~ --- 更新ファイル~ いくつかの必要な更新ファイルが出ている(cf. [[Known Problems>http://www.mmm.ucar.edu/wrf/users/wrfv3.4/known-prob-3.4.1.html]])。~ 対策のとられた日付けが、Ver 3.4.1 のリリースの日(2012年8月16日)よりも前であっても安心してはいけない。~ それほど親切ではないので、確認しながら自分で対策をとる。具体的にはファイルをダウンロードして入れ換える。~ 今回の場合( module_mp_radar.F と input_wrf.F )は、全体にあまり影響を与えないように思われるが、気持ちよくするために入れ換える。~ ~ また、WRF では実行する度にソースツリーが変更される。そこで、入れ換えた状態のソースツリーを別途保存しておく。~ (更新 : 2013-03-25 (月) 14:58:36)~ ~ ~ *** WRF 試しの実行まで( gfortran serial で ) [#g20817e2] ++ configure~ コンパイラとして gfortran を選ぶ。また、CPU は一つのコアだけを用いるとして、serial を選択する。~ 実際の入力と出力結果は次の通り。&color(red){->};は入力に関係した行であることを意味する。~ -> [localhost] ~/WRFV3 15:34:15 $ ./configure checking for perl5... no checking for perl... found /usr/bin/perl (perl) ** WARNING: No path to NETCDF and environment variable NETCDF not set. ** would you like me to try to fix? [y] -> y Enter full path to NetCDF include directory on your system -> /usr/include Enter full path to NetCDF library directory on your system -> /usr/lib ...(中略) ------------------------------------------------------------------------ Please select from among the following supported platforms. 1. Linux x86_64, PGI compiler with gcc (serial) ...(中略) 23. x86_64 Linux, gfortran compiler with gcc (serial) ...(中略) -> Enter selection [1-34] : 23 ------------------------------------------------------------------------ -> Compile for nesting? (0=no nesting, 1=basic, 2=preset moves, 3=vortex following) [default 0]: 0 Configuration successful. To build the model type compile . ...(以下省略) (更新 : 2013-03-25 (月) 15:48:29)~ ~ ++ compile~ 具体的に実行可能プログラムを作るには、compile コマンドを実行する。 -> ./compile すると、こんな理想化条件が実行できます、というメッセージが出てくるので、2次元の海陸風モデルを選んで実行する。 -> ./compile em_seabreeze2d_x 結構な時間をかけてコンパイルすることになる。一番最後に、コンパイルの所要時間が表示された。 build started: 2013年 3月 25日 月曜日 15:46:02 JST build completed: 2013年 3月 25日 月曜日 15:57:42 JST ~ なお、選べるサンプルプログラムは次の通り。~ | 次元 | ケースの名称 | 設定 |h | 1 | em_scm_xy | single column model, 4 km, full physics | | | | | | 2 | em_grav2d_x | gravity current, 100 m | | 2 | em_hill2d_x | flow over a hill, 2 km | | 2 | em_seabreeze2d_x | water and land, 2 km, 20km top, full physics | | 2 | em_squall2d_x | squall line, 250 m | | 2 | em_squall2d_y | transpose of above problemINITIALIZATION | | | | | | 3 | em_b_wave | baroclinic wave, 100 km | | 3 | em_fire | surface fire, 50 m | | 3 | em_heldsuarez | global case with polar filtering, 625 km | | 3 | em_les | large eddy simulation, 100 m | | 3 | em_quarter_ss | super cell, 2 km | | 3 | em_tropical_cyclone | hurricane, 15 km | ~ ~ ++ 実行 -> cd test/em_seabreeze2d_x -> csh ./run_me_first.csh -> ./ideal.exe -> time ./wrf.exe 最後に d01 2007-06-01_17:00:00 wrf: SUCCESS COMPLETE WRF と表示されて実行も終了。time で測った所要時間は次のとおり。 real 4m59.360s user 4m50.266s (更新 : 2013-03-25 (月) 16:15:02)~ ~ *** WRF 試しの実行まで( gfortran dmpar で ) [#g20817e2] ++ configure~ コンパイラとして gfortran を選ぶ。また、CPU の複数コアを用いる MPI を利用するとして、dampr を選択する。~ 実際の入力と出力結果(ほとんど省略)~ -> [localhost] ~/WRFV3 15:34:15 $ ./configure ...(中略) ------------------------------------------------------------------------ Please select from among the following supported platforms. 1. Linux x86_64, PGI compiler with gcc (serial) ...(中略) 25. x86_64 Linux, gfortran compiler with gcc (dmpar) ...(中略) -> Enter selection [1-34] : 25 ------------------------------------------------------------------------ ...(以下省略) ~ ++ compile~ 2次元の海陸風モデルは、MPIに対応していない。そこで、3次元の傾圧不安定波を選んで実行する。 -> ./compile em_b_wave 結構な時間をかけてコンパイルすることになる。一番最後に、コンパイルの所要時間が表示された。 build started: 2013年 3月 25日 月曜日 17:19:28 JST build completed: 2013年 3月 25日 月曜日 17:31:53 JST ~ ++ 実行 -> cd test/em_b_wave -> csh ./run_me_first.csh -> mpirun -n 5 ./ideal.exe -> time mpirun -n 5 ./wrf.exe ログは表示されない。mpirun を使って実行するところがミソ。この場合、5個のコアを使っている。time で測った所要時間は次のとおり。 real 3m21.428s user 16m32.850s sys 0m2.952s 同じプログラムを serial で実行すると、dmpar では2〜3倍の速さで動いていることがわかる。 real 9m19.641s user 9m2.306s sys 0m14.033s (更新 : 2013-03-25 (月) 18:37:30)~ ~ *** WRF 試しの実行まで( gfortran smpar で ) [#j340ce66] ++ configure~ コンパイラとして gfortran を選ぶ。また、CPU の複数コアを用いる OpenMP を利用するとして、sampr を選択する。~ 実際の入力と出力結果(ほとんど省略)~ -> [localhost] ~/WRFV3 15:34:15 $ ./configure ...(中略) ------------------------------------------------------------------------ Please select from among the following supported platforms. 1. Linux x86_64, PGI compiler with gcc (serial) ...(中略) 24. x86_64 Linux, gfortran compiler with gcc (smpar) ...(中略) -> Enter selection [1-34] : 24 ------------------------------------------------------------------------ ...(以下省略) ~ ++ compile~ 3次元の傾圧不安定波を選んで実行する。 -> ./compile em_b_wave ...(中略) build started: 2013年 3月 28日 木曜日 12:17:18 JST build completed: 2013年 3月 28日 木曜日 12:28:56 JST ~ ++ 実行~ 環境変数 OMP_NUM_THREADS でコアの数を与えるのがミソ。 -> cd test/em_b_wave -> csh ./run_me_first.csh -> export OMP_NUM_THREADS=5 -> ./ideal.exe -> time ./wrf.exe ...(中略) real 3m13.938s user 15m12.773s sys 0m28.894s ~ serial で実行するよりも、2〜3倍の速い。~ (更新 : 2013-03-28 (木) 14:43:09)~ ~ *** 最適化あれこれ [#ae8f0816] ~ -- コンパイルの並列化~ ~ ./compile を実行する前に -> export J="-j 5" などとすると、コンパイルを並行して実行してくれる。ただし、あまり効果を期待してはいけないようだ。~ ~ -- 1D, 2D の計算~ ~ SMPAR は 1D と 2D の計算にも対応しているようである。em_seabreeze2d_x を実行した結果。コア数は5とした。 real 3m27.437s user 16m48.059s sys 0m18.617s 劇的ではないが、serial の時より、若干速い。~ ~ -- 最適化オプション~ ~ gcc や gfortran には様々なオプションがある。このうち、手元のマシンに適合したオプションをつけることでパフォーマンスが向上するか調べた。~ なお、方法としては、./configure した後に、configure.wrf を編集し、 "-O3" と書いてある場所の後にオプションを追加すればよい。~ その他の条件は、gfortran の smpar で共通で、3D の em_b_wave を実行した。~ オプションを追加した時の結果を示す。~ ~ ・-march=amdfam10 をつけた場合~ (CPUのタイプを特定して最適化)~ real 3m11.984s user 15m1.412s sys 0m29.902s ちょっと早くなる。 ~ ・-march=amdfam10 -msse4a をつけた場合~ (さらに SSE という仕組みで浮動小数点演算を効率化)~ real 3m10.386s user 14m55.420s sys 0m29.230s 非常に微妙なパフォーマンスの改善である。~ ~ ・-march=amdfam10 -msse4a -mfpmath=sse をつけた場合~ (さらに小数点の扱いを SSE に適したものに)~ real 3m12.716s user 15m4.077s sys 0m29.610s 遅くなる意味がわからない。~ ~ ・-march=native -msse4a をつけた場合~ (CPUのタイプをコンパイラに選ばせる) real 3m10.787s user 14m57.172s sys 0m29.610s これで十分なようだ。~ (更新 : 2013-03-28 (木) 17:01:48)