[目次] [発表資料]

質疑応答「スカラ並列機におけるアプリの高速化事例」


−司会− 航空宇宙技術研究所 福田 正大

【司会】
 それでは、只今のご講演に対しまして、ご質疑、コメントをお願いします。

【中村】(航空宇宙技術研究所)
 以下の図で、性能がガタっと落ちるている個所がありますが、その理由は、キャッシュ競合のためですか。先程、102×1023 だから割り切れないというようなことを仰っていましたが、問題は102でも、ディメンションを128ととることは可能ですよね。それはやられたのでしょうか。



【市川】(発表者:富士通(株)システム本部計算科学技術センターHPCシステム部)
 これはCache lineの競合というものではなく、単純に負荷バランスがやや悪いということだと想像しています。

【中村】
 通常、並列台数が上がるとキャッシュに乗り切るように性能値が上がっていくと思うのですが、上がらないのはどうしてでしょうか。

【市川】
 端は境界処理になっておりまして、実際は100のサイズの処理量です。16CPUで性能の伸びがやや悪くなっているのは、単純に一次元分割しておりますので、100を16で割り切れず、分割損があるということです。

【中村】
 分かりました。次の質問ですが、先程、ユーザは、実はパイプライン処理は書きにくいと仰っていましたが、今回のような並列化処理はあくまでも例であって、ユーザにそれを押しつけるわけではないですよね。また、このようなことをやってこられて、エンドユーザに何を示せたのでしょうか。

【市川】
 難しいご質問ですが、今回は、チューニングの事例ということでご紹介しております。

【司会】
 頑張ればこんなに早くなるんだ、ということですね。

【中村】
 パイプライン処理は、ユーザはプログラムを書かないと思います。コンパイラが自動的にやってくれるようになるといいと思いますが、いかがでしょうか。

【市川】
 現在のOpenMPの記述性には制約があるのは確かですが、たとえOpenMPがもっと進化したとしても、パイプライン処理はOpenMPの機能だけでは実現が難しいとも思うのですが、いかがでしょうか。実際に、ベクトル処理ではユーザSSOR法をハイパープレーン法に書き換えてベクトル化を行なうわけですが、この書き換えを削減してくれるコンパイラは未だに実現できていません。

【司会】
 僕は、パイプライン処理による並列化は、案外と出てくるんじゃないかという気がしています。ですから、パイプライン処理の並列化をもう少し簡単に記述する方法があると良いと思いますね。それはOpenMPの拡張なのか、言語の拡張なのか、機能の追加なのかは分かりませんが。

【市川】
 そうですね。

【司会】
 今後の課題に、"コンパイラの最適化能力の向上に期待" とありますが、今回のお話の中のループ融合の最適化や、次元縮小をしてくれるようになるのは、まだまだ先の話なのでしょうか。

【青木】(ソフトウェア事業本部ミドルウェア事業部コンパイラ技術部)
 以前のスカラコンパイラは、演算数の減少やスケジュールの観点で、演算部分を高速化しようとして最適化してまいりました。しかしCPUとメモリの速度がどんどん離れていくにしたがって、最近では、キャッシュ周りやループの再構成という点が焦点になってきており、現在、地道に努力をしているところです。やはりループ融合の最適化や、今回の例3のような融合についても、ぜひ近い将来にやっていきたいと思います。ただし次元縮小は少し難しいので、ある程度似たような効果が得られる再構成をしていくつもりです。



【司会】
 ベクトルの方もループを入れ替えたり融合したりしてほしいですね。

【青木】
 そうですね。今のコンパイラでも二重のループの融合化くらいまではやっているのですが、回転数や次元数が違う場合は、まだできていません。

【司会】
 あるいはコンパイルしているときに、コメントが出るなど、アドバイザリーしてくれるとよいですね。

【青木】
 そうですね。

【司会】
 あともう一点質問させてください。例(1)のループアンロールについてですが、要するに一度ロードしたCache lineを使い切ろうということから、i+1、i+2 と8個書かれたと思うのですが、これは、あくまで先頭がCache lineの筆頭にあるということが前提であって、ユーザからはメモリの割り付けは見えないですよね。しかしAの1がCache lineの先頭とは限らない訳ですから、ずっと続けて書いたからといって、先頭から8個なのか、真中から8個なのかは、分からないということですよね。



【青木】
 その通りです。広い範囲から考えると、ある程度効果が得られるということです。

【司会】
 Aの1番目の要素を、Cache lineの先頭に持ってこさせることはできますか。

【青木】
 コンパイラで、そのような仕組みを作ることは可能です。VPP5000のコンパイラの方はある程度のCache lineに合わせていましたが、スカラコンパイラも、やればできます。

【司会】
 同じ図の中のループ入れ替えのプログラムは、単に連続アクセスになるようにdoを書き換えただけですよね。ループの入れ替えを指示行で書いて、コンパイラがアンロールを全部やってくれるようになればいいですね。

【市川】
 確かに今回の例では、ループ入れ替えとループアンロールを組み合わせたほうが高い性能が得られると思います。ただ、一般的にはアンロールのみとしたほうがよい場合もあるのではないかと考え、例を書きました。また、ループアンロールは現状でもコンパイラがある程度自動的に判断してやってくれます。

【司会】
 どうもありがとうございました。(拍手)

[目次] [発表資料]