4.3. ループ一重化によるSIMD化促進

4.3.1. チューニング対象

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

4.3.2. 分析

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

  • ソースコード抜粋の①ループは、コンパイラによる SIMD 化がされていません。

  • ソースコード抜粋の①②ループはそれぞれ5回転ループです。

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

image6

4.3.3. 実施

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

  • 上記①②の二重ループのうち、②ループを25回転の1つのループとして一重化した上で、下記③④の2つのループに分けます。

  • SIMD 化を促進させるため、最適化制御行によりループ展開を抑止します。

以下は、チューニング実施後のソースコードです。

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

image7

4.3.4. 効果の検証

実施したチューニングの効果を、チューニング実施前後の基本プロファイラを用いて評価しました。下表はコストの計測結果です。 本節のチューニングにより make_function_6 関数のコストが31.2%減少し、アプリケーション全体のコストが2.1%減少しました。

コスト

性能改善率 ((A-B)/A)

本節のチューニング実施前 (A)

本節のチューニング実施後 (B)

アプリケーション全体

1577140

1544039

2.1%

make_function_6

113984

78416

31.2%