首页 > 试题广场 >

当用带命令行选项 “-O2” 的GCC来编译combine3

[问答题]
当用带命令行选项 “-O2” 的GCC来编译combine3时,得到的代码CPE性能远好于使用-01时的:

由此得到的性能与combine4相当,不过对于整数求和的情况除外,虽然性能已经得到了显著的提高,但还是低于combine4。在检查编译器产生的汇编代码时,我们发现对内循环的一个有趣的变化:
.L22:
vmulsd (%rdx),%xmm0,%xmm0
addq   $8,%rdx
cmpq   %rax,%rax
vmovsd %xmm0,(%rbx)
jne    .L22
把上面的代码与用优化等级1产生的代码进行比较:
.L17:
vmovsd (%rbx),%xmm0
vmulsd (%rdx),%xmm0,%xmm0
vmovsd %xmm0,(%rbx)
addq   $8,%rdx
cmpq   %rax,%rdx
jne    .L17
我们看到,除了指令顺序有些不同,唯一的区别就是使用更优化的版本不含有vmovsd指令,它实现的是从dest指定的位置读数据(第2行)。
A.寄存器%xmn0的角色在两个循环中有什么不同?
B.这个更优化的版本忠实地实现了combine3 的C语言代码吗(包括在dest和向量数据之间使用内存别名的时候)?

 C.解释为什么这个优化保持了期望的行为,或者给出一个例子说明它产生了与使用较少优化的代码不同的结果。

 

这道题你会答吗?花几分钟告诉大家答案吧!