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

4

考虑以下通用代码:

#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];

我也收到了同样的编译器信息。我有点困惑。直觉上,我认为两个不重叠的数组之间的复制必须是可以向量化的。有人能解释为什么不是这种情况吗(最终提供一个修复方案,尽管承认这不是我代码中的瓶颈,我主要是为了理解该错误信息)?

2
你的代码太破碎和不完整,无法重现结果。请更新为可以编译的内容。 - Fred Foo
@larsmans:好的,我现在明白了(抱歉我想简短一些)。现在这样更好吗? - user189035
如果您使用memmove()会怎样? - John Zwinck
1
请参见 https://gcc.gnu.org/bugzilla/show_bug.cgi?id=57579。看起来你的代码没问题,这只是一条“信息”消息。 - MP24
@MP24:太棒了,谢谢!你能把这个发成一个答案吗?我会很乐意接受的! - user189035
显示剩余2条评论
1个回答

3

看起来你的代码没问题,只是一个“信息”消息:请参阅http://gcc.gnu.org/bugzilla/show_bug.cgi?id=57579。在那里,类似的代码将通过另一种方法进行矢量化,因此第二个矢量化代码会输出无法矢量化的信息消息(再次)。


谢谢!这解决了部分谜团。然而,虽然我可以看出在std::copy函数中会发生什么,但当执行'for(int i=0;i<n;i++) a1[i]=a2[i];'时,我并不清楚会发生什么。 - user189035
1
你看过生成的 ASM 代码了吗?请参考 https://dev59.com/BoDba4cB1Zd3GeqPASfc,其中包含了向量化调用的 ASM 输出。你可能想比较一下 std::copy 和手动复制的 ASM 输出。 - MP24

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接