2017-04-25 108 views
4

我有一些產品代碼,內核實現了各種SIMD指令集,包括AVX,AVX2和AVX512。該代碼可以在目標機器上編譯成類似./configure --enable-proc=AVX CXXFLAGS="-mavx"的目標機器。在AVX上編譯帶有AVX2/AVX512內在函數的C++代碼

這也適用於暴露AVX intrinsics的Travis CI。我想至少編譯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機(英特爾酷睿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) 
^~~~~~~~~~~~~~~~ 

有一些方法來編譯代碼?我不在乎跑步,我只是想要一個煙霧測試。

+2

不知道它是否應該像這樣,但是如果我啓用'-march = haswell',您的特殊示例適用於我。 – Dolda2000

+0

正如函數的名稱(或Intel的文檔)所表明的那樣,您需要'-mfma'來告訴編譯器您想要爲這樣的目標進行編譯。或者當然有一些'-march ='標誌暗示着它。 –

回答

0

供應-march=sandybridge-march=haswell-march=knl使所有需要的功能翻譯的代碼。