如何探测英特尔® 高级矢量扩展的可用性?
Posted
技术标签:
【中文标题】如何探测英特尔® 高级矢量扩展的可用性?【英文标题】:How to probe the availability of Intel® Advanced Vector Extensions? 【发布时间】:2012-03-30 11:32:17 【问题描述】:如何使用 Delphi 2007 检查一个盒子是否支持 AVX。
我的问题仅限于查询 CPU 中的支持(假设操作系统正常/带有 SP1 的 Windows 7)。
标题为Introduction to Intel® Advanced Vector Extensions的PDF文档 by Chris Lomont 解释了如何做到这一点,并提供了一个示例代码实现,但在 c++ 中。
也可以通过page 获得。
【问题讨论】:
仅供参考,BASM(至少对于 Delphi XE2 而言)还不支持 AVX 指令。 【参考方案1】:这是Intel blog 上给出的汇编代码的翻译:
function isAvxSupported: Boolean;
asm
$IFDEF CPUX86
push ebx
$ENDIF
$IFDEF CPUX64
mov r10, rbx
$ENDIF
xor eax, eax
cpuid
cmp eax, 1
jb @not_supported
mov eax, 1
cpuid
and ecx, 018000000h
cmp ecx, 018000000h
jne @not_supported
xor ecx, ecx
db 0Fh, 01h, 0D0h //XGETBV
and eax, 110b
cmp eax, 110b
jne @not_supported
mov eax, 1
jmp @done
@not_supported:
xor eax, eax
@done:
$IFDEF CPUX86
pop ebx
$ENDIF
$IFDEF CPUX64
mov rbx, r10
$ENDIF
end;
此代码适用于 32 位和 64 位版本的 Delphi。
更新:感谢@PhiS 添加注册保存代码。
【讨论】:
谢谢大卫!我对这段代码的理解是Delphi不支持XGETBV
指令,是这样吗?
没错。我在这里找到了魔法数据库:qc.embarcadero.com/wc/qcmain.aspx?d=80128
祝你好运将它单独移植到 X64。 :-)
太棒了!希望我能 +1 2x。
David,此代码仅几乎适用于 x64 和 x86。问题是 CPUID 也设置了 EBX,所以你需要保存/恢复 EBX(因为 Delphi 需要这个)。现在,如果您通过 PUSH/POP EBX 执行此操作,则不会在 Win64 上编译,因为它需要 PUSH + reg64 ...以上是关于如何探测英特尔® 高级矢量扩展的可用性?的主要内容,如果未能解决你的问题,请参考以下文章