GCC為什么不把a*a優化到(a*a)*(a*a)?我在做一些關于科學應用的數值優化。我注意到的一件事是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“,它使用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也有類似的行為。為什么編譯器不認識這個優化技巧?
GCC為什么不把a*a優化到(a*a)*(a*a)?
慕桂英4014372
2019-07-03 17:52:41