当前位置: 首页 > 知识库问答 >
问题:

SIMD指令集有宏吗?

冯霖
2023-03-14

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

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

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个答案

裴英才
2023-03-14

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

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

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

 类似资料:
  • 9.3.2 取消宏定义伪指令 伪指令PURGE的一般格式如下: PURGE 宏名1, 宏名2, …… 该伪指令通知汇编程序取消“宏名1, 宏名2, ……”宏名表中的宏定义。在此语句后,如果还有这些宏的引用语句,则汇编程序不会把它们当作宏引用来进行扩展,并且还将显示出错信息。 伪指令PURGE的使用频率较低。 9.3.3 中止宏扩展伪指令 伪指令EXITM的一般格式如下: EXITM 该伪指令书写在

  • 9.3 与宏有关的伪指令 在宏定义时,为了满足某种特殊需要,汇编语言还提供了几个伪指令。 9.3.1 局部标号伪指令LOCAL 在宏定义体中,如果存在标号,则该标号要用伪指令LOCAL说明为局部标号,否则,当在源程序中,有多于一次引用该宏时,汇编程序在进行宏扩展后将会给出:标号重复定义的错误。 伪指令LOCAL的一般格式如下: LOCAL 标号1, 标号2, …… 伪指令LOCAL必须是伪指令MA

  • 问题内容: 我需要大致了解一下在高性能数字代码中使用Cython可以获得的性能。我感兴趣的一件事是找出优化的C编译器是否可以向量化Cython生成的代码。因此,我决定编写以下小示例: 我知道有Numpy函数可以完成这项工作,但是我想编写一个简单的代码来了解Cython的功能。事实证明,生成的代码是: 并致电: 生成一个看起来像这样的C代码循环: 此代码的主要问题是,编译器在编译时不知道数组的元素在

  • 问题内容: 如何监视进程的SIMD(SSE,AVX,AVX2,AVX-512)指令使用量?例如,可用于监视常规CPU使用率,但不能监视SIMD指令使用率。 问题答案: 我认为,对 所有 SIMD指令(不仅仅是FP数学)进行计数的唯一可靠方法是动态检测(例如,通过诸如Intel PIN / SDE之类的方法)。 请参阅如何通过获取指令类型明细来表征工作负载?以及如何确定在C程序中执行的x86机器指令

  • 在C/C中,可以对SIMD(如AVX和AVX2)指令使用内部函数。有没有办法在Rust中使用SIMD?

  • 伪指令 DW 定义字(2字节). PROC 定义过程. ENDP 过程结束. SEGMENT 定义段. ASSUME 建立段寄存器寻址. ENDS 段结束. END 程序结束.