6.1 はじめに
近年,NS-IIIにおけるCeNSSのような大規模SMPスカ ラー・システムやPCクラスタに代表されるいわゆる超並列 のクラスタ・システムが出現し,旧来型のベクトル型も含め て計算機システムの構成の多様化が進んでいる.こうした中 で,あるプログラム/コードが,このシステムでは性能が出る が,別のシステムでは出ない,といったシステムによって性 能がばらつくケースが増えて来ている.グリッドコンピュー ティングという遠隔の異種計算機資源をむしろ積極的に使 い合おうというような話もあり,今後一つのプログラム/コー ドをいろいろなシステムで走らせる時代になれば,こうした 実行速度のばらつき,あるいはそれにどう対処する,という 問題は,より切実さを増すであろう.こうした状況において,
プログラム/コードの性能評価や性能チューニングによる性 能向上の重要性は年々高まっているといえる.特に,クラス タ・システムの台頭とともに,並列化や並列実行が卑近なも のとなっている今日,並列チューニングは非常に重要である.
しかしながら,並列化についてはもとより,プログラム/コー ドの性能評価や性能向上の問題は,意外と議論されていない のが実情ではなかろうか.プログラム/コードのチューニング が必要・重要であるとわかっていても,では現状の性能はど うで,今後の努力でどの程度の性能向上が可能なのか,とい った具体的な項目については,かつてのベクトル化率のよう な漠然とした指標はあっても,そのプログラム/コードに相応 しい指標や方針といった考え方は今のところないように思 われる.
本章では,そのような事情を踏まえ,CeNSS における JAXAアプリケーションの処理性能の解釈,性能向上の重要 性やチューニングの方法論について考察する.また,実効ピ ーク性能という概念を提示し,その有効性やそれを用いたチ ューニング法について論ずる.
6.2 性能評価・性能向上・チューニングの重要性と課題 図6.1は,並列性能チューニングを含む性能チューニング の一般的な内容を整理したものである.CeNSS では,スレ ッド並列とプロセス並列を組み合わせたハイブリッド・プロ グラミングのスタイルを採用しているので,並列化において,
スレッドを使っている場合には,プロセス並列に加えてスレ ッド並列チューニングも必要である.こうしたチューニング 内容の切り分けも頭に入れておかないと,いま何をしている のかわからなくなってしまう危険があるので注意を要する.
また,切り分けだけでなく,作業を効率良く行うためには,
チューニング作業の順番も大切である.このあたりは経験が ものを言う世界かもしれないが,他方で管理側からの支援も 重要である.その意味もあり,JAXAコードに対する性能評 価やチューニングの事例を,後の第7章~第9章に示すこと とする.また,JAXAと富士通で整備したチューニングガイ ド[1]を付録Hに示した.
図6.1 性能チューニングの類型
ここ2-3年で作られたコードを除き,我々の航空宇宙分 野のCFDコードは,そのほとんどがベクトル機の時代に作 られたものであり,処理性能は「ベクトル化率」というほと んど単一の指標により判断されてきた.ベクトル化率が高け れば実効性能も高い,というわけである.一方,CFD のコ ードは,(ぎりぎりにベクトルチューンされたもの以外は,) 比較的単純な DOループの多数の組み合わせから成るので,
スカラー・システムでもそこそこの実効性能が出る場合は思 いのほか多い.少なくともサブルーチン単位やループ単位で みると,実効効率で20%を越えるような例もあり,かつて言 われたような,「CFDコードは,スカラー機では数%の実効 効率しか出ない(出せない)」ということでは必ずしもない.
しかしながら,スカラー機の場合には,メモリからデータ を持って来る際に,ベクトル機のように連続的に持ってくる のではなく,一度キャッシュを介在するために,キャッシュ ミスが発生すると,ベクトル機に比べて性能がかなり落ちて しまうのも事実である.また,以下の例で示すように,場合 よっては,チューニングにより性能が劇的に向上することも あるので,ベクトル機に比べると話としては厄介である.
図6.2は,JAXAのいくつかの実コードについて,単体性 能1.7GFLOPSのベクトル機NWTと,チューニングなしで CeNSSにかけた場合,チューニング後に CeNSSで実行さ せた場合の性能を比較した事例である.CeNSSでは,どの
図6.2 チューニングによる性能向上の例
0 100 200 300 400 500 600 700 800
S1 S2 S3 S4
コード
実効性能 (Mflop/s)
NWT CeNSS CeNSS-T
46 宇宙航空研究開発機構研究開発報告 JAXA-RR-10-005
0 200 400 600 800 1000 1200 1400
0 10 20 30 40 50 60 70 80 90 100
メモリコスト(%)
MFLOPS
平均:421MFLOPS
平均:29%
P1 P2
P3 P4
P5 P6
コードもチューニング後には性能は向上している.絶対値と しては,400-700MFLOPS の性能であり,ピークに対して 10-15%の実効値が得られている.ただ,コードS2について は,チューニングなしでは,ベクトル機に比べ性能は低下す るものの,チューニング後にはベクトルと同様かやや凌ぐ実 効性能が得られている.このことは,性能評価やチューニン グが重要であることを示すとともに,その困難さも示唆して いる.
現状,性能評価やチューニングに対する指標や方針は,キ ュッシュミス率をある一定値(例えば1%)以下にするとか,
ループ操作(融合,分割,軸入替)やメモリアクセスの(時 間的・空間的)局所化,ホットスポットの検出のような一般 的な例・法則を示すことはできる[1].しかし,個々のコード ではどうなのか,これをやれば定量的にどういう効果がある のか,については,ユーザの個人的な判断や勘・経験にまか せるしかない状況にある.今後,並列機のシステム構成がま すます多様化し,プログラム/コード自体のプログラミング/
コーディング・スタイルも多様化して行くようなことになれ ば,混迷の度合いも一層深まる可能性があり,普通のユーザ が個別に性能向上を図るための支援策を如何に講ずるかに ついては,システムを有効に利用するためにもシステム運用 側の大きな課題でもある.
6.3 実効ピーク性能とチューニング指針
そこで我々は,このような困難に対する解決策を模索する ために,富士通株式会社の協力を得て,科学技術計算系の実 際のコード250本のCeNSS上での単体CPU実効性能を調 査した.図6.3は,メモリアクセス状況が性能に与える影響 が大きいとして,メモリアクセスコストを横軸に取り整理し たものである.これにより,実コード250本の平均メモリア クセスコスト=29%,平均実効性能=421MFLOPS であるこ とがわかった.直線は,平均線を示している.JAXAコード 6本についてもプロットしてみたが,コードP1,P2は,平 均に対しては十分性能は出ているが,コードP3,P5,P6に ついては,改善の余地があることがわかった.コード P1,
P2 は,平均よりは高い性能が出てはいるが,もっと性能の 高いコードもあるので,がんばりようによってはもっと高い 性能が狙えるかもしれない.
図6.3 実効性能の調査結果
図6.4 実効ピーク性能の考え方
以上のような実コード性能の評価分析活動から,図6.4の ような構図を考えるのが妥当であろうという結論に達した.
すなわち,「実効ピーク性能」というものを考え,これをチ ューニングの指標としたらどうかというものである.実効ピ ーク性能は,理想的にチューニングして到達できる最高の性 能値のようなものを意味する,問題は,実効ピーク性能をど う決めるかである.例えば,メモリコピーのみのプログラム は0FLOPSである.A=B+Cというプログラムは,シーケン シャルに実行すると
load B load C
add
store A
のように1演算に4サイクルかかるので,1演算/4サイクル
×1.3GHz=375MFLOPSの性能であるが,CeNSSでは,1 サイクルに浮動小数点2命令同時実行可能なので,
load B & load C & add store A & load B load C & add & store A
のように3サイクルで2演算の実行が可能であるから,最高 で,2演算/3サイクル×1.3GHz=867MFLOPSの性能を出す ことができる.これの類推から,実効ピーク性能Peffを,
浮動小数点演算数
Peff (MFLOPS)= ―――――――――― × 106 (6.1) 理想実行時間
M&A命令は2演算,他は1演算でカウント(ただ し,DIV, SQRTも1演算)
MAX(浮動小数点命令数,それ以外の命令 数)/(1.3GHz×2)
実効性能Psus
ピーク性能Ppeak 実効ピーク性能Peff
チューニングで 改善の見込みがある
0.0 0 0.1 0 0.2 0 0.3 0 0.4 0 0.5 0 0.6 0 0.7 0
0 20 4 0 6 0 80 10 0
メモリコスト(%) 比
P1 P2 P3
P4 P5
P6 平均:0.29
0 1000 2000 3000 4000 5000 6000
0 10 20 30 40 50 60 70 80 90 100
メモリコスト(%)
MFLOPS
平均:1435MFLOPS
P1 P2
P3 P4
P5 P6
と定義し,図6.3で調べたのと同じ250本の実コードに対し てPeffを調べた.ただし,式(6.1)は,
・ 無駄な演算,データ移動はない
・ メモリアクセス,整数演算は,2命令/サイクル
・ 浮動小数点演算命令は,2命令/サイクル
・ メモリアクセス,整数命令と浮動小数点演算は同時実 行可能
として考えている.以下の図6.5は,実効ピーク性能をメモ リコストに対してプロットしている.ここで,都合により,
FMADDオプションは付けていないので,実効ピーク性能の
最大値は2.6GFLOPSになっており,最大になっているコー ドも幾つかある.◇は,JAXAコードの値,直線は平均値を 示している.全体での平均実効ピークは1435MFLOPSであ ることがわかった.JAXA コードに関していえば,コード P1,P2は平均より高く,コードP3,P5,P6は平均より低 い.調査の結果,P1,P2が平均より高い理由は,浮動小数 点演算が多いからであることがわかっている.逆に,コード P3 以下が平均より低い理由は,浮動小数点演算以外の命令 の影響の可能性が高い.式(6.1)により,実効ピーク性能は浮 動小数点演算数が多いほど高くなるので,これらのコードに ついては,浮動小数点演算数を増やす等のチューニングを行 えば,より高い実効性能に到達可能ということである.
図6.5 実効ピーク性能の調査結果
表6.6は,今までの測定結果から,6本のJAXAコードの 実効性能Psus,実効ピーク性能Peff,及びその比(「実効ピー ク性能比」と呼ぶことにする.)Psus/Peffを示したものである.
コードP1,P2の括弧内の値はFMADDオプションを付けて 測定したときの値であり,コードP1については,FMADD により 20%以上の性能改善の可能性がある.Psus/Peffは,コ ードP6を除き20~30%という値が得られた.
図 6.7 は,250 本のコードに対して実効ピーク性能比 Psus/Peffをプロットしたものである.◇は,JAXAコードの値,
直線は平均値を示している.全体平均は,29%であった.一 般的にいえるのは,メモリアクセスコストが低い(図の左側)
ほど,ピーク性能比は高くなることであり,コードの持って いる本来の性能をより高く出しているといえる.JAXAコー ドについていえば,P3 を除きどのコードも平均線を下回っ
ている.これは,本来の性能を出し切っていないことを意味 しており,性能改善の余地があることを示している.無論,
その改善の中身はコードによって異なるので,コード毎に検 討してみる必要がある.例えば,詳細に調べてみると,コー ドP1は割り算が,コードP2はSQRTが多いことがわかっ た.これは,化学反応項や,Roeスキームの影響であること が想定される.よって,この辺りを集中的に工夫すれば,も っと性能を上げられる可能性はある.コードP3は,チュー ニングという意味では,平均的な実力を出しているといえる.
ただし,絶対性能は高くないので,(アルゴリズム的に工夫 の方法がなければ仕方ないが,)基本的な性能を上げる努力 をするかどうかである.コードP5,P6は,平均値からする と悪い値ではない.逆に,メモリアクセスコストを変えない まま工夫しても,性能はあまり上がらない,あるいは,上げ ようがないことを意味している.図でいうと,もっと左側の 位置に来るようにメモリアクセスのチューニングをすれば 性能改善の余地は大きくなる.
表6.6 JAXAコードの実効ピーク性能比
コード P1 P2 P3 P4 P5 P6
実効性能 666 648 241 422 160 114
実効ピーク性能 2600 (3218)
2600
(3077) 873 1764 777 810 Psus/Peff 25.61% 24.91% 27.55% 23.90% 20.65% 14.07%
図6.7 実効ピーク性能比の調査結果