[英]Different optimization in VS2015 vs VS2013 causes floating point exception
在從VS2013過渡到VS2015期間,我遇到了一個小問題。 在VS2015中進一步提到的代碼示例導致浮點無效操作。
int main()
{
unsigned int enableBits = _EM_OVERFLOW | _EM_ZERODIVIDE | _EM_INVALID;
_clearfp();
_controlfp_s(0, ~enableBits, enableBits);
int count = 100;
float array[100];
for (int i = 0; i < count; ++i)
{
array[i] = (float)pow((float)(count - 1 - i) / count, 4); //this causes exception in VS2015
}
return 0;
}
這僅在發布模式下發生,因此可能由不同的優化引起。 這段代碼有什么問題,或者這是VS 2015中的錯誤?
很難在整個代碼庫中找到這樣的問題所以我正在尋找一些系統的修復而不是解決方法(例如使用不同的變量而不是i工作)
我還檢查了生成的匯編代碼,在VS2013中它似乎使用整個128位注冊表在一個分區中執行4個浮點運算。 在VS2015中,它似乎只執行2次浮點運算,其余的注冊表為零(或一些垃圾)可能會引入此異常。
導致異常的指令在圖中標出。
任何幫助將不勝感激。 謝謝。
這看起來是使用浮點異常與您的交互,但也啟用了一些浮點優化。
代碼正在做的是它一次進行2次迭代(循環展開),但是使用divps,它同時進行4次除法(來自XMM寄存器中的4次浮點數)。 XMM寄存器中的上2個浮點數未使用,為零。 由於不使用這些插槽中的值的除法,因此通常不重要。 但是,當您設置自定義異常處理時,這會引發一個無效的op異常,即使它的生成值不會被使用,也會看到它。
正如我所看到的,您的選擇是設置/ fp:strict,這將禁用優化,因此使其工作(但顯然會使代碼變慢)或刪除controlfp調用。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.