使用阿格纳雾矢量类库 http://www.agner.org/optimize/#vectorclass并将其添加到 Visual Studio 中的命令行:-D__SSE4_2__ -D__XOP__
.
然后使用 AVX 大小的向量,例如Vec8f
八个花车。当您在未启用 AVX 的情况下进行编译时,它将使用该文件vectorf256e.h
它使用两个 SSE 寄存器模拟 AVX。例如Vec8f
继承自Vec256fe
它是这样开始的:
class Vec256fe {
protected:
__m128 y0; // low half
__m128 y1; // high half
如果你编译/arch:AVX -D__XOP__
VCL 将使用该文件vectorf256.h
和一个 AVX 寄存器。然后,您的代码只需更改编译器开关即可适用于 AVX 和 SSE。
如果你不想使用XOP
不要使用-D__XOP__
.
正如 Peter Cordes 在他的回答中指出的那样,如果您的目标只是避免 256 位加载/存储,那么您可能仍然需要 VEX 编码指令(尽管目前还不清楚这是否会产生影响,除非在某些特殊情况下)。你可以用这样的向量类来做到这一点
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。