私は、AVX、AVX2、AVX512などのさまざまなSIMD命令セット用にカーネルを実装しています。コードは、./configure --enable-proc=AVX CXXFLAGS="-mavx"
のようなもので、ターゲットマシンのターゲットマシン上でコンパイルすることができます。AVXのAVX2/AVX512コンパイラ組み込み関数を使用したC++コード
これは、AVX組み込み関数を公開するTravis CIでもうまくいきます。すべてのファイルがチェックインされているかどうかを確認するために、少なくともAVX2とAVX512のバージョンをコンパイルしたいと思いますが、別のISA用にコンパイルするのは簡単ではないようです。
簡単なAVX2のテストプログラム:私のAVXマシン(インテルCore i5-2520M)で
#include <immintrin.h>
int main(int argc, char **argv) {
__m256d a;
__m256d b;
__m256d c;
_mm256_fnmadd_pd(a, b, c);
}
、それがコンパイルされません:
$ 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)
^~~~~~~~~~~~~~~~
は、コードをコンパイルするためにいくつかの方法はありますか?私は走っているのを気にしない、ただ煙のテストがほしい。
そういうことになっているのかどうかはわかりませんが、 '-march = haswell'を有効にすると、あなたの特定の例が私に役立ちます。 – Dolda2000
関数の名前(またはIntelのドキュメント)に示されているように、そのようなターゲットに対してコンパイルしたいことをコンパイラに伝えるには '-mfma'が必要です。もちろん、それを意味する '-march ='フラグもあります。 –