インテル® C++ コンパイラー 17.0 デベロッパー・ガイドおよびリファレンス
行 %d のループの上限式の値を一時ローカル変数に格納して、この変数をループの上限式として使用します。 これは、ループの直前に "temp = ループの上限値" 形式の文を挿入し、ループの上限式を "temp" に置換することで行えます。 一意な名前を選択し、ループのオリジナルの上限式を "temp" に置換します。
ループの実行中に上限が変更されない場合は、ループの上限をローカル変数に格納します。 これにより、コンパイラーがループを適切にカウントされる do ループとして認識し、ベクトル化と並列化を含むさまざまなループの最適化が有効になります。
このメッセージは、コンパイラーが置換される上限の変数を正しく出力できない場合に表示されます。
次の例について考えてみます。
class FooClass {
public:
const int getValue() { return m_numTimeSteps;}
void Foo2(double* vec);
private:
int m_numTimeSteps;
};
void FooClass::Foo2(double* vec)
{
// これはベクトル化されません
for (int k=0; k < m_numTimeSteps; k++)
vec[k] = 0.0;
// これはベクトル化されません
for (int k=0; k < getValue(); k++)
vec[k] = 0.0;
// これはベクトル化されます
int ub1 = m_numTimeSteps;
for (int k=0; k < ub1; k++)
vec[k] = 0.0;
// これはベクトル化されます
int ub2 = getValue();
for (int k=0; k < ub2; k++)
vec[k] = 0.0;
}
ループ全体の実行を通して上限の値が変更されないことを確認してください。