我正在研究并行处理算法,以提高处理速度。我想测试Agner Fog矢量类库。
我想知道如何选择不同的向量类,例如Vec16c (SSE2指令集)和Vec32c (AVX指令集)。
我使用的是Intel Atom™x5-Z8350处理器,根据规范,它支持the 4.2指令集。
在硬件支持方面,如何有效地选择向量类?对于我的处理器,我可以使用Vec32c推荐的AVX指令集吗?
发布于 2016-11-24 10:22:22
您可以使用编译器定义的宏来检测为您正在编译的目标启用了哪些指令集,例如:
// 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。
如果您希望代码在不支持VCL的非x86平台上工作,或者在没有x86 SSE2的情况下工作,那么您也需要使用#if来保护#include <vectori128.h>。
发布于 2016-11-24 10:37:43
32字节矢量需要AVX .( AVX2表示32B整数向量,如Vec32c)。因为您的Atom没有AVX,所以不要包括Agner的vectorclassi256.h或vectorclassf256.h,只包含128头。
使用-march=native进行编译,以获得编译器以启用主机-CPU支持的所有指令集.
Vec16c函数的实现在启用时将自动使用SSE4.2本质,因为Vectorclass检查宏以查看启用了什么。因此,只需使用Vec16c,您将自动获得目标支持的每个函数的最佳实现。
(这是正确的,因为您正在执行编译时CPU /目标选项。如果你想自己执行运行时调度,那就更难了。)
发布于 2019-08-14 13:36:23
对向量类库进行了更新和改进。它被移到Github:
https://stackoverflow.com/questions/40783694
复制相似问题