我正在寻找一个用于float4 / double4结构的AVX-256/512代码,它重载基本操作*,+,/, - ,按标量缩放等,以便在编写的代码中从向量操作中快速提升性能使用float4 / double4。 OpenCL将这些数据类型作为内在函数,但在XeonPhi上运行的c ++代码需要利用512位SIMD单元的新实现。
答案 0 :(得分:1)
你在寻找的是Agner Fog的Vector Class Library(VCL)。我使用它主要是替换OpenCL中的矢量类型。
VCL float4
为Vec4f
,double4
为Vec4d
。与OpenCL一样,您无需担心AVX与AVX512。如果您使用Vec8d
并编译AVX,它将使用两个AVX寄存器模拟AVX512。
VCL拥有您想要的所有操作,例如*,+,/,-,+=,-=,/=,*=, multiply and divide by scalar
和更多功能。
与OpenCL和VCL的主要区别在于OpenCL基本上创建了一个CPU调度程序。而对于VCL,您必须自己编写一个CPU调度程序(它包含一些示例代码来完成文档)。 VCL通过AVX512优化了SSE2的功能,因此您可以定位几个不同的指令集。 Knights Corner Xeon Phi甚至有a special version of the VCL。
我想念OpenCL的另一个功能是置换语法。在OpenCL中,要反转float4
组件的顺序,您可以v.wzyx
,而使用VCL,您可以permute4f<3,2,1,0>(v)
。我可能会create this syntax with C++,但我不确定。
使用VCL,OpenMP和自定义CPU调度程序,我已基本取代了CPU上的OpenCL。