c - 如果 CPU 支持 AVX 扩展,如何使用 Intel intrinsics 检查?

标签 c intel intrinsics

我正在使用英特尔内在函数编写程序。我想使用 _mm_permute_pd 内在函数,它仅在具有 AVX 的 CPU 上可用。对于没有 AVX 的 CPU,我可以使用 _mm_shuffle_pd,但根据规范,它比 _mm_permute_pd 慢得多。英特尔内在函数的头文件是否定义了常量,使我能够区分是否支持 AVX,以便我可以这样编写:

#ifdef __IS_AVX_SUPPORTED__  // is there sth like this defined?
// use _mm_permute_pd
# else
// use _mm_shuffle_pd
#endif

?我找到了 this tutorial ,它展示了如何执行运行时检查,但我需要对当前机器执行静态的编译时检查。

最佳答案

GCC、ICC、MSVC 和 Clang 都定义了一个宏 __AVX__,您可以检查它。事实上,它是所有这些编译器定义的唯一 SIMD 常量 (MSVC is the one that breaks the mold)。这只会告诉您您的代码是否使用 AVX 支持进行编译(例如 -mavx 与 GCC 或/arch:AVX 与 MSVC)它不会告诉您您的 CPU 是否支持 AVX。如果你想知道 CPU 是否支持 AVX,你需要检查 CPUID。在这里,asm-in-c-error ,是一个从所有这些编译器读取 CPUID 的示例。

要正确执行此操作,我建议您制作一个 CPU dispatcher .

编辑:如果有人想知道如何使用 CPUID 的值来查明 AVX 是否可用,请参阅 https://github.com/Mysticial/FeatureDetector

关于c - 如果 CPU 支持 AVX 扩展,如何使用 Intel intrinsics 检查?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24260490/

相关文章:

c - ucontext.h 和 uc_link 没有从主线程返回

c - 使用移位运算符拆分大十进制数

c - 要求编译器在将数组传递给函数时将其视为数组(而不是指针)

c++ - 英特尔 TBB 性能

linux - 我做错了什么,还是英特尔显卡太烂了?

c++ - 在 gcc 中的内联汇编程序中出错

c++ - 从 64 位无符号整数初始化 __m128 类型

c - 如何将十六进制字符转换为\x90\x90这样的字节?

c++ - 如何混合 32 位整数?或 : Why is there no _mm256_blendv_epi32?

c - 为什么在使用内部函数时生成的程序集会重新排序?