Testing 出于测试目的禁用CPU中的AVX2
我有一个需要AVX2才能正常工作的应用程序。执行了一个检查,以在应用程序启动期间检查CPU是否有AVX2指令。我想检查它是否工作正常,但我只有一个CPU有AVX2。有没有办法暂时关闭它以进行测试?或者以某种方式模拟其他CPU?是的,使用“模拟”(或动态重新编译)层,比如QEMU SDE是一款开源的免费软件,无论是在旧CPU上测试AVX512代码,还是模拟旧CPU以检查是否意外执行过新的指令,SDE都非常方便 示例:我碰巧有一个二进制文件无条件地使用AVX2Testing 出于测试目的禁用CPU中的AVX2,testing,x86,avx,instruction-set,avx2,Testing,X86,Avx,Instruction Set,Avx2,我有一个需要AVX2才能正常工作的应用程序。执行了一个检查,以在应用程序启动期间检查CPU是否有AVX2指令。我想检查它是否工作正常,但我只有一个CPU有AVX2。有没有办法暂时关闭它以进行测试?或者以某种方式模拟其他CPU?是的,使用“模拟”(或动态重新编译)层,比如QEMU SDE是一款开源的免费软件,无论是在旧CPU上测试AVX512代码,还是模拟旧CPU以检查是否意外执行过新的指令,SDE都非常方便 示例:我碰巧有一个二进制文件无条件地使用AVX2vpmovzxwqload指令(对于我正
vpmovzxwq
load指令(对于我正在测试的函数)。它在我的Skylake CPU上本机运行良好,但SDE有一个-snb
选项,可以在CPUID中模拟Sandybridge并实际检查每条指令
$ sde64 -snb -- ./mask
TID 0 SDE-ERROR: Executed instruction not valid for specified chip (SANDYBRIDGE): 0x401005: vpmovzxwq ymm2, qword ptr [rip+0xff2]
Image: /tmp/mask+0x5 (in multi-region image, region# 1)
Instruction bytes are: c4 e2 7d 34 15 f2 0f 00 00
有一些选项可以模拟旧的CPU,如-quark
、-p4
(SSE2)或Core 2 Merom(-mrm
),以及新的IceLake服务器(-icx
)或Tremont(-tnt
)。(以及像KNL和KNM这样的Xeon Phi CPU。)
它运行得非常快,使用了动态重新编译(JIT),所以我认为,只使用本机支持的指令的代码基本上可以以本机速度运行
它还具有指令插入选项(如-mix
以转储指令混合),以及更紧密地控制JIT的选项。我认为您可以让它不在CPUID中报告AVX2,但仍然让AVX2指令运行而不出错
或者可能模拟一个支持AVX2但不支持FMA的CPU(不幸的是,Via有这样一个真正的CPU)。或者是没有真正CPU的组合,比如AVX2但不是popcnt
,或者BMI1/BMI2但不是AVX。但我还没有研究如何做到这一点
基本的sde-help
选项仅允许您将其设置为特定的英特尔CPU,并用于检查可能较慢的SSE/AVX转换(没有正确的vzeroupper使用)。还有其他一些事情
SDE缺少的一个重要测试用例是没有AVX2的AVX+FMA(AMD Piledriver/Steamroller,即大多数AMD FX系列CPU)。很容易忘记并在应该是AVX1+FMA3的代码中使用AVX2 shuffle,一些编译器(如MSVC)在编译时不会像gcc-march=bdver2
那样捕捉到这一点。(推土机只有AVX+FMA4,而不是FMA3,因为英特尔在AMD重新设计太晚后改变了他们的计划。)
如果您只是希望CPUID不报告AVX2(和FMA?)的存在,因此您的代码使用其AVX1或非AVX版本的函数,那么您可以在大多数虚拟机上这样做
要使AVX指令在没有故障的情况下运行,必须在控制寄存器中设置一位。(因此,这就像操作系统承诺的那样,它将正确地保存/恢复YMM上半部分的新体系结构状态)。因此,在CPUID中禁用AVX将为您提供一个AVX指令出错的VM实例。(至少256位指令?我还没有尝试过,看看128位AVX指令是否仍然可以在支持AVX的硬件上以这种状态执行。)如果Peter的解决方案不适合您,一些BIOS也允许您禁用AVX2。