c# - 有SIMD指令集的宏吗?

标签 c# simd intrinsics

是否有可用于指令集检测的宏?

我知道我们有运行时的:

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 受到支持并且不包含分支。这是正常且明确的行为吗?

最佳答案

Avx.IsSupported是一个运行时功能,因为它需要动态检测实际运行代码的 objective-c PU的功能。

另一方面,#if是一个编译时功能,条件编译。拥有 AVX 条件编译符号然后假设 objective-c PU 支持 AVX 并没有多大用处。最好检查运行时并采取相应的行为。

但是,如果您确实需要使用条件编译,则可以随时声明自己的符号。

关于c# - 有SIMD指令集的宏吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66920843/

相关文章:

c# - 如何在多个连接场景中显示枚举值?

c# - 打开窗口(或对话框)以阻止主窗口而不停止进一步的说明

gcc - 为什么这个SSE2程序(整数)生成movaps(浮点)?

c++ - 加速收集

使用 SIMD 将 AoS 转换为 C 中的 SoA

c# - 加速像素格式转换 - BGR packed to RGB planar

arm - 将 8 位 uint8_t 加载为 uint32_t?

c# - 计算有多少种方法可以将三个数字相加使它们等于 1000

C# 应用程序未在 UDPClient.Receive 上接收数据包

x86 - 使用 SIMD 提取位