我正在对科学应用程序进行一些数值优化。我注意到的一件事是 GCC 会优化调用pow(a,2)
通过将其编译成a*a
,但是调用pow(a,6)
没有优化,实际会调用库函数pow
,这大大降低了性能。 (相比之下,英特尔 C++ 编译器 http://en.wikipedia.org/wiki/Intel_C++_Compiler, 可执行文件icc
,将消除图书馆的要求pow(a,6)
.)
我好奇的是当我更换pow(a,6)
with 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
有类似的行为。
为什么编译器不能识别这个优化技巧?