76

私はいくつかの行列計算を最適化しようとしています.SSE/SSE2/AVX/AVX2/AVX-512/AVX-128-FMA/KCVI [1]がコンパイラ?GCC と Clang には理想的ですが、そのうちの 1 つしか管理できません。

それが可能かどうかはわかりませんが、おそらく独自のマクロを使用しますが、それを検出してユーザーに選択するように依頼することをお勧めします。


[1]「KCVI」は Knights Corner Vector Instruction Optimizations の略です。FFTW のようなライブラリは、これらの新しい命令の最適化を検出/利用します。

4

2 に答える 2

114

ほとんどのコンパイラは自動的に次を定義します。

__SSE__
__SSE2__
__SSE3__
__AVX__
__AVX2__

など、渡すコマンドラインスイッチに応じて。これは、次のように gcc (または clang などの gcc 互換コンパイラ) で簡単に確認できます。

$ gcc -msse3 -dM -E - < /dev/null | egrep "SSE|AVX" | sort
#define __SSE__ 1
#define __SSE2__ 1
#define __SSE2_MATH__ 1
#define __SSE3__ 1
#define __SSE_MATH__ 1

また:

$ gcc -mavx2 -dM -E - < /dev/null | egrep "SSE|AVX" | sort
#define __AVX__ 1
#define __AVX2__ 1
#define __SSE__ 1
#define __SSE2__ 1
#define __SSE2_MATH__ 1
#define __SSE3__ 1
#define __SSE4_1__ 1
#define __SSE4_2__ 1
#define __SSE_MATH__ 1
#define __SSSE3__ 1

または、特定のプラットフォームのデフォルト ビルドの定義済みマクロを確認するには:

$ gcc -dM -E - < /dev/null | egrep "SSE|AVX" | sort
#define __SSE2_MATH__ 1
#define __SSE2__ 1
#define __SSE3__ 1
#define __SSE_MATH__ 1
#define __SSE__ 1
#define __SSSE3__ 1

最近の Intel プロセッサは、モノリシックな命令セットではない AVX-512 をサポートしています。以下の 2 つの例で、GCC (バージョン 6.2) から利用可能なサポートを確認できます。

ナイツ ランディングは次のとおりです。

$ gcc -march=knl -dM -E - < /dev/null | egrep "SSE|AVX" | sort
#define __AVX__ 1
#define __AVX2__ 1
#define __AVX512CD__ 1
#define __AVX512ER__ 1
#define __AVX512F__ 1
#define __AVX512PF__ 1
#define __SSE__ 1
#define __SSE2__ 1
#define __SSE2_MATH__ 1
#define __SSE3__ 1
#define __SSE4_1__ 1
#define __SSE4_2__ 1
#define __SSE_MATH__ 1
#define __SSSE3__ 1

Skylake AVX-512 は次のとおりです。

$ gcc -march=skylake-avx512 -dM -E - < /dev/null | egrep "SSE|AVX" | sort
#define __AVX__ 1
#define __AVX2__ 1
#define __AVX512BW__ 1
#define __AVX512CD__ 1
#define __AVX512DQ__ 1
#define __AVX512F__ 1
#define __AVX512VL__ 1
#define __SSE__ 1
#define __SSE2__ 1
#define __SSE2_MATH__ 1
#define __SSE3__ 1
#define __SSE4_1__ 1
#define __SSE4_2__ 1
#define __SSE_MATH__ 1
#define __SSSE3__ 1

Intel は追加の AVX-512 サブセットを公開しました ( ISA 拡張を参照)。GCC (バージョン 7) は、AVX-512 の 4FMAPS、4VNNIW、IFMA、VBMI、および VPOPCNTDQ サブセットに関連付けられたコンパイラ フラグとプリプロセッサ シンボルをサポートします。

for i in 4fmaps 4vnniw ifma vbmi vpopcntdq ; do echo "==== $i ====" ; gcc -mavx512$i -dM -E - < /dev/null | egrep "AVX512" | sort ; done
==== 4fmaps ====
#define __AVX5124FMAPS__ 1
#define __AVX512F__ 1
==== 4vnniw ====
#define __AVX5124VNNIW__ 1
#define __AVX512F__ 1
==== ifma ====
#define __AVX512F__ 1
#define __AVX512IFMA__ 1
==== vbmi ====
#define __AVX512BW__ 1
#define __AVX512F__ 1
#define __AVX512VBMI__ 1
==== vpopcntdq ====
#define __AVX512F__ 1
#define __AVX512VPOPCNTDQ__ 1

SSE マクロは Visual C++ では機能しないことに注意してください。代わりに を使用する必要があります_M_IX86_FP

于 2015-03-09T10:25:26.777 に答える