gpt4 book ai didi

c++ - 带展开循环的矢量化

转载 作者:太空狗 更新时间:2023-10-29 23:09:07 24 4
gpt4 key购买 nike

我正在使用 intel-cc 编译一些 C++ 代码,并且使用 -Wall 选项似乎对我的很多循环进行了矢量化。我正在假设这对目前的性能有好处。

现在我的问题是: if 而不是 for 循环我展开了它所以我们有例如

a[0] = b[0] + 1;
a[1] = b[1] + 1;
a[2] = b[2] + 1;

代替

for(int i=0;i<3;++i) a[i] = b[i] + 1;

编译器还能向量化这段代码吗?

此外,如果我使用引用访问元素,编译器是否有希望识别出这两者是等价的?例如

int &x, &y, &z;
x = a[0]; y = a[1]; z = a[2];

然后用 x、y 和 z 替换 a。

非常感谢任何答案!提前致谢。

最佳答案

所以我深入研究了三个简单案例生成的程序集。下面;

for(int i=0;i<3;++i) a[i] = 1.0; // case 1
a[0] = a[1] = a[2] = 1.0; // case 2
a.x = a.y = a.z = 1.0; // case 3

案例 2 和案例 3 生成的程序集是相同的。这很好,因为在情况 2 中,编译器给出了关于复制对临时引用的“注释”(operator[] 被我的类覆盖)这意味着(如果我错了请纠正我)编译器正确地利用了返回值优化( RVO)。

然而,在情况 1 中,编译器输出了一条注释,表明它已将循环向量化。组装也略有不同。具体来说,它包含这个额外的代码;

       .section .rodata, "a"
.align 16
.align 16
_2il0floatpacket.1:
.long 0x00000000,0x3ff00000,0x00000000,0x3ff00000
.type _2il0floatpacket.1,@object
.size _2il0floatpacket.1,16
_2il0floatpacket.2:
.long 0x00000000,0x3ff00000
.type _2il0floatpacket.2,@object
.size _2il0floatpacket.2,8

现在我从未使用过汇编,所以我不完全确定这些额外的东西是什么意思,但在我看来这意味着编译器无法在展开循环或通过引用访问的情况下进行矢量化。在编译时没有对此效果进行注释也暗示了这一点。

如果有人能证实这一点,那就太好了。

关于c++ - 带展开循环的矢量化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6572874/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com