今天使用1的步幅仍然对vDSP性能至关重要吗?

时间:2013-04-01 23:09:52

标签: performance vectorization intrinsics vdsp vmat

helpful but somewhat dated 2006年11月关于使用 vDSP 向量化代码的文章中,作者发表了声明:

  

重要的是要记住,事实是只有操作   等于一的步幅将提供超快的矢量化代码。

今天这仍然是真的吗?即使在较新的 Intel 处理器上,它们具有更强大的矢量内在函数?

我问,因为我正在编写一些矩阵数学例程,并且刚刚开始将它们全部切换为使用 Fortran 类似列主要排序的路径更容易与 MATLAB BLAS LAPACK 兼容。但现在我发现我对 vDSP 的一些调用需要处理不再连续的向量...

目前,这些 vDSP 调用是我的代码所运行的瓶颈例程。并不是说这将总是就是这样,但至少我现在不想放慢速度,只是为了让那些其他库的调用变得更简单。

我现在最常被称为 vDSP 的例程是vDSP_distancesq,以防万一。

2 个答案:

答案 0 :(得分:4)

仍然如此。 AFAIK(从SSE4.x开始,我认为AVX不会改变这种情况)SSE内存加载指令仅加载连续块。

您可以使用2的步幅进行矢量化,但需要进行一些额外的重排操作。

这是一个适合同一缓存行的问题,以便立即从缓存加载整个SSE寄存器。 (而且内存的数量 - >缓存传输对性能来说甚至更为重要)。

为了支持分散 - 聚集SSE,不需要大量更新的SIMD指令,而是缓存和内存控制器。

答案 1 :(得分:3)

如果有充分理由,我们(Apple的Vector和Numerics Group)可以为某些其他步骤添加优化。例如,对于两个步幅,在某些处理器模型上,我们将正常加载矢量块,然后使用各种置换指令来提取其他所有元素。这将导致代码不如单位步长代码快,但会比当前代码快。通常不会这样做,因为通常有其他更好的方法,例如将跨步数据复制到单位步长缓冲区,对缓冲区执行多个vDSP操作,以及将数据复制回来。

你所描述的案例似乎不适合专攻非单位的步伐。如果您在数组的连续列中执行多个vDSP_distancesq操作,最好并行执行它们(一次多个列)而不是串行(一个列全部,然后是所有另一个列,......)。如果您只对隔离列执行单个vDSP_distancesq操作,则还有其他问题。矩阵上的列操作因缓存问题而臭名昭着,特别是如果每​​行的字节数是2的相当大的倍数的倍数。该操作可能受内存负载的约束,因此编写专门的代码来优化计算可能没有任何好处。