4.3. ループ一重化によるSIMD化促進¶
4.3.1. チューニング対象¶
本節で対象とした make_function_6 関数は、「システム方程式マトリクス構築」の計測区間に含まれ、チューニング実施前のアプリケーション全体の約1.2%のコストを占めている関数です。
4.3.2. 分析¶
make_function_6 関数を分析した結果、下記のループに着目しました。このループの特徴は以下の通りです。
ソースコード抜粋の①ループは、コンパイラによる SIMD 化がされていません。
ソースコード抜粋の①②ループはそれぞれ5回転ループです。
[チューニング実施前の make_function_6 関数のソースコード抜粋]
4.3.3. 実施¶
分析結果を踏まえて、以下のチューニングを実施しました。
上記①②の二重ループのうち、②ループを25回転の1つのループとして一重化した上で、下記③④の2つのループに分けます。
SIMD 化を促進させるため、最適化制御行によりループ展開を抑止します。
以下は、チューニング実施後のソースコードです。
[チューニング実施後の make_function_6 関数のソースコード抜粋]
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% |