在CPU中禁用AVX2以进行测试

问题描述 投票:8回答:1

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

testing x86 avx instruction-set avx2
1个回答
5
投票

是的,使用像Intel's Software Development Emulator (SDE)或QEMU这样的“仿真”(或动态重新编译)层。

SDE是封闭源免费软件,非常方便用于在旧CPU上测试AVX512代码,或模拟旧CPU以检查您是否意外执行过于新的指令。

示例:我碰巧有一个无条件使用AVX2 vpmovzxwq加载指令的二进制文件(对于我正在测试的函数)。它在我的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 

可以选择模拟像-quark-p4(SSE2)或Core 2 Merom(-mrm)一样古老的CPU,以及像IceLake-Server(-icx)或Tremont(-tnt)一样新的CPU。 (和Xeon Phi CPU一样,如KNL和KNM。)

它使用动态重新编译(JIT)运行得非常快,因此我认为仅使用本机支持的指令的代码可以基本上以本机速度运行。

它还具有检测选项(如-mix转储指令组合),以及更紧密地控制JIT的选项。我想你可能不会在CPUID中报告AVX2,但仍然让AVX2指令运行而没有错误。

或者可能模拟支持AVX2但不支持FMA的CPU(遗憾的是,有一个像Via这样的真实CPU)。或没有真正CPU的组合,如AVX2但不是popcnt,或BMI1 / BMI2但不是AVX。但我还没有研究过如何做到这一点。

基本的sde -help选项只允许您将其设置为特定的Intel CPU,并用于检查可能较慢的SSE / AVX转换(没有正确的vzeroupper使用)。还有其他一些事情。

缺少SDE的一个重要测试案例是没有AVX2的AVX + FMA(AMD Piledriver / Steamroller,即大多数AMD FX系列CPU)。很容易忘记并使用AVX2 shuffle代码应该是AVX1 + FMA3,而一些编译器(如MSVC)在编译时不会像gcc -march=bdver2那样捕获它。 (推土机只有AVX + FMA4,而不是FMA3,因为英特尔改变了他们的计划,因为AMD重新设计为时已晚。)


如果您只是希望CPUID不报告AVX2(和FMA?)的存在,那么您的代码使用其AVX1或非AVX版本的功能,您可以对大多数VM执行此操作。

要使AVX指令在没有故障的情况下运行,必须设置控制寄存器中的一个位。 (因此,这就像操作系统的承诺一样,它将正确保存/恢复YMM上半部分的新架构状态)。因此,在CPUID中禁用AVX将为您提供AVX指令出错的VM实例。 (至少256位指令?我没有试过这个看看128位AVX指令是否仍然可以在支持AVX的HW上以此状态执行。)

© www.soinside.com 2019 - 2024. All rights reserved.