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

时间:2014-06-17 09:42:12

标签: 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,它显示了如何执行运行时检查,但我需要对当前机器进行静态的编译时检查。

3 个答案:

答案 0 :(得分:6)

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

为了做到这一点,我建议您制作CPU dispatcher

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

答案 1 :(得分:5)

我假设您使用的是英特尔C ++编译器。在这种情况下 - 是的,有这样的宏:Intel C++ Compiler Reference Guide__AVX____AVX2__

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

P.P.S。 ICC有几种选择。查看following compiler options以及从中引用其他内容。

答案 2 :(得分:0)

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

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

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