如果CPU支持AVX扩展,如何检查Intel内在函数?

Jan*_*rek 7 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
Run Code Online (Sandbox Code Playgroud)

?我找到了这个教程,它展示了如何执行运行时检查,但我需要对当前机器进行静态的编译时检查.

Z b*_*son 6

GCC,ICC,MSVC和Clang都定义了一个__AVX__可以检查的宏 .事实上,它是所有这些编译器定义的唯一SIMD常量(MSVC是打破模具的那个).这只会告诉您代码是否使用AVX支持编译(例如-mavx with GCC或/ arch:AVX with MSVC)它不会告诉您CPU是否支持AVX.如果您想知道CPU是否支持AVX,您需要检查CPUID.这里,asm-in-c-error是从所有这些编译器读取CPUID的示例.

为了做到这一点,我建议你做一个CPU调度员.

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


VHa*_*avy 5

我假设您使用的是英特尔C++编译器.在这种情况下 - 是的,有这样的宏:英特尔C++编译器参考指南:__AVX__, __AVX2__.

PS请注意,如果您在启用AVX指令集的情况下编译应用程序,则在不支持AVX的CPU上将失败.如果您要将软件作为源代码包分发并在目标机器上进行编译 - 这可能是一个可行的解决方案.否则,您应该动态检查AVX.

PPS ICC有几种选择.查看以下编译器选项以及从中引用其他选项.