10

g ++は__restrict__ポインターを実装しますが、イテレーターについては何も見つかりませんでした。私の全体的な目的は、コンパイラーにstlループをベクトル化するように促すことです。

編集:

コンパイラーがベクトル化できない場合でも、__restrict__キーワードは、ループ内で不要なリロードが不要であることをコンパイラーに通知できる必要があります。

4

1 に答える 1

6

あなたの直接の質問に対する答えはわかりません。ただし、コンパイラは、のループをベクトル化することしかできません。これstd::vectorは、連続したストレージを持ち、連続するストレージの場所間の依存関係がない唯一のコンテナ(私は思う)だからです(例とは異なりますstd::list)。でも、どうやってそうするのかわかりません。

アップデート

いくつかの実験(全体的な目標に関連する場合と関連しない場合があります)の後、ICCでは次のことがベクトル化されないことを発見しました

typedef std::vector<float> V;

V vec(4096);

for (V::iterator it = vec.begin(); it != vec.end(); ++it)
{
    *it *= *it;
}

一方、以下は行います。

V vec(4096);

V::iterator it2 = vec.end();
for (V::iterator it = vec.begin(); it != it2; ++it)
{
    *it *= *it;
}

明らかに、問題はそれほど多くのイテレータではありvec.end()ませんが、ループ本体がベクトル境界に影響を与えないことは明らかですが、ループ構造内への呼び出しは明らかに因数分解できません。

GCCでは、ベクトル化するものを何も取得できませんでした。GCCはSSEの機会を見つける点でICCよりもはるかに悪いので、これは驚くべきことではありません。

于 2011-02-13T10:55:02.013 に答える