考虑这个通用代码:
#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];
我也得到相同的编译器消息。我有点不解。直觉我会想 两个非重叠数组之间的副本必须具有显着的矢量能力。能够 任何人解释为什么不是这种情况(并最终提供修复) 不可否认,这不是我的代码中的瓶颈,我主要是为了理解错误消息的意思。)
答案 0 :(得分:3)
您的代码似乎很好,而且只是一条“信息”消息:请参阅http://gcc.gnu.org/bugzilla/show_bug.cgi?id=57579。在那里,类似的代码将被另一种方法矢量化,因此第二个矢量化代码会吐出信息消息,它无法再次进行矢量化。