gpt4 book ai didi

c++ - VS2015 与 VS2013 中的不同优化导致浮点异常

转载 作者:塔克拉玛干 更新时间:2023-11-03 02:15:15 26 4
gpt4 key购买 nike

我有一个从 VS2013 到 VS2015 的过渡过程中出现的问题的小例子。在VS2015中进一步提到代码示例导致浮点无效操作。

enter image description here

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;
}

这只发生在 Release模式下,所以它可能是由不同的优化引起的。此代码有问题还是 VS 2015 中的错误?

很难在整个代码库中找到像这样的问题,所以我正在寻找一些系统的修复而不是解决方法(例如,使用不同的变量而不是有效的 i )

我还检查了生成的汇编代码,它似乎在 VS2013 中使用整个 128 位注册表在一个分区中执行 4 个浮点运算。在 VS2015 中,它似乎只执行 2 个浮点操作,其余注册表为零(或一些垃圾),这可能会引入此异常。

导致异常的指令已在图中标出。

VS2013 VS2013

和VS2015 enter image description here

任何帮助将不胜感激。谢谢。

最佳答案

这看起来是使用浮点异常与您进行交互,但也启用了一些浮点优化。

代码正在做的是一次进行 2 次迭代(循环展开),但使用 divps 一次进行 4 次除法(来自 XMM 寄存器中的 4 个 float )。 XMM 寄存器中的上部 2 个 float 未使用,并且为零。由于不使用这些插槽中的值的划分结果,因此通常无关紧要。但是,当您设置自定义异常处理时,这会引发您看到的无效操作异常,即使它生成的值不会被使用。

如我所见,您的选择是设置/fp:strict,这将禁用优化以使其工作(但它显然会使代码变慢)或删除 controlfp 调用。

关于c++ - VS2015 与 VS2013 中的不同优化导致浮点异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39974255/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com