亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

GCC為什么不把a*a優化到(a*a)*(a*a)?

GCC為什么不把a*a優化到(a*a)*(a*a)?

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也有類似的行為。為什么編譯器不認識這個優化技巧?
查看完整描述

3 回答

?
慕田峪4524236

TA貢獻1875條經驗 獲得超5個贊

因為浮點數學不是相聯的..在浮點乘法中將操作數分組的方式對答案的數值精度有影響。

因此,大多數編譯器對于重新排序浮點計算是非常保守的,除非他們能夠確保答案保持不變,或者除非你告訴他們你不在乎數值的準確性。例如:這個-fassociative-math期權GCC的理論,它允許GCC重新使用浮點運算,甚至是-ffast-math該選項允許在準確性和速度上進行更積極的權衡。


查看完整回答
反對 回復 2019-07-03
?
桃花長相依

TA貢獻1860條經驗 獲得超8個贊

另一種類似的情況:大多數編譯器不會優化a + b + c + d(a + b) + (c + d)(這是一種優化,因為第二個表達式可以更好地流水線化)并按給定(即(((a + b) + c) + d))。這也是因為角落案件:

float a = 1e35, b = 1e-5, c = -1e35, d = 1e-5;printf("%e %e\n", a + b + c + d, (a + b) + (c + d));

這輸出1.000000e-05 0.000000e+00


查看完整回答
反對 回復 2019-07-03
  • 3 回答
  • 0 關注
  • 735 瀏覽

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號