首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为测试目的在CPU中禁用AVX2

为测试目的在CPU中禁用AVX2
EN

Stack Overflow用户
提问于 2019-04-19 13:07:08
回答 1查看 5K关注 0票数 13

我有一个要求AVX2正确工作的应用程序。实现了一个检查,以检查应用程序启动期间是否有AVX2指令。我想检查它是否正确工作,但我只有有AVX2的CPU。为了测试目的,有没有办法暂时关闭它?或者以某种方式模仿其他CPU?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-04-19 15:11:50

是的,使用“仿真”(或动态重新编译)层,比如英特尔的软件开发模拟器(SDE),或者QEMU。

SDE是一种封闭源代码的免费软件,既可以在旧CPU上测试AVX512代码,也可以模拟旧CPU来检查您是否意外地执行了太新的指令。

示例:我碰巧有一个二进制文件,它无条件地使用AVX2 vpmovzxwq load指令(对于我正在测试的函数)。它在我的Skylake上运行得很好,但是SDE有一个-snb选项来模拟CPU中的沙桥,并实际检查每条指令。

代码语言:javascript
复制
 $ 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)或Core2Merom (-mrm)这样的CPU,或者像IceLake (-icx)或Tremont (-tnt)那样新。(以及Xeon Phi CPU,如KNL和KNM.)

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

它还有一些工具选项(比如-mix来转储指令组合),以及更紧密地控制JIT的选项。我认为您可以让它在CPUID中不报告AVX2,但仍然让AVX2指令运行而不会出错。

或者模仿支持AVX2的CPU,但不支持FMA (不幸的是,Via有这样的一个真正的CPU )。或者没有真正CPU的组合,比如AVX2,但不是popcnt,或者BMI1 1/BMI1 2,而不是AVX。但我还没想过该怎么做。

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

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

如果您只希望CPUID不报告AVX2的存在(以及FMA?)因此,您的代码使用它的AVX1或非AVX版本的函数,您可以在大多数VM中做到这一点。

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

票数 12
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/55762372

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档