2

設定

GCC 4.6.3 でコードをベクトル化しようとすると、奇妙な動作が発生します。

以下は、単純な追加を実行する 3 つの異なる方法を使用するスニペット コードです。

  • loopFunc() はポインターを使用します。
  • loopFunc2() は、operator[] 経由で直接アクセスされる STL ベクトルを使用します。
  • loopFunc3() は STL ベクトル反復子を使用します。

.cpp スニペット コードは、次の行でコンパイルされます。

g++ -o snippet-tree-vectorize -fdump-tree-optimized -ftree-vectorizer-verbose=2 -O2 -ftree-vectorize snippet.cpp

質問:

  • loopFunc() と loopFunc3() は GCC によってベクトル化されます (-ftree-vectorizer-verbose=2 で簡単にチェックできます)
  • loopFunc2() はベクトル化されません。

誰かがそれについて説明してくれますか?

typedef int data_type;

void loopFunc(data_type* d1,const data_type* d2,const data_type* d3) 
{
    for (int i = 0; i < HUGE-1; i++)
            d1[i] = d2[i] + d3[i];
}

void loopFunc2(std::vector<data_type>& d1,const std::vector<data_type>& d2,const std::vector<data_type>& d3) 
{
    for (int i = 0; i < HUGE-1; i++)
            d1[i] = d2[i] + d3[i];
}

void loopFunc3(std::vector<data_type>& d1,const std::vector<data_type>& d2,const std::vector<data_type>& d3) 
{
    std::vector<data_type>::iterator it1 = d1.begin();
    std::vector<data_type>::const_iterator it2 = d2.begin();
    std::vector<data_type>::const_iterator it3 = d3.begin();
    for(; it1 != d1.end(); it1++,it2++,it3++)
            *it1 = *it2 + *it3;
}

int main() 
{
    std::vector<data_type> d1(HUGE, 0); 
    std::vector<data_type> d2(HUGE, 1); 
    std::vector<data_type> d3(HUGE, 2); 

    loopFunc(&d1[0],&d2[0],&d3[0]);
    loopFunc2(d1,d2,d3);
    loopFunc3(d1,d2,d3);

    return 0;
}
4

0 に答える 0