使用Agner Fog的Vector Class Library並將其添加到Visual Studio的命令行:-D__SSE4_2__ -D__XOP__
。
然後使用AVX大小的矢量,例如Vec8f
用於八個浮點數。如果在沒有啓用AVX的情況下編譯,它將使用文件vectorf256e.h
,該文件用兩個SSE寄存器模擬AVX。例如從Vec256fe
Vec8f
繼承它開始像這樣:
class Vec256fe {
protected:
__m128 y0; // low half
__m128 y1; // high half
如果用/arch:AVX -D__XOP__
編譯VCL將改爲使用文件vectorf256.h
和一個AVX寄存器。然後,只有編譯器切換更改,您的代碼才能用於AVX和SSE。如果您不想使用XOP
請不要使用-D__XOP__
。
正如彼得·柯德斯在他的回答中指出,如果你的目標僅僅是爲了避免256位加載/存儲,那麼你可能還是要VEX編碼指令(雖然目前還不清楚這將使除差異一些特殊情況)。你可以做到這一點與Vector類這樣
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]);
然後用/arch:AVX -D__XOP__
編譯。
另一種選擇是是使用Vecnf
,然後做
//foo.cpp
#include "vectorclass.h"
#if SIMDWIDTH == 4
typedef Vec4f Vecnf;
#else
typedef Vec8f Vecnf;
#endif
和編譯這樣
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調度器。我用XOP
與avx128,因爲我認爲除了在AMD上使用avx128是沒有充分理由的。
我不認爲有。他們不會爲一個特定的處理器檢修他們的編譯器。 (只有Piledriver有這個bug。) – Mysticial
當你引用某些東西時,你應該給一個參考。是的,這有一個解決方案。 Agner霧的矢量類。使用'Vec8f'等AVX矢量,並用'-D__SSE4_2__ -D__XOP__'進行編譯。 –
你使用256位實際上比較慢嗎?你有沒有對齊問題? –