我正在寻找用于 float4 / double4 结构的 AVX-256/512 代码,该代码重载基本操作 *、+、/、-、标量缩放等,以便在使用 float4/ 编写的代码中从矢量操作中获得快速性能提升双4。OpenCL 将这些数据类型作为内在函数,但在 XeonPhi 上运行的 c++ 代码需要利用 512 位 SIMD 单元的新实现。
1 回答
您正在寻找的是 Agner Fog 的Vector Class Library(VCL)。我用它主要替换了 OpenCL 中的向量类型。
与 VCLfloat4
是Vec4f
和double4
是Vec4d
。像 OpenCL 一样,您无需担心 AVX 与 AVX512。如果您使用Vec8d
和编译 AVX,它将使用两个 AVX 寄存器模拟 AVX512。
VCL 具有您想要的所有操作*,+,/,-,+=,-=,/=,*=, multiply and divide by scalar
以及更多功能。
OpenCL 和 VCL 的主要区别在于 OpenCL 基本上创建了一个 CPU 调度程序。而使用 VCL,您必须自己编写一个 CPU 调度程序(它包含一些示例代码来执行此操作的文档)。VCL 具有针对 SSE2 到 AVX512 的优化功能,因此您可以针对多个不同的指令集。Knights Corner Xeon Phi甚至还有一个特殊版本的 VCL。
我想念的 OpenCL 的另一个特性是置换语法。float4
在 OpenCL 中,您可以颠倒组件的顺序,v.wzyx
而在 VCL 中,您可以这样做permute4f<3,2,1,0>(v)
。我可能可以用 C++ 创建这种语法,但我不确定。
使用 VCL、OpenMP 和自定义 CPU 调度程序,我在很大程度上取代了 CPU 上的 OpenCL。