Vector class 处理速度库

Vector class library for processing speed

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

我想知道如何 select 不同的向量 classes 例如 Vec16c(SSE2 指令集)和 Vec32c(AVX 指令集)。

我正在使用 Intel® Atom™ x5-Z8350 处理器,根据规格,它支持 SSE4.2 指令集。

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

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

// 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,该二进制文件在具有 AVX2 的 CPU 上仅 运行s。

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

32 字节向量需要 AVX。 (AVX2 用于 32B 整数向量,如 Vec32c)。由于您的 Atom 没有 AVX,因此不要包括 Agner 的 vectorclassi256.hvectorclassf256.h,只包括 128 headers.

使用 -march=native 编译以使编译器启用您的 host-CPU 支持的所有 instruction-sets。

Vec16c 函数的实现在启用时将自动使用 SSE4.2 内部函数,因为 Vectorclass 检查宏以查看启用的内容。因此,只需使用 Vec16c,您将自动获得目标支持的每个功能的最佳实现。

(这是真的,因为你正在做 compile-time CPU / 目标选项。如果你想做 run-time 调度自己,那就更难了。)

矢量 class 库已更新和改进。它被移动到 Github:

https://github.com/vectorclass