4.1. 除算処理のSIMD化と小回転ループのSIMD化抑止

4.1.1. チューニング対象

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

4.1.2. 分析

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

  • コンパイラにより、ソースコード抜粋の①のループが SIMD 化されますが、ループ回転数が少ないです。

  • ①のループには、SIMD 化によって水平加算( SIMD 内の全要素の和を取る命令)のコストが発生していると考えられます。

  • ループ内の除算処理(ソースコード抜粋の②)が SIMD 化されていません。

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

image2

4.1.3. 実施

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

  • 配列 a_inv を用意し、除算処理を別ループに分離し、事前に実施します(分析の結果、a_inv に必要な配列サイズは 5×6 と判明)。なお除算処理のループは、ループ展開を抑止することで SIMD 化が促進されるようにします。

  • 最内ループは最適化制御行にて SIMD 化を抑止します。

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

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

image3

4.1.4. 効果の検証

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

コスト

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

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

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

アプリケーション全体

5975125

5889171

1.4%

calc_function_3

164184

114805

30.1%