Agner FogさんのVector Class Libraryを使用して、これをVisual Studioのコマンドラインに追加してください:-D__SSE4_2__ -D__XOP__
。
次に、Vec8f
などのAVXサイズのベクトルを8つの浮動小数点に使用します。 AVXを有効にしないでコンパイルすると、vectorf256e.h
というファイルが使用され、2つのSSEレジスタを持つAVXをエミュレートします。たとえば、次のように開始しVec256fe
からVec8f
継承:
class Vec256fe {
protected:
__m128 y0; // low half
__m128 y1; // high half
あなたは/arch:AVX -D__XOP__
でコンパイルする場合はVCLではなく、ファイルvectorf256.h
と1つのAVXレジスタを使用します。コンパイラスイッチの変更だけで、あなたのコードはAVXとSSEで動作します。
XOP
を使用しない場合は、-D__XOP__
を使用しないでください。
ピーター・コルドは、あなたがあなたの目標は、唯一の256ビットのロード/ストアを避けるためであれば、それは、これが以外で違いを生むだろうはっきりしていないのに、あなたはまだ(VEXエンコードされた命令をすることができ、彼の答えで指摘したようにいくつかの特別なケース)。その後、/arch:AVX -D__XOP__
でコンパイルし、この
Vec8f a;
Vec4f lo = a.get_low(); // a is a Vec8f type
Vec4f hi = a.get_high();
lo.store(&b[0]); // b is a float array
hi.store(&b[4]);
のようなベクトルクラスでそれを行うことができます。
別のオプションはVecnf
を使用して一つのソースファイルで、その後
//foo.cpp
#include "vectorclass.h"
#if SIMDWIDTH == 4
typedef Vec4f Vecnf;
#else
typedef Vec8f Vecnf;
#endif
を行うと、これは一つのソースファイルと3つの実行可能ファイルを作成することになり、この
cl /O2 /DSIMDWIDTH=4 foo.cpp /Fofoo_sse
cl /O2 /DSIMDWIDTH=4 /arch:AVX /D__XOP__ foo.cpp /Fofoo_avx128
cl /O2 /DSIMDWIDTH=8 /arch:AVX foo.cpp /Fofoo_avx256
のようにコンパイルされるだろう。それらをリンクするのではなく、/c
でそれらをコンパイルし、CPUディスパッチャを作成するだけです。 AMD以外でavx128を使用する理由がないと思ったので、XOP
をavx128と使用しました。
あるとは思いません。特定のプロセッサーのためにコンパイラーを見直すつもりはありません。 (Piledriverだけがそのバグを持っています。) – Mysticial
あなたが何かを引用するときに参考にしてください。そして、はい、これには解決策があります。 Agner Fogのベクタークラス。 'Vec8f'のようなAVXベクトルを使い、' -D__SSE4_2__ -D__XOP__'でコンパイルしてください。 –
256ビットを使用していますが実際には遅いですか?アラインメントの問題がありますか? –