在AVX架构上使用AVX2/AVX512指令集编译C++代码

12

我的生产代码实现了多种SIMD指令集的内核,包括AVX、AVX2和AVX512。可以使用类似 ./configure --enable-proc=AVX CXXFLAGS="-mavx" 的命令在目标机器上为其编译。

这在Travis CI上也能很好地工作,它公开了AVX指令集。为了确认所有文件都已检入,我想至少编译AVX2和AVX512版本。但是,似乎为不同的ISA进行编译并不那么容易。

一个简单的AVX2测试程序:

#include <immintrin.h>

int main(int argc, char **argv) {
    __m256d a;
    __m256d b;
    __m256d c;

    _mm256_fnmadd_pd(a, b, c);
}

在我的AVX机器上(Intel Core i5-2520M),它无法编译:

$ g++ -Wall -Wpedantic --std=c++11 cpp.cpp -mavx2
In file included from /usr/lib/gcc/x86_64-redhat-linux/6.3.1/include/immintrin.h:79:0,
                 from cpp.cpp:3:
/usr/lib/gcc/x86_64-redhat-linux/6.3.1/include/fmaintrin.h:143:1: error: inlining failed in call to always_inline '__m256d _mm256_fnmadd_pd(__m256d, __m256d, __m256d)': target specific option mismatch
 _mm256_fnmadd_pd (__m256d __A, __m256d __B, __m256d __C)
 ^~~~~~~~~~~~~~~~

有没有什么方法可以编译这段代码?我不关心运行,只想进行一次简单测试。


3
不确定是否应该这样,但如果我启用“-march = haswell”,您的特定示例对我有效。 - Dolda2000
根据函数名称(或英特尔文档)的含义,您需要使用“-mfma”来告诉编译器您想要为这样的目标进行编译。当然,也可以使用某些隐含它的“-march =”标志。 - Marc Glisse
1个回答

8

提供-march=sandybridge-march=haswell-march=knl参数可以启用所有需要的功能以翻译代码。


在目标上编译时使用 -march=native 怎么样? - Vincent Alex

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接