我正在使用英特尔内在函数编写程序。我想使用 _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/