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

men*_*raz 7 delphi delphi-2007 avx basm

如何使用Delphi 2007检查盒子是否支持AVX.

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

由Chris Lomont 撰写的题为"英特尔®高级矢量扩展简介 "的PDF文档解释了如何执行此操作,并提供了一个示例代码实现,但在c ++中.

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

Dav*_*nan 12

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

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;
Run Code Online (Sandbox Code Playgroud)

此代码适用于32位和64位版本的Delphi.

更新:注册保存代码,感谢@PhiS.

  • 辉煌!希望我能+1 +1. (3认同)