4.2. ループ展開によるload/store削減¶
4.2.1. チューニング対象¶
本節で対象とした calc_function_1 関数は、「システム方程式マトリクス計算」の計測区間に含まれ、チューニング実施前のアプリケーション全体の約23.3%のコストを占めている関数です。
4.2.2. 分析¶
calc_function_1 関数を分析した結果、下記のループに着目しました。このループの特徴は以下の通りです。
ソースコード抜粋の①②のループは最適化制御行によりループ展開済みですが、③④⑤のループはループ展開されていません。
③④⑤のループは5回転の定数回転ループです。ループ展開することで配列 b がレジスタに乗り、配列 b に対する load と store を削減できると考えられます。
[チューニング実施前の calc_function_1 関数のソースコード抜粋]
4.2.3. 実施¶
分析結果を踏まえて、以下のチューニングを実施しました。
最適化制御行を追加し、ソースコード抜粋の③④⑤のループをループ展開します。
if 文を追加し、③④⑤のループの回転数が5であることを明示する CLONE 最適化を実施します。
※なお、本アプリケーションへのチューニング実施時には利用できませんでしたが、tcsds-1.2.31 で CLONE 最適化と同じ最適化を行う最適化指示子(使用例:#pragma fj loop clone var==n)が追加されました。この最適化指示子を使用することで、if文追加によるCLONE最適化と同じ効果が得られることが期待されます。
以下は、チューニング実施後のソースコードです。
[チューニング実施後の calc_function_1 関数のソースコード抜粋]
4.2.4. 効果の検証¶
実施したチューニングの効果を、チューニング実施前後の基本プロファイラを用いて評価しました。下表はコストの計測結果です。 本節のチューニングにより calc_function_1 関数のコストが20.8%減少し、アプリケーション全体のコストが3.5%減少しました。
コスト |
性能改善率 ((A-B)/A) |
||
---|---|---|---|
本節のチューニング実施前 (A) |
本節のチューニング実施後 (B) |
||
アプリケーション全体 |
5889171 |
5683484 |
3.5% |
calc_function_1 |
1272637 |
1008226 |
20.8% |