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

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

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

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

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

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

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

在我看来,唯一的方法是编译和运行一个程序,以识别AVX是否可用。 然后手动或自动编译带或不带AVXfunction的单独代码。 对于VS 2013,我会在下面的commomAVX文件夹中使用我的代码来识别hasAVX(或不使用),并使用它来执行两个不同的BAT文件之一来编译和链接相应的程序。

http://www.roylongbottom.org.uk/gigaflops-benchmarks.zip

我的问题是帮助确定有关使用合适的编译选项的解决方案,例如/ arch:AVX。