用于处理速度的矢量类库

时间:2016-11-24 10:18:32

标签: c++ sse simd avx

我正在研究并行处理算法以提高处理速度。 我想测试Agner Fog's vector class library, VCL

我想知道如何选择不同的向量类,例如Vec16c(SSE2指令集)和Vec32c(AVX指令集)。

我使用的是英特尔®凌动™x5-Z8350处理器,根据规格,它支持SSE4.2指令集。

如何在硬件支持方面有效地选择矢量类? 对我的处理器说,我可以使用推荐用于AVX指令集的Vec32c吗?

3 个答案:

答案 0 :(得分:3)

您可以使用编译器定义的宏来检测为您正在编译的目标启用的指令集,例如:

// Assume SSE2 as a baseline
#include  <vectori128.h>

#if defined(__AVX2__)
#include  <vectori256.h>
using vector_type = Vec32c;
#else
// Vec16c uses whatever is enabled, so you don't have to check for SSE4 yourself
using vector_type = Vec16c;
#endif

这不执行运行时检测,因此如果要生成仅在具有AVX2的CPU上运行的二进制文件,则仅启用AVX2。

如果您希望您的代码在非x86平台上运行,或者在没有SSE2且不支持VCL的情况下使用x86,则还需要使用#include <vectori128.h>来保护#if

答案 1 :(得分:3)

32字节向量需要AVX。 (和AVX2一样,用于32B整数向量,如Vec32c)。由于您的Atom没有AVX,请不要包含Agner的vectorclassi256.hvectorclassf256.h,只包含128标题。

使用-march=native进行编译,以使编译器启用主机CPU支持的所有指令集。

Vec16c函数的实现将在启用时自动使用SSE4.2内在函数,因为Vectorclass会检查宏以查看启用了什么。所以只需使用Vec16c,您就会自动获得目标支持的每个函数的最佳实现。

(这是正确的,因为你正在进行编译时的CPU /目标选项。如果你想自己进行运行时调度,那就更难了。)

答案 2 :(得分:0)

向量类库已更新和改进。它已移至Github:

https://github.com/vectorclass