是否有用于 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;
}

汇编

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

如您所见,它以某种方式发现支持 Avx 并且不包括分支。这是正常且定义明确的行为吗?

解决方法

Avx.IsSupported 是一项运行时功能,因为它需要动态检测实际运行代码的目标 CPU 的功能。

另一方面,#if 是一个编译时特性,条件编译。拥有 AVX 条件编译符号并假设目标 CPU 确实支持 AVX 并不是很有用。最好检查运行时并做出相应的行为。

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

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...