设置
尝试在 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;
}