我正在对科学应用进行一些数值优化.我注意到的一件事是GCC会pow(a,2)
通过编译来优化调用a*a
,但调用pow(a,6)
没有优化,实际上会调用库函数pow
,这会大大降低性能.(相比之下,英特尔C++编译器,可执行文件icc
,将消除库调用pow(a,6)
.)
我很好奇的是,当我更换pow(a,6)
与a*a*a*a*a*a
使用GCC 4.5.1和选项" -O3 -lm -funroll-loops -msse4
",它采用5分mulsd
的说明:
movapd %xmm14, %xmm13
mulsd %xmm14, %xmm13
mulsd %xmm14, %xmm13
mulsd %xmm14, %xmm13
mulsd %xmm14, %xmm13
mulsd %xmm14, %xmm13
Run Code Online (Sandbox Code Playgroud)
如果我写(a*a*a)*(a*a*a)
,它会产生
movapd %xmm14, %xmm13
mulsd %xmm14, %xmm13
mulsd %xmm14, %xmm13
mulsd %xmm13, %xmm13
Run Code Online (Sandbox Code Playgroud)
这将乘法指令的数量减少到3. icc
具有类似的行为.
为什么编译器不能识别这种优化技巧?