为什么std :: copy不能矢量化?

时间:2014-05-28 11:11:04

标签: c++ vectorization

考虑这个通用代码:

#include <cstdlib>
#include <ctime>
#include <algorithm>    // std::copy    

int main() {
    const int n=1024;
    float a1[n],a2[n];
    std::srand(std::time(0)); 
    for(int i=0;i<n;i++)      a2[i]=std::rand()/(float)RAND_MAX;
    std::copy(a2,a2+n,a1);
}

当我使用g++/gcc 4.8.1和Ubuntu上的-O3 -march=native -mtune=native标志进行编译时,我得到了与副本相对应的行无法向量,因为:

note: not vectorized: not enough data-refs in basic block.

如果我使用

for(int i=0;i<n;i++)      a1[i]=a2[i];

我也得到相同的编译器消息。我有点不解。直觉我会想 两个非重叠数组之间的副本必须具有显着的矢量能力。能够 任何人解释为什么不是这种情况(并最终提供修复) 不可否认,这不是我的代码中的瓶颈,我主要是为了理解错误消息的意思。)

1 个答案:

答案 0 :(得分:3)

您的代码似乎很好,而且只是一条“信息”消息:请参阅http://gcc.gnu.org/bugzilla/show_bug.cgi?id=57579。在那里,类似的代码将被另一种方法矢量化,因此第二个矢量化代码会吐出信息消息,它无法再次进行矢量化。