Я делаю некоторую численную оптимизацию в научном приложении. Я заметил, что GCC оптимизирует вызов pow(a,2)
, компилируя его в a*a
, но вызов pow(a,6)
не оптимизирован и фактически вызовет библиотечную функцию pow
, что значительно замедляет производительность. (Напротив, Компилятор Intel С++, исполняемый 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
while, если я напишу (a*a*a)*(a*a*a)
, он произведет
movapd %xmm14, %xmm13
mulsd %xmm14, %xmm13
mulsd %xmm14, %xmm13
mulsd %xmm13, %xmm13
который уменьшает количество команд умножения до 3. icc
имеет схожее поведение.
Почему компиляторы не признают этот трюк оптимизации?