Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/actionscript-3/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Testing 出于测试目的禁用CPU中的AVX2_Testing_X86_Avx_Instruction Set_Avx2 - Fatal编程技术网

Testing 出于测试目的禁用CPU中的AVX2

Testing 出于测试目的禁用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指令(对于我正

我有一个需要AVX2才能正常工作的应用程序。执行了一个检查,以在应用程序启动期间检查CPU是否有AVX2指令。我想检查它是否工作正常,但我只有一个CPU有AVX2。有没有办法暂时关闭它以进行测试?或者以某种方式模拟其他CPU?

是的,使用“模拟”(或动态重新编译)层,比如QEMU

SDE是一款开源的免费软件,无论是在旧CPU上测试AVX512代码,还是模拟旧CPU以检查是否意外执行过新的指令,SDE都非常方便

示例:我碰巧有一个二进制文件无条件地使用AVX2
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。