如何探测英特尔® 高级矢量扩展的可用性?

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 ...

以上是关于如何探测英特尔® 高级矢量扩展的可用性?的主要内容,如果未能解决你的问题,请参考以下文章

沃趣科技MySQL高可用工具Orchestrator系列三:探测机制

查询云服务商可用区地域分布及 ping 值延迟

英特尔® 至强融核? 处理器优化教程

赋能开发者,英特尔发布oneAPI 2022工具包

zabbix前端添加平台脚本监控

Kubernetes如何管理pod更高可用