gpt4 book ai didi

gcc - 为什么for循环比预期多1条指令?

转载 作者:行者123 更新时间:2023-12-03 15:51:36 34 4
gpt4 key购买 nike

我写了很多矢量化循环,所以 1 个常见的习惯用法是

volatile int dummy[1<<10];
for (int64_t i = 0; i + 16 <= argc; i+= 16) // process all elements with whole vector
{
int x = dummy[i];
}
// handle remainder (hopefully with SIMD too)

但是生成的机器代码比我想要的多1条指令(使用gcc 4.9)
.L3:
leaq -16(%rax), %rdx
addq $16, %rax
cmpq %rcx, %rax
movl -120(%rsp,%rdx,4), %edx
jbe .L3

如果我将代码更改为 for (int64_t i = 0; i <= argc - 16; i+= 16) ,然后是“额外”
指令消失了:
.L2:
movl -120(%rsp,%rax,4), %ecx
addq $16, %rax
cmpq %rdx, %rax
jbe .L2

但为什么会有所不同呢?我在想可能是由于循环不变量,但太模糊了。然后我注意到在 5 指令情况下,增量是在加载之前完成的,由于 x86 的破坏性 2 操作数指令,这将需要额外的 mov。
所以另一种解释可能是它是 1 条额外指令的交易指令并行性。

虽然看起来几乎不会有任何性能差异,但有人可以解释这个谜吗(最好是知道编译器转换的人)?

理想情况下,我想保留 i + 16 <= size 形式,因为它具有更直观的含义(向量的最后一个元素不会越界)

最佳答案

argc低于 -2147483632 和 i低于 2147483632,表达式 i+16 <= argc将需要产生算术上正确的结果,而表达式和 i<argc-16不会。在这种极端情况下需要给出算术上正确的结果会阻止编译器优化前一个表达式以匹配后者。

关于gcc - 为什么for循环比预期多1条指令?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23575077/

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