5.1 はじめに
本章では,実際に使われているJAXA実アプリケーション のCeNSSにおける性能評価結果とその解釈上の問題点につ いて論ずる.まず,単体CPU性能とその解釈上の課題につ いて述べる.次に,並列性能とアプリケーション特性と性能 との関連付け等について考察し,課題についても述べる.こ れらの課題に対する考察や対策は,後章で述べることとする.
5.2 CeNSSの構成とプログラミングスタイル
I/Oなどの部分を除いたCeNSSの構成イメージはすでに 図3.3に示したところである.計算ノードは,32個のCPU から成るSMP(Symmetric Multi Processors)を構成し,1 ノードは64GBの共有メモリ空間を有する.図3.3において,
DTUとは,Data Transfer Unitの略で,結合ネットワーク にデータを送り出す/受け取る論理上の装置を表すが,DTU あたり,16プロセスを同時に処理することができる.計算筐 体は全部で14筐体,ノード数では56ノードあり,筐体は,
富士通製 PRIMEPOWER HPC2500 である.CPU は,
SPARC64 Vを採用し,ピークで5.2GFLOPSの性能と2MB のオンチップL2キャッシュを有する.こうした構成のシス テムはSMPクラスタと呼ばれることがあり,メモリはどの CPUからみても厳密に対称な配置を有している.
CeNSSにおけるFortranの並列プログラミング体系は,
すでに図 3.18 に示した.ノード内では,自動並列または
OpenMPあるいはそれらの混在によるスレッド並列を用い,
ノード間では,MPI またはデータ並列言語の一種である XPFortran によるプロセス並列を組み合わせせることによ り,いわゆるハイブリッド・プログラミングのスタイルを標 準として採用している.図5.1に並列ジョブ実行のユーザビ ューを示す.例として,4スレッド×8プロセスの場合を示 した.これにより,1,000 を超えるような多数CPU使用時 のスケーラビリティの問題や,大規模並列プログラミングの 困難に対して一定の現実的な解決を与えている.詳細は,文 献[1][2]を参照されたい.ここで,ノード内のスレッド並列 は必須ではなく,MPIやXPFortranによるプロセス並列だ けのプログラミングも可能であることに注意する.
図5.1 並列ジョブ実行イメージ
(a) XPFortran
(b) MPI
図5.2 メモリ確保イメージ
XPFortranとMPIとでは,メモリ管理の考え方に違いが あることにも留意が必要である.図 5.2 に示すように,
XPFortranでは,仮想グローバルメモリ空間を取るのに対し,
MPI ではプロセス単位でメモリ空間を取る.従って,
XPFortranでは,メモリ管理が簡便で並列プログラミングが 容易なのに対し,MPIでは,プログラミングは大変だが複雑 な通信が可能であり,それぞれ一長一短がある.JAXAにお ける利用割合は,MPI:XPF ≒ 6:4であり,近年はMPI の割合が漸増しつつある.
5.3 JAXA実アプリケーション
表5.3に,本報告において性能評価やチューニング事例に 取り上げたJAXA解析コード(JAXA実アプリケーションま たはJAXA実アプリ[3]-[8],ただし,JAXAを代表するとい う意味ではないことに注意.)の一覧を示す.これらは,JAXA で実際に用いられている並列CFDコードであり,適用され る対象により数値解法/格子形状や並列化手法が異なってい る.コード P2,P3 が学術系の課題(P2:燃焼流,P3:平 行平板間非圧縮乱流)を解析するためのものであり,あとの 4本は工学系のコード(設計開発に使われるもの)である.
基礎式は,いずれのコードもNavier-Stokes方程式である.
表5.3 性能評価したJAXA並列CFDコード一覧 コード
(名前) アプリケーション シミュレーション
モデル 数値解法 並列化 言語 (行数) P1
(LESFOIL) 翼 LES FDM
(構造格子) OpenMP + MPI F77
(7,000) P2
(HJET) 燃焼 DNS FDM
+化学反応 OpenMP + MPI F77
(10,000) P3
(CHANL) 非圧縮乱流 DNS FDM
+FFT OpenMP + XPF F77
(17,000) P4
(HELI) ヘリコプタ URANS FDM (重合格子)
自動並列 + XPF
F77 (13,000) P5
(UPACS) 航空汎用 RANS FVM
(マルチブロック) MPI F90 (20,000) P6
(JTAS) 航空汎用 RANS FVM
(非構造格子) MPI F77 (20,000)
5.4 JAXA実アプリの単体CPU性能とその意味
まず,表5.3に掲げた6本のコードの単体CPU性能を調 べた結果をコードの他の特性とともに表5.4に示す.コード P1~P4の2次キャッシュミス率が1%以下なのを見てもわ かる通り,これらのコードの性能評価には性能チューニング された版を用いている.ここで,キャッシュと24は,CPUと 主メモリの間にあって,容量は小さい(CeNSSの場合,CPU あたり 2MB)が主メモリよりアクセス時間が高速なメモリ のことを言い,CPU のクロックと主メモリへのアクセス時 間のギャップを埋めるために使われる.また,キャッシュミ ス率とは,CPU からキャッシュにアクセスしたときに,必 要なデータがキャッシュ上になかった割合を指し,ミスが発 生すると主メモリにデータを取りに行くので時間がかかる
(性能が落ちる)ため,これが小さいほうが望ましい.我々 は,富士通株式会社の指導により,一応 1%以下にすること を目安にチューニング等を行っているが,コードP6のよう に,プログラムによっては,ミス率を減らすのが原理的に困 難なものもある.なお,このあたりの性能の測定法やチュー ニングの実例については,以下の7-9章を参照されたい.
コードP1からP6に向かって,メモリコストが約10%か ら 70%に増加しており,それと反比例して実効性能は,
700MFLOPS弱から100MFLOPS強まで低下しているのが わかる.ここで,メモリコストとは,CPU 時間中に占める メモリアクセス時間の割合を示す.また,実効効率としては,
12.8%から2.2%まで低下している.ここで,
実効効率 = 実効性能値(MFLOPS)/理論ピーク性能値 (5.1) で算出した.この場合,理論ピーク性能は,CeNSS では 5.2GFLOPS(= 5,200MFLOPS)である.計算機でよく言わ れる「ピーク性能より実効性能・実効効率が重要」というの は,このようにピーク性能と実効性能の間に大きな乖離があ ることに由来する.利用する側からすれば,実際にそのコー ドが速く走れば良いのであって,ピーク性能や実効効率は単 なる一つの目安にすぎない.
富士通製PRIMEPOWER HPC2500に基づくCeNSSシ ステムのCPUあたりのピーク性能が5.2GFLOPSであると いうのは,1 マシンサイクルに M&A 命令が 2 命令動作
(FMADDオプション)することから,
1.3GHz(クロック)×2FLOPS×2 = 5.2GFLOPS という意味である.一方,1マシンサイクルに普通の浮動少 数点演算命令が2命令動作(NOFMADDオプション)の場 合には,ピーク性能は
1.3GHz×2FLOPS = 2.6GFLOPS
となる.表5.4のM&A命令の出現割合に眼をやると,実際 にはせいぜい13%以下であることがわかる.この場合,ピー ク性能は,
5.2×0.13 + 2.6×0.87 = 2.938GFLOPS
24 キャッシュは通常,階層構造をなし,CPUに近い方から1次キャ ッシュ,2次キャッシュと呼ぶ.
ということになり,単体ピーク性能 = 約3GFLOPSのCPU を使っていることと同等になる.とすれば,表5.4でいうと ころの(5.2GFLOPSに対する)実効効率というのは,単に 一つの比を表すに過ぎず,M&A命令の出現割合を考慮して ピーク性能及び実効効率を換算し直す必要がある.そこで,
M&A命令比 = αとして
実ピーク性能 = 5,200×α + 2,600×(1-α)
として
実効効率 = 実効性能値(MFLOPS)/実ピーク性能値 (5.2) として換算し直すと表5.5のようになる.このように,バル クの値としての実効効率の意味はそれなりにあるとしても,
細かくみてみると実効効率の意味は曖昧なものである.一般 的な傾向としては,メモリコストと実効性能は相反する傾向 にある.また,M&A 命令の効果は残念ながらあまり出てい ない.
それでは,実効性能(絶対値)だけを見ればよいのではな いか,と言われるかもしれないが,ここで問題になるのは,
あるいは,ユーザとして関心が高いのは,その実効性能の持 つ意味である.つまり,自分のコードに関する現状の実効性 能は高いのか低いのか,あるいは,もっと高いところを狙え るのかどうか,ということである.例えば,コードP1は,
表5.4では実行性能666MFLOPS,実効効率は12.8%という 数字を出しているが,もっと高いところを狙いたいといった ときにそれは可能なのかどうか? 一方,コードP6は,実 効性能はかなり低いのでもっと上を狙いたいと思うのは当 然であろうが,ここでやみくもに性能チューニングに入って も,果たして目標をいくらにおいたら良いのか,どの程度の 改善が望めるのか,という情報がなければ,徒労に終わる可 能性もある.このような個別のケースに適応できる何か指標 のようなもの,あるいは有効な方針が強く望まれるところで ある.本課題・疑問に対する一つの考え方を,後の6章にお いて論ずる.
表5.4 JAXA並列CFDコードの特性と単体CPU性能 コード P1 P2 P3 P4 P5 P6 2次キャッシュ
ミス率 0.43% 0.34% 0.52% 0.60% 1.04% 2.51%
M&A
命令比 9.7% 12.4% 4.4% 6.6% 5.7% 6.7%
計算コスト 87% 91% 78% 76% 66% 29%
メモリコスト 13% 9% 22% 24% 34% 71%
実効性能
MFLOPS 666 648 241 422 160 114 実効効率
(5.1) 12.8% 12.5% 4.6% 8.1% 3.1% 2.2%
40 宇宙航空研究開発機構研究開発報告 JAXA-RR-10-005
0 100 200 300 400 500 600 700
0 128 256 384 512
Number of processes
Performance ratio(1process*1thread=1)
x1thread x2thread x4thread x8thread x16thread pureMPI 0
2 4 6 8
0 56 112 168 224
Number of processes
Performance ratio (28proc*1thread=1)
×1thread
×2thread
×4thread
×8thread
×16thread 0
100 200 300 400 500
0 32 64 96 128
Number of processes
Performance ratio(1process*1thread=1)
x1thread x2thread x4thread x8thread x16thread pureMPI
表5.5 M&A命令の出現割合を考慮した性能及び実効効率 コード P1 P2 P3 P4 P5 P6 ピーク性能
GFLOPS 2.852 2.922 2.714 2.772 2.748 2.774 実効効率
(5.2) 22.7% 22.3% 8.9% 15.2% 5.8% 4.1%
5.5 JAXA実アプリの並列性能とその解釈
ここまでは,CeNSSにおける JAXAアプリの単体 CPU 上での性能評価結果とその解釈及び問題点について論じた.
一方,実際の解析においては,当然のことながら並列実行が 主となる.そこで次に,並列実行時の処理性能を分析する.
並列実行においてまず重要となるのは,プロセス数を変化 させたときの処理性能がどうなるかである.一般的な並列化 では,逐次(非並列)コード→スレッド並列→プロセス並列,
と進むのが通例と思われるが,JAXAの場合,前システムか らの経緯でプロセス並列化は何らかの形(NWT-Fortran ま
たはMPI)で既に済んでいるからである.並列処理の主目的
は高速化にある(付録D参照)ので,プロセス数を増やして 高速化したいと思うのが普通であろう.しかし,アムダール の法則(第10章,付録D)により,並列度を10倍にしても 処理性能は10倍になるわけではないので,性能測定や並列 特性の把握が必要になる.
CeNSSはSMPクラスタゆえ,ノード内では自動並列また はOpenMPによりスレッド並列が可能である.よって,ス レッド並列を使ったときの性能が次に問題になる.スレッド 並列をプロセス並列と組み合わせて使う状況として幾つか のパターンが考えられる.プロセス数を固定して,スレッド 数を増やして性能向上を図るというパターンが最も多いと 思われるが,並列度(CPU 数)を固定してプロセス数とス レッド数の組み合わせを変えてより高い性能を狙うという 方法もある.以上は,問題規模は一定と考えたが,問題規模 そのものを変えるという,という並列実行もある。
実際の測定は,まずは問題サイズ(空間の格子分割数)を 一定にして,スレッド数を固定し,プロセス数を変化させる ことにより,経過時間を実測した.(これを「スピードアッ プ性能」という。)格子分割数は,できるだけ実問題に近い サイズとし,また,他のジョブからの影響を避けるために,
他のジョブが一切ない状態で測定した.コードには,性能チ ューニングされた版を用いた.測定法やチューニングの実際 については,以下の第7-9章を参照されたい.
図5.6(a)は,コードP1の性能測定結果を示したものであ る.横軸にプロセス数,縦軸には,1プロセス×1スレッドの ときの性能を基準(=1)としたときの性能比を取ってあり,何 本かの線は,スレッドを1,2,4,8,16に固定してプロセス数を 変化させた場合に相当する.格子サイズは,200×300×360 である.格子サイズがあまり大きくないこともあり並列数は 多くないが,このコードの場合,最大400並列程度までは,
プロセスに対してもスレッドに対しても直線性(スケーラビ
(a) コードP1
(b) コードP3
(c) コードP5
図5.6 JAXA並列CFDコードの性能