C++ 处理速度矢量类库

C++ 处理速度矢量类库,c++,sse,simd,avx,vector-class-library,C++,Sse,Simd,Avx,Vector Class Library,我正在研究并行处理算法,以提高处理速度。 我想测试一下 我想知道如何选择不同的向量类,例如Vec16c(SSE2指令集)和Vec32c(AVX指令集) 我正在使用Intel®Atom™ x5-Z8350处理器,根据规格,它支持SSE4.2指令集 如何根据硬件支持有效地选择向量类? 比如说,对于我的处理器,我可以使用建议用于AVX指令集的Vec32c吗?您可以使用编译器定义的宏来检测为您编译的目标启用了哪些指令集,例如: // Assume SSE2 as a baseline #include

我正在研究并行处理算法,以提高处理速度。 我想测试一下

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

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

如何根据硬件支持有效地选择向量类?
比如说,对于我的处理器,我可以使用建议用于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
//假设SSE2是基线
#包括
#如果已定义(_AVX2__;)
#包括
使用向量_type=Vec32c;
#否则
//Vec16c使用启用的任何东西,因此您不必自己检查SSE4
使用向量_type=Vec16c;
#恩迪夫
这不会进行运行时检测,因此,如果您希望生成一个仅在具有AVX2的CPU上运行的二进制文件,请仅启用AVX2


如果您希望您的代码在非x86平台上工作,或者在不支持VCL的情况下在没有SSE2的x86平台上工作,则需要使用
#include
以及
#If
来保护

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

// 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
//假设SSE2是基线
#包括
#如果已定义(_AVX2__;)
#包括
使用向量_type=Vec32c;
#否则
//Vec16c使用启用的任何东西,因此您不必自己检查SSE4
使用向量_type=Vec16c;
#恩迪夫
这不会进行运行时检测,因此,如果您希望生成一个仅在具有AVX2的CPU上运行的二进制文件,请仅启用AVX2


如果您希望代码在非x86平台上工作,或者在不支持VCL的情况下在没有SSE2的x86平台上工作,则需要使用
#include
保护
#If

32字节向量需要AVX。(对于32B整数向量,如
Vec32c
,则为AVX2)。因为Atom没有AVX,所以不要包含Agner的
VectorClass256.h
vectorclassf256.h
,只包含
128

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

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


(这是正确的,因为您正在执行编译时CPU/目标选项。如果您想自己执行运行时调度,则会更加困难。)

32字节向量需要AVX。(对于32B整数向量,如
Vec32c
,则为AVX2)。因为Atom没有AVX,所以不要包含Agner的
VectorClass256.h
vectorclassf256.h
,只包含
128

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

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


(这是正确的,因为您正在执行编译时CPU/目标选项。如果您想自己执行运行时调度,则会更加困难。)

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


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


如果定义了
\uuuuu AVX2\uuuuu
,您实际上会想使用Vec32c,否则请始终使用
Vec16c
(并让vectorclass标头在有用的情况下使用SSE4.1/4.2/SSSE3)。在您自己的代码中对宏执行的唯一其他操作是检查AVX512并使用
Vec64c
。vectorclass库的主要目标之一是根据不同目标选项的可用性抽象选择不同的内部函数。在我对它进行升级之前,这进行了相当大的编辑,但我现在非常确信它是正确的。我实际上已经使用过VCL(而且(AFAIK还没有集成VCL,我可能应该改进一下,以便Agner能够包含它们。))如果定义了
\uuuuu AVX2\uuuuuu
,那么您实际上应该使用Vec32c,否则总是使用
Vec16c
(并且让vectorclass头在有用的地方使用SSE4.1/4.2/SSSE3。)在自己的代码中使用宏所要做的另一件事是检查AVX512并使用
Vec64c
。vectorclass库的主要目标之一是根据不同目标选项的可用性抽象选择不同的内部函数。在我对它进行升级之前,这进行了相当大的编辑,但我现在非常确信它是正确的。我实际上使用过VCL(和(AFAIK还没有集成,我可能应该改进一下,以便Agner可以包含它们)此代码可以在运行时自动检测CPU指令集并选择适当版本的代码:此代码可以在运行时自动检测CPU指令集并选择适当版本的代码:我已为与向量类库相关的问题添加了一个新标记:向量类库。我已添加了一个新的标记:向量类库,用于与向量类库相关的问题。