8

如何使用 Delphi 2007 检查一个盒子是否支持 AVX。

我的问题仅限于查询 CPU 中的支持(假设操作系统正常/带有 SP1 的 Windows 7)。

由 Chris Lomont撰写的题为Intel® Advanced Vector Extensions 简介的 PDF 文档 解释了如何做到这一点,并提供了一个示例代码实现,但使用 c++。

它也可以在这个页面上找到

4

1 回答 1

13

这是英特尔博客上给出的汇编代码的翻译:

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 添加了注册保存代码。

于 2012-03-30T11:50:28.520 回答