#topicpath
// WRF Install インストール 領域モデル
** WRF Ver. 3.4.1 と Ver. 3.5 のインストール [#i4bc8d56]

 導入についての個人的なまとめ
 
   Debian/GNU Linux の標準的なパッケージだけで簡単に並列処理で動作するので、Intel のコンパイラなど、Debian 
   非標準のコンパイラでライブラリを作り直す気が失せてしまった。また、MPI よりも SMP の方が少しだけ速いし、
   実行のしかたもちょっとだけ簡単で、1,2次元の計算にも対応している。MPI が推奨されていたりするけれど、特に
   問題が発生しなければ gfortran で SMP (smpar) を使うことになると思う。

 使ったWRFのバージョン:Ver. 3.4.1, 3.5
   必要に応じてバージョンによる違いについてコメントした。

-- 目次
--- [[WRF導入準備>./#e1642ebc]]
--- [[ダウンロード>./#o958ed1c]]
--- [[コンパイルから試しの実行まで( gfortran serial -並列処理を用いない-で )>#g20817e2]]
--- [[コンパイルから試しの実行まで( gfortran dmpar -MPIによる並列化- で )>#rb89dc39]]
--- [[コンパイルから試しの実行まで( gfortran smpar -SMPによる並列化- で )>#j340ce66]]
--- [[最適化あれこれ>#ae8f0816]]~
~
※ なお、詳細な情報は WRF の [[ARWの User's Guide>http://www.mmm.ucar.edu/wrf/users/docs/user_guide_V3/ARWUsersGuideV3.pdf]] のChapter 1,2,4,5 に書いてあるので、必要に応じて参照のこと。~
※ WRF を使う上での色々は、[[こちら(領域気象モデルのページ)>../]] を参照のこと。~
~
*** WRF 導入準備 [#e1642ebc]
++ 手元のハードウエア環境~
--- CPU~
AMD Phenom(tm) II X6 1065T Processor : 6コア, 2.90 GHz~
~
※ CPU を含むパソコン本体価格は、44,380 円。~
※ Phenom II X6 は、6つのコアそれぞれに浮動小数点演算ユニットを持っている([[情報源>http://www.amd.com/jp/products/desktop/processors/phenom-ii/Pages/phenom-ii-key-architectural-features.aspx]])。~
※ その後のAMDのCPUであるFX-8350は、8コアである。しかし、浮動小数点ユニットは、2つのコアで共用しているので、全体で4つしかない([[例えばここ>http://pc.watch.impress.co.jp/docs/topic/feature/20121023_567804.html]])。~
~
// ※ 地球シミュレータとか、どこかの超並列コンピュータを使うのでないなら、~
//   AMD の 8コアの汎用品を使うのがコストパフォーマンス面でいいと思われる。~
//   参考1 : [[kakaku.comで検索した8コア以上5万円までのCPU一覧>http://kakaku.com/pc/cpu/itemlist.aspx?pdf_Spec306=8-16&pdf_so=p1&pdf_pr=-50000]]~
//   参考2 : [[DOS/Vパラダイスの8コアCPU搭載>http://www.dospara.co.jp/5shopping/detail_prime.php?mc=3715&sn=480&tg=&tc=&ft=AMD+FX-83]] Ge Force GTX650搭載 8万円ちょっと~
// ※ しかし、インテルの方が浮動小数点演算が速いらしい。価格、消費電力といった総合判断は別かもしれない。~
//   参考  : [[PC Watch記事>http://pc.watch.impress.co.jp/docs/topic/feature/20121023_567804.html]]~
// ~
--- GPGPU~
Nvidia "Geforce GTX 660" with compute capability 3.0~
※ 装着しているが今のところ使っていない。~
~
++ 並列処理について~
~
並列処理が行われると格段にスピードが向上するので、並列処理に関わる情報はある程度知っておく必要がある。あきらめて、少しだけ勉強した。~
~
近年のコンピュータは、1つの CPU(中央演算処理装置)の中に複数のコア(実際に演算する装置)が埋め込まれていることが多い上に、~
ネットワークを介して複数のコンピュータで仕事を分散して計算することが多い。計算機の処理速度が上がっているのは、主として~
複数の演算処理装置を同時に動かす技術「並列処理」の発達に支えられている。~
~
ところが、並列処理は、そもそも複雑な操作を行いながらの最適化であるので、何が最適かはハードウエア側の事情によって変わっ~
てくる。そこで、並列処理には、いくつかのハードウエアのモデルを想定し、そのモデルに沿った並列処理用のソフトウエアを用意~
している(多分)。WRFのような複雑で計算量の多い計算ソフトは、あらかじめ、複数の並列処理方法に配慮してプログラムされている。~
具体的には次の三つである。ただし、最後の GPGPU は正式にはサポートされていないし、また、これらの名称は並列で述べられる~
ような概念ではないことに注意が必要である(具体的には、SPMとMPIは組み合わせて利用できる)。~
~
--- &color(darkred){MPI}; (Message Passing Interface)~
ネットワークを介しても並列できるような分散処理のためのソフトウエア。~
Debian の場合、OpenMPI と MPICH2 がある。以下では OpenMPI を使う。~
~
--- &color(darkred){SMP}; (Symmetric Multiprocessing)~
メモリを共有する複数の CPU がある時の並列処理。~
Debian の場合、コンパイラである gcc にその機能が組み込まれている他、libgomp を利用する。~
こちらは OpenMP と呼ばれていて、上述の全く別物の OpenMPI と紛らわしい。~
&color(red){※ 現有計算機環境下での結論は SMP(OpenMP) を使うことである。};~
~
--- &color(darkred){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]]は期待を持たせる。~
~
++ ソフトウエア環境~
Debian GNU/Linux (squeeze) で、主な導入済みパッケージは次のとおり。(この他にもインストールが必要なものがあるかもしれません。)~
Debian GNU/Linux (wheezy) では、&color(red){パッケージ名が変わっているもの};があります。&color(red){赤色};で示しました。
Debian GNU/Linux (wheezy) でも動くようです。ただし、&color(red){パッケージ名が変わっているもの};があります。表に&color(red){赤色};で示しました。
#style(class=table_left)

| 用途| パッケージ名 | wheezyのバージョン| squeezeのバージョン | 説明 |h
|全般 | | | | |
| | gfortran                                              |4:4.7.2-1|4:4.4.5-1|                                             The GNU Fortran 95 compiler|
| | gcc                                                   |4:4.7.2-1|4:4.4.5-1|                                             The GNU C compiler|
| | libnetcdf-dev                                         |1:4.1.3-6+b1|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|
| | &color(red){libnetcdfc7};                                            |1:4.1.3-6+b1|-|                                             An interface for scientific data access to large binary data|
| | &color(red){libnetcdff5};                                        |1:4.1.3-6+b1|-|                                             An interface for scientific data access to large binary data|
| | csh                                                   |20110502-2|20070713-2|                                            Shell with C-like syntax, standard login shell on BSD systems|
|dmpar (MPIを使う場合。Distributed Memory Parallel) | | | | |
| |libopenmpi-dev                                        |1.4.5-1|1.4.2-4|                                               high performance message passing library -- header files|
| |libopenmpi1.3                                         |1.4.5-1|1.4.2-4|                                               high performance message passing library -- shared library|
| |openmpi-bin                                           |1.4.5-1|1.4.2-4|                                               high performance message passing library -- binaries|
| |openmpi-checkpoint                                    |1.4.5-1|1.4.2-4|                                               high performance message passing library -- checkpoint support|
| |openmpi-common                                        |1.4.5-1|1.4.2-4|                                               high performance message passing library -- common files|
|smpar (SMPを使う場合。Shared Memory Parallel) | | | | |
| |&color(red){libgomp1:amd64};                                            |4.7.2-5|-|                                               GCC OpenMP (GOMP) support library|
| |libgomp1                                              |-|4.4.5-8|                                               GCC OpenMP (GOMP) support library|
#clear
~
~
++ コンパイラの選択~
~
--- gfortran を選択~
WRF を Linux 上で動作させるとき、標準でサポートされているコンパイラは、PGI, Intel, Pathscale, gfortran である。~
このうち、無料で利用できるのは Intel と gfortran であり、さらに、「何の対価もなくプログラム開発するときだけ無償」~
とする Intel のコンパイラは使えない。そこで gfortran を使うことになる。~
~
なお、Ver. 3.5 では、コンパイル時に次のようなメッセージが現れる。
 
 ************************** W A R N I N G ************************************
  
 There are some Fortran 20003 features in WRF that your compiler does not recognize
 The IEEE signaling call has been removed.  That may not be enough.
  
 *****************************************************************************
gfortran が Fortran 2003(20003 というのは次々に現れる規格への皮肉?) に全て対応していないので、うまくいかないかもしれないよ!というメッセージである。~
とりあえず動いているし、Ver 3.4.1 と変わらないようなので、このまま使いつづけることにする。~
~
--- その他の情報とコメント~
・コンパイラを変更すると、OpenMPI などのライブラリも同じコンパイラでコンパイルしなおす必要がある。~
・標準的な Debian の環境で WRF を並列処理できるので、環境を破壊してまで他のコンパイラを使う必要性を感じなくなった。~
・フリーで Open64 というコンパイラの選択肢もある。しかし、情報が極端に少ない。[[ここ>http://devgurus.amd.com/message/1285636#1285636]]の一番最後に、Open64 用の configure.wrf がある。~
~
~
// 現在、Fortran は過去の言語となりつつあり、高性能なコンパイラの選択肢は限られる。まして、~
// 入手価格が低廉であるか、またはゼロであるようなコンパイラは極めて限られてくる。~

*** ダウンロード [#o958ed1c]
-- ユーザー登録~
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)~
--- &color(darkred){ARW}; : &color(red){A};dvanced &color(red){R};esearch &color(red){W};RF~
力学計算や放射計算などが組み込まれたソースプログラムであり、WRF の中核的なプログラムである。~
[[UCAR/NCAR の研究部門>http://www.mmm.ucar.edu/]] で開発されている研究目的用のプログラムである。~
~
--- &color(darkred){NMM}; : &color(red){N};onhydrostatic &color(red){M};esoscale &color(red){M};odel~
こちらも力学計算や放射計算などが組み込まれた WRF の中核的なプログラムである。~
[[NOAA>http://www.noaa.gov/]]と[[NCEP>http://www.ncep.noaa.gov/]]が開発している。ホームページは[[こちら>http://www.dtcenter.org/wrf-nmm/users/]]になっていて、ここで述べる ARW とは別に管理されている。~
現業用であり、研究目的には上記の ARW がよく使われるようであるので、ここでも NMM ではなく ARWを用いる。~
~
--- &color(darkred){WPS}; : WRF Preprocessor System~
現実のデータを ARW に与えるための前処理プログラム。
理想的な地形、簡単な初期条件を用いて計算する場合には不必要である。~
~
--- &color(darkred){WRF-DA}; : WRF Data Assimilation~
データ同化システムのようである。詳しくはわからない。~
~
--- &color(darkred){WRF-Chem}; : ~
大気中の化学物質の輸送を計算するプログラムのようである。詳しくはわからないが、現在は ARW に組み込んで使うようだ。~
~
--- &color(darkred){Post-Processing Software}; : ~
WRF から出力されたものを図にするためのソフトウエア~
~
--- &color(darkred){Utilities}; : ~
その他の補助的なソフトウエア~
~
-- 理想化実験を行う際にダウンロードすべきもの~
--- ARW~
ソフトウエアの種類は上述のとおりなので、とりあえず必要なのは、ARW。~
[[ダウンロードのページ>http://www.mmm.ucar.edu/wrf/users/download/get_sources.html#V341]] から ARW をダウンロードする。~
サイズは概ね次の通り。~
・Ver. 3.4.1 : 28MB程度~
・Ver. 3.5  : 38MB程度~
~
--- Post-Processing Software~
描画などの後処理をする場合。とりあえずコンパイルできること、実行できることを確かめるためには、ARW だけでよい。~
(更新 : 2013-03-25 (月) 14:41:27)~
~
-- 更新ファイル~
--- Ver. 3.4.1 の場合~
いくつかの必要な更新ファイルが出ている(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 では実行する度にソースツリーが変更される。そこで、更新ファイルを適用したソースツリーを別途保存しておくと便利である。~
~
--- Ver. 3.5 の場合~
今のところ更新は無い。~
(更新 : 2013-04-30 (火) 19:06:25)~
~
-- Ver. 3.4.1 と Ver. 3.5 の違い
--- ソフトウエアそのものの違い~
更新された部分については、[[ここ>http://www.mmm.ucar.edu/wrf/users/wrfv3.5/updates-3.5.html]]に詳しく書いてある。
--- テストケースの違い(理想化実験では違いなし)~
WRF(ARW)には、計算例としていくつかの設定ファイルが用意されている。それらは、次のような場所にある。~
&color(red){理想化実験については};、これらの設定ファイルの変更はなく、同じように実行できることを意味している。~
・ dyn_em/module_initialize_*.F~
・ test ディレクトリ~
~
*** コンパイルから試しの実行まで( gfortran serial -並列処理を用いない- で ) [#g20817e2]
   ※ 計測した時間は Ver. 3.4.1 で計測したもの。
++ 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
~
なお、選べるサンプルプログラムは次の通り。~
#style(class=table_left)
| 次元 | ケースの名称        | 設定                                       |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                             |
#clear
~
~
++ 実行
 -> 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)~
~
*** コンパイルから試しの実行まで( gfortran dmpar -MPIによる並列化- で ) [#rb89dc39]
   ※ 計測した時間は Ver. 3.4.1 で計測したもの。
++ 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)~
~
*** コンパイルから試しの実行まで( gfortran smpar -SMPによる並列化- で ) [#j340ce66]
   ※ 計測した時間は Ver. 3.4.1 で計測したもの。
++ configure~
コンパイラとして gfortran を選ぶ。また、CPU の複数コアを用いる OpenMP(SMP) を利用するとして、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]
   ※ 計測した時間は Ver. 3.4.1 で計測したもの。
-- コンパイルの並列化~
~
./compile を実行する前に
 -> export J="-j 5"
などとすると、コンパイルを並行して実行してくれる。ただし、あまり効果を期待してはいけないようだ。~
~
-- 1D, 2D の計算~
~
SMPAR(Shared Memory Parallel) は 1D と 2D の計算にも対応しているようである。em_seabreeze2d_x を実行した結果。コア数は5とした。
    real	3m27.437s
    user	16m48.059s
    sys	0m18.617s
劇的ではないが、serial の時より、若干速い。~
~
-- 最適化オプション~
~
gcc や gfortran には様々なオプションがある。このうち、手元のマシンに適合したオプションをつけることで~
パフォーマンスが向上するか調べた。方法としては、./configure した後に、configure.wrf を編集し、 "-O3"とか"-O2"~
と書いてある場所の後(2箇所)にオプションを追加すればよい。("-O2" は "-O3" に変更してもいいかもしれない。)~
その他の条件は、gfortran の smpar で共通で、3D の em_b_wave を実行した。コア数は5 (export OMP_NUM_THREADS=5)。~
オプションを追加した時の結果を示す。~
~
・最適化オプションを追加しない場合~
    real	3m13.938s
    user	15m12.773s
    sys	0m28.894s
~
・&color(darkred){-march=amdfam10}; をつけた場合~
 (CPUのタイプを特定して最適化)~
    real	3m11.984s
    user	15m1.412s
    sys	0m29.902s
 ちょっと速くなる。
~
・&color(darkred){-march=amdfam10 -msse4a}; をつけた場合~
 (さらに SSE という仕組みで浮動小数点演算を効率化)~
    real	3m10.386s
    user	14m55.420s
    sys	0m29.230s
 非常に微妙なパフォーマンスの改善である。~
~
・&color(darkred){-march=amdfam10 -msse4a -mfpmath=sse}; をつけた場合~
 (さらに小数点の扱いを SSE に適したものに)~
    real	3m12.716s
    user	15m4.077s
    sys	0m29.610s
 遅くなる意味がわからない。~
~
・&color(darkred){-march=native -msse4a}; をつけた場合~
 (CPUのタイプをコンパイラに選ばせる)
    real	3m10.787s
    user	14m57.172s
    sys	0m29.610s
 これで十分なようだ。~
(更新 : 2013-03-28 (木) 17:01:48)

トップ   編集 差分 添付 複製 名前変更 リロード   新規 検索 最終更新   ヘルプ   最終更新のRSS