g ++は__restrict__
ポインターを実装しますが、イテレーターについては何も見つかりませんでした。私の全体的な目的は、コンパイラーにstlループをベクトル化するように促すことです。
編集:
コンパイラーがベクトル化できない場合でも、__restrict__
キーワードは、ループ内で不要なリロードが不要であることをコンパイラーに通知できる必要があります。
g ++は__restrict__
ポインターを実装しますが、イテレーターについては何も見つかりませんでした。私の全体的な目的は、コンパイラーにstlループをベクトル化するように促すことです。
編集:
コンパイラーがベクトル化できない場合でも、__restrict__
キーワードは、ループ内で不要なリロードが不要であることをコンパイラーに通知できる必要があります。
あなたの直接の質問に対する答えはわかりません。ただし、コンパイラは、のループをベクトル化することしかできません。これ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よりもはるかに悪いので、これは驚くべきことではありません。