スパコン雑記。スカラー版。
スパコンの最大の利点である並列化を行う際のノウハウ。
時代の流れはスカラーらしい。俺たちもスカラー中心でいくべき!?
「なんじゃこりゃ?」って単語があったら一度「
用語解説」をご覧あれ。
使用スパコンのスペック
スカラー:Express5800/i120Rg-1
CPU:1(Core:2)
CPU性能:921.6GFlops(12.8GF×72)
メモリ:2GB
ノード数:72
OS:Cent OS 4.5
コンパイラ:PGI
ライブラリ性能解析ツール:ACML(PGI Server Bundle),PGI Tools(PGI Server)
コンパイルやジョブ投入はフロントエンドサーバーで行われ、スパコンで行われるものは計算のみ。
フロントエンドサーバーのOSなどはスパコンと同じ。
プログラム構築術(スカラー)
コンパイル術(スカラー)
シェルスクリプト
プログラム構築術
スパコンでプログラムを構築する際の注意と、テクニック。
配列定義
スカラーでは問題なくできました。何か問題があれば、また追加します。
ベクトルで出来ませんでした。
OpenMPによる並列化指示
長くなるので、詳しくは以下のページで。
MPIによる並列コンピューティング指示
コンパイル術
スパコンでのコンパイル時の注意と、テクニック。
ローカルで使用していた共有ライブラリの利用
現在検証中だが、環境変数LD_LIBRARY_PATHを使えるかもしれない。
現時点での詳細は、「プログラミング」の「ライブラリの扱い」参照。
SMP上での自動並列化(-Mconcur)
DO文やfor文などの並列可能な部分を解析し、自動並列化を行ってくれるもの。
コマンド:
-Mconcur
使用する際のCPU数(スレッド数)はシェルスクリプト内で指定することになるようです。
以下で紹介しているコマンドは使用できないようです。残しておきますが、参考までに。
しかし、これだけではダメで、環境変数NCPUS(または、OMP_NUM_THREADS)を設定する必要がある
コマンド:
export NCPUS=(CPU数)
以下に実行例を示す。
例:
$ pgf95 –fastsse -Minfo -o test -Mconcur test.f
$ export NCPUS=2 (bash 使用時で、CPU/スレッド数 2 を指定)
$ ./test
このコマンドにもサブコマンドが存在する。それらについてはマニュアル(PGI_softek_ug:p22)を参照のこと。
OpenMP指示行による並列化(-mp)
OpenMPを使える環境で、そのプログラムをコンパイルするときに使う。
コマンド:
-mp
使用する際のCPU数(スレッド数)はシェルスクリプト内で指定することになるようです。
以下で紹介しているコマンドは使用できないようです。残しておきますが、参考までに。
また、自動並列化のときと同様に環境変数OMP_NUM_THREADS(または、NCPUS)を設定する必要がある。
コマンド:
export OMP_NUM_THREADS=(スレッド数)
これを使用するには、ソースコードの中で並列化を行う部分を明示しておく必要がある。
また、並列化する際には注意が必要である。
- ループ部分などで前後のループにおいて依存関係がある。
- 指示行が間違っている。
などの理由から、性能向上しない(むしろ、落ちる)、計算結果が変わるなどの症状を起こす場合がある。
以下では例を示す。
例:ユーザプログラム例 (test.f)
----------------------------------
C USER PROGRAM
INTEGER A(1056,1024)
C$OMP PARALLEL SHARED ... ← OpenMP 指示行(通常のコンパイラで
C$OMP DO はコメントと見なされます)
DO J = 1, 1024
...
END DO
C$OMP END DO NOWAIT
----------------------------------
$ pgf95 –fastsse –Minfo -o test -mp test.f
$ export NCPUS=2 (bash 使用時で、CPU/スレッド数 2 を指定)
$ ./test
OpenMPの詳しい説明は参考URLを参照のこと。
また、サブコマンドについてはマニュアル(PGI_softek_ug:p23)を参照のこと。
SSE機構を利用した並列高速化(-fastsse)
SSE機構を備えた環境で有効である。ループ部のベクトル化とスカラー計算部のSSE化を行う。
コマンド:
-fastsse
これは複合コマンドであり、様々な機能が集約されいる。
また、SSE機構を備えていないマシンでは、上記コマンドの代わりに、
コマンド:
-fast
を用いるとよい。これも複合コマンドであるが、どちらのコマンドもその環境で性能を最大化することに一役買ってくれるものである。
インライン化による高速化(-Mipa=inline)
ソースコード中のインライン展開が可能なものを検索し、それを自動でインライン化するコマンド。
コマンド:
-Mipa=inline
C/C++の場合には複数のソースファイルにわたってインライン化を行うことができる。
また、自動ではなく自分で明示的かつ厳格にインライン処理を行う部分を指定することもできる。
コマンド:
-Minline
こちらでは、様々なサブオプションを指定することで、
- インライン化する(しない)関数の指定
- インライン化する関数の条件を指定
など、細かな指示を出すことができる。
詳しいサブコマンドは手持ちのマニュアル(PGI_softek_ug:p13)を参照のこと。
コンパイラが最適化を施した部分の情報を得る(-Minfo)
コンパイル実行後にコンパイラが最適化を施した箇所を表示するためのオプション。
様々なオプションとの組み合わせが可能であり、それに応じた情報を提供してくれる。
コマンド:
-Minfo
次のように出力される
例:
$ pgf95 -fastsse -Mvect=prefetch -Minfo Test.f
initia:
195, Loop unrolled 8 times
204, Loop unrolled 8 times
fielde:
56, Interchange produces reordered loop nest: 57, 56
90, 1 loop-carried redundant expression removed with 3 operations
and 4 arrays
…
…
詳しい説明や、他の使い方に関してはマニュアル(PGI_softek_ug:p29)を参照のこと。
コンパイル時に最適化が不可能であった部分のみの情報を得る(-Mneginfo)
最適なコンパイルを行うために、最適化できていないところの情報を取り出すオプション
コマンド:
-Mneginfo
詳しい使い方や、サブオプションについてはマニュアル(PGI_softek_ug:p30)を参照のこと。
シェルスクリプト
シェルスクリプトでコンパイルから結果表示まで
シェルスクリプトではいろいろなコマンドを使って行くことが出来る。
通常使っているのは、マニュアルで提示された以下のようなもの。
cd pcc (pccというディレクトリに移動)
./a.out > output (a.outを実行し、標準出力をoutputに書き込み出力)
これは、単に計算サーバでプログラムを実行するための手順を書いているにすぎない。
これはもっと有効活用が可能だ。
まず、並列化でのコンパイルは手動で一度行う。
それからシェルスクリプトを実行する。
例えば、こんな感じ。
cd cca+ (cca+というディレクトリに移動)
./a.out > output0 (a.outを実行し、実行結果をoutput0に書き込む)
./a.out > output1 (a.outを実行し、実行結果をoutput1に書き込む)
./meantime 2 > output_n (meantimeを実行し、output_nに書き込む)
pgCC cca1000.cpp (cca1000.cppを通常コンパイル > a.outができる)
./a.out > output0 (以下同様に)
./a.out > output1
./meantime 2 > output_p
./mt_cmp > output_cmp
- cca1000.cppは実行時間を計測している対象
- meantimeは各outputから平均実行時間を計算するプログラム(実行時の後ろの「2」はコマンドライン引数)
- mt_cmpは両方の平均実行時間を比較するプログラム
これで、コンパイルしてから実行し、さらにoutputファイルを全て確認するという煩雑さから開放された。
当然、meantimeとmt_cmpは自分で作り、仕様もそろえる必要はありますが。
シェルスクリプトでコンパイルすると、OpenMPについてはできていたようですが、-fastsseや-Mipa=inlineは適用されなかったようでした。
そのため、並列化コンパイルは事前に手動でする必要があります。エラーも見れるしこのほうがいいかもね。
参考URL
#bf
Today's Access -
Yesterday's Access -
最終更新:2009年06月09日 20:50