提高处理速度的矢量类库

bat*_*man 1 c++ sse simd avx vector-class-library

我正在研究并行处理算法以提高处理速度。\n我想测试Agner Fog\ 的矢量类库 VCL

\n\n

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

\n\n

我使用的是 Intel\xc2\xae Atom\xe2\x84\xa2 x5-Z8350 处理器,根据规格,它支持 SSE4.2 指令集。

\n\n

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

\n

Jon*_*nas 5

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

// 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
Run Code Online (Sandbox Code Playgroud)

这不会进行运行时检测,因此如果您想制作仅在具有 AVX2 的 CPU 上运行的二进制文件,则仅启用 AVX2。

如果您希望您的代码在非 x86 平台上工作,或者在没有 SSE2 的 x86 平台(根本不支持 VCL)上工作,那么您还需要#include <vectori128.h>使用 来保护。#if