提问人:user5406764 提问时间:10/16/2023 最后编辑:user5406764 更新时间:10/16/2023 访问量:183
C++ 循环融合似乎没有发生
C++ loop fusion does not seem to happen
问:
考虑两个函数,func_a func_b,它们产生等效的结果:
int func_a(int const* const arr)
{
int sum1 = 0;
for (int i = 0; i < 200; ++i)
sum1 += arr[i];
int sum2 = 0;
for (int i = 0; i < 200; ++i)
sum2 += arr[i];
return sum1 + sum2;
}
int func_b(int const* const arr)
{
int sum1 = 0;
int sum2 = 0;
for (int i = 0; i < 200; ++i)
{
sum1 += arr[i];
sum2 += arr[i];
}
return sum1 + sum2;
}
看看他们生成的程序集 (g++ 13.2 std=c++20 -Ofast):
func_a(int const*):
lea rdx, [rdi+800]
mov rax, rdi
pxor xmm0, xmm0
.L2:
movdqu xmm3, XMMWORD PTR [rax]
add rax, 16
paddd xmm0, xmm3
cmp rax, rdx
jne .L2
movdqa xmm1, xmm0
psrldq xmm1, 8
paddd xmm0, xmm1
movdqa xmm1, xmm0
psrldq xmm1, 4
paddd xmm0, xmm1
movdqa xmm1, xmm0
pxor xmm0, xmm0
.L3:
movdqu xmm4, XMMWORD PTR [rdi]
add rdi, 16
paddd xmm0, xmm4
cmp rdi, rdx
jne .L3
movdqa xmm2, xmm0
psrldq xmm2, 8
paddd xmm0, xmm2
movdqa xmm2, xmm0
psrldq xmm2, 4
paddd xmm0, xmm2
paddd xmm0, xmm1
movd eax, xmm0
ret
func_b(int const*):
lea rax, [rdi+800]
pxor xmm0, xmm0
.L8:
movdqu xmm2, XMMWORD PTR [rdi]
add rdi, 16
paddd xmm0, xmm2
cmp rax, rdi
jne .L8
movdqa xmm1, xmm0
psrldq xmm1, 8
paddd xmm0, xmm1
movdqa xmm1, xmm0
psrldq xmm1, 4
paddd xmm0, xmm1
movd eax, xmm0
add eax, eax
ret
Q1:为什么func_a中的两个环路没有融合?
作为参考,手动融合的func_b显示了我希望func_a的优化版本是什么。
答: 暂无答案
上一个:如何阻止循环结束得太快?
评论
-march=...