【问题标题】: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 指令。

标签: delphi delphi-2007 avx basm


【解决方案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 ...
猜你喜欢
  • 1970-01-01
  • 2010-10-14
  • 1970-01-01
  • 1970-01-01
  • 2021-08-25
  • 1970-01-01
  • 1970-01-01
  • 2016-01-23
  • 1970-01-01
相关资源
最近更新 更多