4.9. 最適化制御行を使わないループ展開

4.9.1. チューニング対象

本節で対象とした calc_function_4 関数は、「システム方程式マトリクス計算」の計測区間に含まれ、チューニング実施前のアプリケーション全体の約1.0%のコストを占めている関数です。本関数は「システム方程式マトリクス計算」に含まれる関数の中では、4番目にコストが高い関数です。

4.9.2. 分析

calc_function_4 関数を分析した結果、下記のループに着目しました。このループの特徴は以下の通りです。

  • ソースコード抜粋の①ループの外にある if 文(既に実施したチューニング項目で追加)により、①ループの回転数は5であることが明示され、ループ展開されました。対して、②のループは①ループと異なり展開されませんでした。

[チューニング実施前の calc_function_4 関数のソースコード抜粋]

image24

4.9.3. 実施

分析結果を踏まえて、以下のチューニングを実施しました。

  • 命令スケジューリング最適化のため、ソースコード抜粋の②のループを最適化制御行でループ展開します。

[チューニング実施後の calc_function_4 関数のソースコード抜粋]

image25

しかしながら、上記最適化制御行ではコンパイラによるループ展開ができなかったため、代わりに次のチューニングを実施しました。

  • ソースコード抜粋の②のループを、最適化制御行を使わずにループ展開

[チューニング実施後の calc_function_4 関数のソースコード抜粋]

image26

4.9.4. 効果の検証

実施したチューニングを評価するために、詳細プロファイラで出力した、「システム方程式マトリクス計算」計測区間の Cycle Accounting(プログラムの実行時間の内訳)を、チューニング実施前後で比較しました。

image27

上記グラフのうち、チューニング実施前の中で最も実行時間が長いプロセス(Process 392)と、チューニング実施後の中で最も実行時間が長いプロセス(Process 412)を比較すると、チューニング実施後では約10%実行時間が改善しました。プロセスごとの出力項目をみると「Floating-point operation wait」が共通して改善しており、ループ展開によるスケジューリング改善の効果が表れていると考えられます。