考虑以下通用代码:
#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);
}
当我在Ubuntu上使用
g++/gcc 4.8.1
编译,并使用-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];
我也收到了同样的编译器信息。我有点困惑。直觉上,我认为两个不重叠的数组之间的复制必须是可以向量化的。有人能解释为什么不是这种情况吗(最终提供一个修复方案,尽管承认这不是我代码中的瓶颈,我主要是为了理解该错误信息)?