【问题标题】:AVX float4/double4 structAVX float4/double4 结构
【发布时间】:2016-07-07 17:41:28
【问题描述】:

我正在寻找用于 float4 / double4 结构的 AVX-256/512 代码,它重载基本操作 *、+、/、-、标量缩放等,以便在编写的代码中从向量操作中快速提升性能使用 float4/double4。 OpenCL 将这些数据类型作为内在函数,但在 XeonPhi 上运行的 c++ 代码需要利用 512 位 SIMD 单元的新实现。

【问题讨论】:

  • 离题,不明智。使用 SIMD 向量作为向量有时是合理的,但通常是一个坏主意 - 考虑点积和归一化,水平执行它们效率低下。加法当然没问题。所以这取决于你打算对向量执行什么操作。
  • 我知道点积不适合这种方法。我想要的操作是*,+,/,-,+=,-=,/=,*=, 乘除以标量
  • 那没关系。当然,它实际上不会使用 512 位 SIMD,毕竟 4 个双精度数只有 256 位

标签: struct simd avx avx512


【解决方案1】:

您正在寻找的是 Agner Fog 的Vector Class Library(VCL)。我已经用它来替代 OpenCL 中的矢量类型。

对于 VCL,float4Vec4fdouble4Vec4d。像 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 甚至还有 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。

【讨论】:

    猜你喜欢
    • 2019-04-07
    • 2015-10-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-20
    • 2019-09-08
    相关资源
    最近更新 更多