某些服务器上的第一条浮点指令导致VS-2019程序崩溃

我有一项运行了多年的代码的服务。

现在使用VS-2019 16.3.7 / 8/9,在某些机器上服务的启动阶段,我在第一个浮点算术上得到了一个0xC000001D(该线程试图执行无效指令。)异常。

安装使用16.2.4 / 5编译的相同代码库。

我在一台计算机上有一个完整的内存崩溃转储。崩溃发生在调用_dtol3上。

我可以在汇编代码中看到这种情况。

0149477B 83 3D B4 AC 55 01 06 cmp         dword ptr [__isa_available (0155ACB4h)],6  
01494782 7C 15                jl          _dtol3_default (01494799h)  
01494784 C5 FA 7E C0          vmovq       xmm0,xmm0  
01494788 62 F1 FD 08 7A C0    vcvttpd2qq  xmm0,xmm0  <---- CRASH

__isa_available的值为6。在我的计算机上,该值为5。一台可以看到崩溃的计算机是Xeon Silver 4110,该计算机运行了虚拟化的软件。同一exe在Xeon E5-2620上运行。相同的exe可以在我公司的所有客户端计算机上运行,​​而不会出现任何问题(新旧Intel机器混合使用)。

看看被调用的代码,我发现将值与大于或等于1.0的值进行比较将值加倍是简单的区别和除法。

COleDateTime nowClient = COleDateTime::getcurrentTime(),nowDB = getcurrentTime();
COleDateTimeSpan diff = nowDB-nowClient;
if (diff.GetTotalMinutes()>=1)  // <----- CRASH
    ...

是否有任何方法可以影响VS中的代码创建,从而避免调用此代码? (任何垫片,兼容性设置)

自VS 16.2.4以来,VS-2019中是否存在任何影响浮动数学的已知变化,可能会影响我的问题?

wnyangbo 回答:某些服务器上的第一条浮点指令导致VS-2019程序崩溃

这是Visual Studio 16.3.x更新中的错误。这是指向bug report的链接。

仔细阅读它,它实际上发生在支持AVX512的计算机上,而不是最初的帖子中描述的较旧的CPU。在Microsoft得到修复之前,它还包含一些解决方法,可以避免该问题。

,

您可以在其“属性”表中为每个项目启用或禁用“高级”指令的生成:

  1. 在解决方案资源管理器中右键单击该项目,然后从弹出菜单中选择“属性”。
  2. 选择/打开左侧窗格中的“ C / C ++”选项卡,然后选择“代码生成”项。
  3. 然后在右侧窗格中显示的属性列表中,为“已启用的增强指令集”属性选择“未设置”(或使用任何一个选项将为您提供与目标PC兼容的代码)。
  4. li>

编译器使用vmovq意味着(至少)启用了“高级矢量扩展”;另外,我认为(不是100%肯定)vcvttpd2qq属于“ AVX2”类别。

本文链接:https://www.f2er.com/3124980.html

大家都在问