我正在使用英特尔内在函数编写程序。我想使用_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,它显示了如何执行运行时检查,但我需要对当前机器进行静态的编译时检查。
答案 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。