我有一个Windows x64 C ++程序,由MSVC 12编译而没有AVX支持(没有/ arch:编译选项中的AVX)。
我在Win7上收到了一位客户使用Core i7 4700MQ的崩溃报告。异常代码是c000001d(非法指令),异常偏移指向sin()函数内的“vmovd r9,xmm0”指令。我和这个用户尝试了两种不同的构建,在这两种情况下它都指向同一条指令。
看起来msvc库版本的sin()内在函数具有特殊的AVX代码路径,即使在没有AVX支持的情况下进行编译也是如此。这段代码在没有AVX的旧款i3处理器上运行良好。
那么在这个特定的i7上会导致这个异常的原因是什么?对于拥有大量CPU的许多客户而言,相同的代码运行没有任何问题。
也许AVX可以在操作系统设置/ BIOS中以某种方式禁用,而sin()代码无法检查这个?或者也许有一些操作系统更新增加了AVX支持,没有它任何AVX代码触发c000001d?
答案 0 :(得分:0)
如果代码在动态链接的库中,则代码的编译选项不重要。 dll很可能根据cpuid的返回值调度到不同的实现,以确定avx是否可用,如果没有则返回sse版本。
vmovd r9,xmm0
对我来说,看起来像是对corei7的法律指示。