【发布时间】:2017-10-23 23:51:39
【问题描述】:
我正在尝试确定一种有效的方法来检测英特尔和 AMD 处理器上的 AVX 和 AVX2 的可用性。在阅读英特尔软件开发人员手册第一卷(使用 XSAVE 功能集管理状态,第 310 页时,我有点惊讶地发现它更接近 SSE 和 XSAVE )。
英特尔在Is AVX enabled? 上发布了一些用于检测 AVX 可用性的代码。代码如下所示,它不会太痛苦。问题是,Visual Studio 是一个痛点,因为我们需要将代码从 C/C++ 文件移到 X64 的 ASM 文件中。
其他人似乎正在采用SIGILL 方法来检测 AVX 可用性。或者他们在不知不觉中使用了SIGILL 方法。例如,请参阅SIGILL on AVX instruction。
我的问题是,使用 SIGILL 方法检测 AVX 可用性是否安全?此处,“安全” 表示当 CPU 和操作系统支持 AVX 时,AVX 指令将生成SIGILL;否则它将生成SIGILL。
下面的代码是针对 32 位机器的,它来自英特尔博客 Is AVX enabled? 让我担心的是操纵控制寄存器。读取和写入某些 X86 和 ARM 控制寄存器有时需要超级用户/管理员权限。这是我更喜欢SIGILL 的原因(并避免使用控制寄存器)。
; int isAvxSupported();
isAvxSupported proc
xor eax, eax
cpuid
cmp eax, 1 ; does CPUID support eax = 1?
jb not_supported
mov eax, 1
cpuid
and ecx, 018000000h ; check 27 bit (OS uses XSAVE/XRSTOR)
cmp ecx, 018000000h ; and 28 (AVX supported by CPU)
jne not_supported
xor ecx, ecx ; XFEATURE_ENABLED_MASK/XCR0 register number = 0
xgetbv ; XFEATURE_ENABLED_MASK register is in edx:eax
and eax, 110b
cmp eax, 110b ; check the AVX registers restore at context switch
jne not_supported
supported:
mov eax, 1
ret
not_supported:
xor eax, eax
ret
isAvxSupported endp
【问题讨论】:
-
您查看过手册吗?我相信这段代码不需要提升权限。如果
xgetbv这样做,你为什么不检查手册? -
相关问题,但它的编译时间检测;未运行时检测:How to detect SSE/AVX/AVX2 availability at compile-time?