GCC为什么不把a*a优化到(a*a)*(a*a)?我在做一些关于科学应用的数值优化。我注意到的一件事是GCC会优化通话pow(a,2)把它编译成a*a,但是那个电话pow(a,6)没有优化,实际上将调用库函数。pow,这大大降低了表演的速度。(相比之下,Intel C+编译器,可执行icc,将消除图书馆对pow(a,6).)我好奇的是当我pow(a,6)带着a*a*a*a*a*a使用GCC 4.5.1和选项“-O3 -lm -funroll-loops -msse4“,它使用5mulsd指示:movapd %xmm14, %xmm13
mulsd %xmm14, %xmm13
mulsd %xmm14, %xmm13
mulsd %xmm14, %xmm13
mulsd %xmm14, %xmm13
mulsd %xmm14, %xmm13如果我写(a*a*a)*(a*a*a),它会产生movapd %xmm14, %xmm13
mulsd %xmm14, %xmm13
mulsd %xmm14, %xmm13
mulsd %xmm13, %xmm13这将乘法指令的数量减少到3。icc也有类似的行为。为什么编译器不认识这个优化技巧?
3 回答
慕田峪4524236
TA贡献1875条经验 获得超5个赞
-fassociative-math
-ffast-math
桃花长相依
TA贡献1860条经验 获得超8个赞
a + b + c + d
(a + b) + (c + d)
(((a + b) + c) + d)
float a = 1e35, b = 1e-5, c = -1e35, d = 1e-5;printf("%e %e\n", a + b + c + d, (a + b) + (c + d));
1.000000e-05 0.000000e+00
添加回答
举报
0/150
提交
取消