Я занимаюсь численной оптимизацией научного приложения.Одна вещь, которую я заметил, заключается в том, что 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
", он использует 5 mulsd
инструкций:
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
ведет себя аналогично.
Почему компиляторы не распознают этот прием оптимизации?