¿Por qué GCC no optimiza a * a * a * a * a * a a (a * a * a) * (a * a * a)?
Estoy haciendo una optimización numérica en una aplicación científica. Una cosa que noté es que GCC optimizará la llamadapow(a,2)
compilándolo ena*a
, pero la llamadapow(a,6)
no está optimizado y en realidad llamará a la función de bibliotecapow
, lo que ralentiza enormemente el rendimiento. (A diferencia de,ompilador @Intel C ++, ejecutableicc
, eliminará la llamada a la biblioteca parapow(a,6)
.)
Lo que me interesa es que cuando reemplacépow(a,6)
cona*a*a*a*a*a
usando GCC 4.5.1 y las opciones "-O3 -lm -funroll-loops -msse4
", utiliza 5mulsd
instrucciones:
movapd %xmm14, %xmm13
mulsd %xmm14, %xmm13
mulsd %xmm14, %xmm13
mulsd %xmm14, %xmm13
mulsd %xmm14, %xmm13
mulsd %xmm14, %xmm13
mientras escribo(a*a*a)*(a*a*a)
, producirá
movapd %xmm14, %xmm13
mulsd %xmm14, %xmm13
mulsd %xmm14, %xmm13
mulsd %xmm13, %xmm13
que reduce el número de instrucciones de multiplicación a 3.icc
tiene un comportamiento similar.
¿Por qué los compiladores no reconocen este truco de optimización?