gpt4 book ai didi

c++ - 了解 clang 循环优化

转载 作者:行者123 更新时间:2023-12-01 14:22:15 25 4
gpt4 key购买 nike

我有这段代码

#include  <cstdlib>
#include <time.h>

int sum () {
srand (time(NULL));
unsigned long extra = rand() % 10;
int sum = 0;
// #pragma nounroll. <<<< This makes no difference
for (int i = 0; i < 16 + extra; ++i) {
sum += i;
}
return sum;
}

对于 -O3,clang 将其优化为以下内容,这让我大吃一惊。 (注意没有任何分支)

我真的不明白如何证明这种优化的正确性。具体来说,使用两个看似神奇的数字(顺便说一句,在编译之间不会改变)似乎很神秘。此外,我猜你称这些为“随机”,但不是本着 rand() 的精神,不是吗?

sum():                                # @sum()
push rax
xor edi, edi
call time
mov edi, eax
call srand
call rand
cdqe
imul rcx, rax, 1717986919. # <<<< magic number
mov rdx, rcx
shr rdx, 63
sar rcx, 34
add ecx, edx
add ecx, ecx
lea ecx, [rcx + 4*rcx]
mov edx, eax
sub edx, ecx
neg ecx
add eax, ecx
add eax, 16
lea rcx, [rax - 1]
movabs rsi, 8589934590 # <<< magic number
add rsi, rax
imul rsi, rcx
shr rsi
lea eax, [rsi + rdx]
add eax, 15
pop rcx
ret

为了后代,gcc 产生了以下内容

sum():
sub rsp, 8
xor edi, edi
call time
mov rdi, rax
call srand
call rand
mov esi, 1
movsx rdx, eax
mov ecx, eax
imul rdx, rdx, 1717986919
sar ecx, 31
sar rdx, 34
sub edx, ecx
lea ecx, [rdx+rdx*4]
add ecx, ecx
sub eax, ecx
mov edx, eax
add eax, 16
movsx rcx, eax
cmp edx, -16
cmovne rsi, rcx
cmp eax, 18
jbe .L6
mov rdx, rsi
movdqa xmm1, XMMWORD PTR .LC0[rip]
pxor xmm0, xmm0
xor eax, eax
movdqa xmm3, XMMWORD PTR .LC1[rip]
shr rdx, 2
.L3:
movdqa xmm2, xmm1
add eax, 1
paddd xmm1, xmm3
paddd xmm0, xmm2
cmp eax, edx
jne .L3
movdqa xmm1, xmm0
mov rdi, rsi
psrldq xmm1, 8
and rdi, -4
paddd xmm0, xmm1
movsx rdx, edi
movdqa xmm1, xmm0
psrldq xmm1, 4
paddd xmm0, xmm1
movd eax, xmm0
cmp rsi, rdi
je .L1
.L5:
add eax, edx
add rdx, 1
cmp rcx, rdx
ja .L5
.L1:
add rsp, 8
ret
.L6:
xor edx, edx
xor eax, eax
jmp .L5
.LC0:
.long 0
.long 1
.long 2
.long 3
.LC1:
.long 4
.long 4
.long 4
.long 4

最佳答案

代码确实调用了rand,这就足够了。返回值将保存在 rax 寄存器中。如果你**将 2³² 除以 1717986919,你会得到 2.499999999126885,它非常接近 10/4...使用常量和移位来计算 % 10,而不必使用昂贵的 idiv 操作码。

之后,结果只是 1 + 2 + 3 ... + n 的算术级数的前 n 项之和,即 n(n + 1) / 2 .第二个魔数(Magic Number)与这个计算有关。

关于c++ - 了解 clang 循环优化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63585641/

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