提问者:小点点

SIMD指令集有宏吗?


有没有我们可以用来进行指令集检测的宏?

我知道我们有运行时程序:

if (Avx.IsSupported)
{
//...
}

但我们是否已经定义了这方面的符号,例如。

#if AVX
//...
#endif

如果没有,我们可以创建一个或我们有一个解决办法吗?

  • 在玩反编译器的时候,我发现了一个奇怪的“递归”。但我想ILSpy漏了。
.method public hidebysig specialname static 
    bool get_IsSupported () cil managed 
{
    // Method begins at RVA 0x142fa4
    // Code size 6 (0x6)
    .maxstack 8

    // return IsSupported;
    IL_0000: call bool System.Runtime.Intrinsics.X86.Avx::get_IsSupported()
    IL_0005: ret
} // end of method Avx::get_IsSupported
  • 此外,当我查看一个简单的ASM代码时,我注意到以下内容:
public int F() 
{
    if (Avx.IsSupported)
        return 0;
    if (Avx2.IsSupported)
        return 1;

    return 2;
}

ASM

Program.F()
    L0000: xor eax, eax
    L0002: ret

正如您所看到的,它不知怎么弄明白了Avx是受支持的,并且不包括分支。这是正常和明确的行为吗?


共1个答案

匿名用户

avx.issupport是一个运行时特性,因为它需要动态检测实际运行代码的目标CPU的功能。

另一方面,#if是一个编译时特性,即条件编译。使用avx条件编译符号,然后假定目标CPU支持AVX,这实际上是没有用的。最好在运行时检查并相应地执行操作。

但是,如果您真的需要使用条件编译,您总是可以声明自己的符号。