我有一个非常大的库,我想用AVX2支持编译它(但我的处理器支持inly AVX)。该库还具有内部运行时检查处理器是否支持AVX2。像这样:
#if __AVX2__
if (support_avx2)
{
// vectorized code
}
#endif
// simple C++ code
我能够使用AVX2支持编译库,但是当我运行测试时,我从一开始就得到了:
Illegal instruction: 4
有什么想法吗? 目标是使用所有可用的优化和功能编译库,并在运行时检查它们。
P.S。我正在研究OSX
答案 0 :(得分:2)
在只有AVX(例如Sandy Bridge / Ivy Bridge)的CPU上运行AVX2代码并不容易。您可以使用Intel's SDE来运行代码以进行测试(这实际上非常适用于命令行可执行文件),但是可能更容易获得用于开发和测试的Haswell Mac。
答案 1 :(得分:1)
基本上你可以使用cpuid检查cpu是否支持你想要使用的功能,然后使用它跳转到代码。
在
#if __AVX2__
仅与您正在编译的机器有关,通常由编译器标志设置。
答案 2 :(得分:1)
如果您只编译AVX2,您的编译器会假定它可以在需要时使用AVX2。您必须编译要使用的最低通用硬件,然后检查可用的硬件,然后将函数设置为指向使用该硬件编译的目标文件中的相应函数。这是CPU dispatcher。这是一个懒惰的调度员:
//foo.cpp
#if __AVX2__
void foo_AVX2() {
//AVX2 code
//make sure to call zeroupper!!!
}
#else
void foo_AVX2();
void foo() {
//simple C++ code
}
int main(void) {
bool support_avx2 = detect_AVX2();
if (support_avx2) {
foo_AVX2();
}
else {
foo();
}
}
#endif
然后像这样编译:
g++ -c -O3 -mavx2 foo.cpp -o foo_AVX2.o
g++ -O3 foo.cpp foo_AVX2.o