编译AVX2支持并运行

时间:2015-01-06 00:02:16

标签: macos avx

我有一个非常大的库,我想用AVX2支持编译它(但我的处理器支持inly AVX)。该库还具有内部运行时检查处理器是否支持AVX2。像这样:

#if __AVX2__
if (support_avx2)
{
    // vectorized code
}
#endif
// simple C++ code

我能够使用AVX2支持编译库,但是当我运行测试时,我从一开始就得到了:

Illegal instruction: 4

有什么想法吗? 目标是使用所有可用的优化和功能编译库,并在运行时检查它们。

P.S。我正在研究OSX

3 个答案:

答案 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