【问题标题】:Are there macros for SIMD instruction sets?SIMD指令集有宏吗?
【发布时间】:2021-06-29 09:58:27
【问题描述】:

有没有可以用于指令集检测的宏?

我知道我们有运行时的:

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

【问题讨论】:

  • 编译器指令的问题在于它们被检查编译时间(c# => MSIL)所以你需要知道你正在为哪个目标系统编译。
  • @JeroenvanLangen MSVC 没有宏 __AVX__?他们如何预测?
  • @Hrant C/C++ AFAIK 是按平台编译生成可执行文件,而 C# 编译结果是 IL 代码,稍后将在客户端计算机上(通过 JIT)处理
  • @harold 随机问题:如果我有多个 ifs 每次都检查相同的东西,那不会比只获取一次 cpuid 的宏效率低吗? (我假设这就是您对 使用宏进行条件编译 的意思)...我想我可以存储 bool 并重用它。
  • Is this a normal and well defined behaviour? 是的。

标签: c# simd intrinsics


【解决方案1】:

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

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

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

【讨论】:

  • 我认为 VS 有用于 C/C++ 的 __AVX__ 宏。那是如何工作的?
  • @Hrant 它不测试支持,它是一个构建配置。按照 .NET 的 AnyCPU 与 x86 与 x64 构建的思路思考... C++ 项目可以具有 x86、不带 AVX 的 x64、带 AVX 的 x64 等的配置。您当然可以在 C# 项目中做同样的事情,但是那么您需要安装程序中的逻辑来决定是将带-AVX 还是不带AVX 文件复制到计算机。 (而且C++也可以做运行时检查,通常在做完测试后通过设置函数指针来处理,所以单独的函数有两个版本,不需要自己做运行时检查)
  • @Hrant:C++ 被提前编译为机器代码。如果您使用/arch:AVX 构建以告诉编译器生成假定支持AVX 的代码,它将预先定义__AVX__,因此您的C++ 代码也可以假定支持AVX 并执行诸如使用内在函数之类的事情。如果您不关心在没有 AVX 的机器上运行,这是最有效的编译方式。 (例如,如果您正在为您的云服务器构建可执行文件。但不幸的是,MSVC 没有 gcc -O3 -march=native 等价物来启用构建主机支持的所有内容;它是围绕一个二进制文件模型设计的。)
猜你喜欢
  • 2014-06-20
  • 1970-01-01
  • 2011-07-16
  • 2022-01-20
  • 2017-04-07
  • 2019-06-18
  • 2016-08-28
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多