【发布时间】:2018-06-29 11:50:51
【问题描述】:
考虑以下代码:
void foo(int* __restrict__ a)
{
int i; int val = 0;
for (i = 0; i < 100; i++) {
val = 2 * i;
a[i] = val;
}
}
这个complies(具有最大优化但没有展开或矢量化)到...
GCC 7.2:
foo(int*):
xor eax, eax
.L2:
mov DWORD PTR [rdi], eax
add eax, 2
add rdi, 4
cmp eax, 200
jne .L2
rep ret
叮当声 5.0:
foo(int*): # @foo(int*)
xor eax, eax
.LBB0_1: # =>This Inner Loop Header: Depth=1
mov dword ptr [rdi + 2*rax], eax
add rax, 2
cmp rax, 200
jne .LBB0_1
ret
GCC 与 clang 方法的优缺点是什么?即一个额外的变量单独递增,而不是通过更复杂的寻址模式相乘?
注意事项:
- 这个问题也与this one 相关,代码大致相同,但使用
float而不是int。
【问题讨论】:
-
@harold:好的,解决了。
-
当然不是乘法,而是移位。以前由专用 AGU 免费执行。如果更新的 CPU 使性能变得更差,我会感到惊讶。
-
@BoPersson:所以比例因子只能是 2 的幂?另外,如果您说,出于这个原因,最好以这种方式进行循环,请在回答中这样说。
-
比例因子只能是 2、4 或 8,并且是专门为 C 等语言中的数组索引而设计的。我的经验可以追溯到有一个单独的地址生成单元并且这些计算已经完成的时候“在一边”,免费。我不知道有关当前 CPU 的足够详细信息,但会相信 Peter Cordes 的回答。 :-)
-
比例因子也可以是 1 或 0,尽管 0 的作用不同。 1 仍然是一个刻度。
标签: gcc assembly clang x86-64 micro-optimization