(4/5)4. スペクトルコードによるパフォーマンス評価および今後の課題
次にスペクトルコードを用いたパフォーマンス評価を行った。このコードでは3重対角行列と5重対角行列で構成される連立一次元方程式を解いている。すなわちNPBのSP, BTに対応するCFDを必要とする。Samplerによる解析結果を表A-2に示す。ここで3重対角行列のsolverはRECURであり、5重対角行列のsolverはRECUR2である。これらのドライバーがこのコードのコストを決めているがあまりベクトル化されていない(この場合をケース(a)とする)。表A-3にRECURのソースコードを示す。RECUR及びRECUR2では漸化式を用いているためにベクトル化ができていない。コードサイズが大きくなるとそれでも他の部分のベクトル化の効果により若干速度の向上が見られる。問題の大きさを128x288,128x972,128x1088,128x2048 と変化させたときのES40 1CPU (f90)とVPP5000 1PE (frt)との比較を表4-1に示す(時間ステップ2回)。ここで128x2048の場合のコードの大きさは約310MB程度であり、128x6144は約1.33GB程度である。円柱の体系を考え、r方向は有限差分でq及びz方向はフーリエ分解しているが、128はr方向のメッシュサイズ2048,6144はレゾナンスモードの数を表している。ただしレゾナンスモードの数が3倍になってもコードの大きさは単純に3倍にはならない。CPU時間はモード数に対して線形ではなくmode数の2-2.5程度のべきで増加している。128x3788の場合を比較するとVPP5000の方が約4倍程度速いことがわかる。VPP5000のスカラ性能はAlpha 667MHz(1.33GFLOPS)の約50%強なのでこの差はベクトル化によるものと考えられるだろう。
さらにこれらを解くドライバーをガウスの掃き出し法へ変えたものをケース(b)とする。ソースコードはComputational Techniques for Fluid Dynamics Volume 1, Fundamental and General Techniques, Second Edition, C. A. J. Fletcher, Springer P.185,186のサブルーチンBANFAC, BANSOLを修正した。コードの一部を表A-4に示す。これらのサブルーチンもベクトル化されていない。また参考のためLAPACKを使用し5重対角行列をLU分解で解き、3重対角行列をガウスの掃き出し法で解くドライバーZGBSV, ZGTSVを使用した(ケース(c))。ここでは問題の大きさを128x972とした。表4-1の場合と入力パラメータが異なるので実行時間は一致しない(時間ステップ10回)。むしろそれぞれのドライバーのパフォーマンスに注目してほしい。表4-2にベンチマークの結果を示す。LAPACK(数値計算ライブラリ)は期待したほど性能がでていない。LAPACKでは一般の行列の演算に関してはベクトル化の効果が期待できるが3重対角とか5重対角のような行列に対しては逆にオーバーヘッドが現れ遅くなってしまうので注意が必要である。
今後の課題として富士通へ要望したいことはSSL IIの拡張機能でサポートされている線形計算のためのサブルーチンは実行列のみであり、複素行列には対応していないのでそれを拡張すること、NPBで使用されている基本kernel及びCFDは頻繁に使用されるものであり、部分的にはSSL IIでサポートされているものの完全とは言い難い。特にここで問題となったbt, spに対応するソルバーの高速化は必要であり(このコードのパフォーマンスが最低でもES40の10倍程度はほしい)、ぜひSSL IIでサポートしていただきたい。
表4-1 問題のサイズを変化させた場合のベンチマークの結果
表4-2 さまざまなドライバに対するベンチマークの結果(128x972)
表A-1 jstatコマンドの出力結果
[yagi@riam202 ~]$ jstat vpp L@vpp; type=BATCH; [ENABLED, INACTIVE]; pri=40 0 exit; 0 run; 0 queued; 0 wait; 0 hold; 0 arrive; A0@vpp; type=BATCH; [ENABLED, INACTIVE]; pri=40 0 exit; 0 run; 0 queued; 0 wait; 0 hold; 0 arrive; A1@vpp; type=BATCH; [ENABLED, INACTIVE]; pri=40 0 exit; 0 run; 0 queued; 0 wait; 0 hold; 0 arrive; B0@vpp; type=BATCH; [ENABLED, RUNNING]; pri=40 0 exit; 3 run; 3 queued; 0 wait; 0 hold; 0 arrive; <3 requests RUNNING> <3 requests QUEUED> B1@vpp; type=BATCH; [ENABLED, RUNNING]; pri=40 0 exit; 3 run; 4 queued; 0 wait; 0 hold; 0 arrive; <3 requests RUNNING> <4 requests QUEUED> C0@vpp; type=BATCH; [ENABLED, RUNNING]; pri=30 0 exit; 1 run; 0 queued; 0 wait; 0 hold; 0 arrive; <1 request RUNNING> C1@vpp; type=BATCH; [ENABLED, INACTIVE]; pri=30 0 exit; 0 run; 0 queued; 0 wait; 0 hold; 0 arrive; P@vpp; type=BATCH; [ENABLED, INACTIVE]; pri=30 0 exit; 0 run; 0 queued; 0 wait; 0 hold; 0 arrive;
表A-2 Samplerによる解析結果
Status : Serial Number of Processors : 1 Type : cpu Interval (msec) : 20 Synthesis Information Count| Percent(Accum)| VL| V_Hit(%)| Name 105| 43.9( 43.9)| -| 37.1| RECUR_ 70| 29.3( 73.2)| -| 24.3| RECUR2_ 33| 13.8( 87.0)| 319| 42.4| TMPUS_ 25| 10.5( 97.5)| 31| 76.0| TMRHS_ 5| 2.1( 99.6)| 31| 60.0| TMDRV_ 1| 0.4(100.0)| -| 0.0| FUNC_ 239| | 143| | TOTAL