处理速度的向量类库

Posted

技术标签:

【中文标题】处理速度的向量类库【英文标题】:Vector class library for processing speed 【发布时间】:2016-11-24 10:18:31 【问题描述】:

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

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

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

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

【问题讨论】:

我添加了一个新的标签:vector-class-library 用于与vector类库相关的问题。 【参考方案1】:

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

// 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 平台上运行,或者在完全不支持 VCL 的没有 SSE2 的 x86 平台上运行,您还需要使用 #if 保护 #include &lt;vectori128.h&gt;

【讨论】:

如果定义了__AVX2__,你实际上想要使用Vec32c,否则总是使用Vec16c(并让vectorclass headers在有用的地方使用SSE4.1/4.2 / SSSE3。)您想要在自己的代码中使用宏的唯一另一件事是检查 AVX512 并使用 Vec64c。矢量类库的主要目标之一是根据不同目标选项的可用性抽象不同内在函数的选择。 在我投赞成票之前进行了相当大的修改,但我现在很有信心它是正确的。我实际上使用过 VCL(和 contributed changes(尚未集成 AFAIK,我可能应该完善一下,以便 Agner 可以包含它们。))【参考方案2】:

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

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

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

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

【讨论】:

【参考方案3】:

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

https://github.com/vectorclass

【讨论】:

这段代码可以在运行时自动检测CPU指令集并选择合适的代码版本:github.com/vectorclass/version2/blob/master/…

以上是关于处理速度的向量类库的主要内容,如果未能解决你的问题,请参考以下文章

向量指令和标量指令

九. 常用类库向量与哈希6.哈希表及其应用

(向量对)与(向量对)C++的速度[关闭]

什么可以阻止多处理提高速度 - OpenMP?

Spark机器学习中ml和mllib中矩阵向量

带加速度的卡尔曼滤波器。状态或控制向量?