在2006年11月的helpful but somewhat dated关于使用vDSP对代码进行矢量化的文章中,作者发表了以下声明:


要记住的重要一点是,只有
步长等于1时,将提供极快的矢量化代码。


今天仍然如此吗?甚至在具有更强大矢量内在函数的新型Intel处理器上?

我之所以问是因为我正在编写一些矩阵数学例程,并且刚刚开始将它们全部切换为使用类似Fortran的列主排序的方法,以便更容易地与MATLAB,BLAS和LAPACK兼容。但是现在我发现对vDSP的一些调用需要在不再连续的向量上工作……

目前,这些vDSP调用是我的代码练习的瓶颈例程。并不是说情况总是如此,但是至少到目前为止,我不希望为了简化对其他库的调用而放慢它们的速度。

我现在最常调用的vDSP例程是vDSP_distancesq,以防有所不同。

最佳答案

是。

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

您描述的案例似乎不是专门针对非单位跨步的合适人选。如果要在数组的连续列上执行多个vDSP_distancesq操作,则最好并行执行(一次多列),而不要串行执行(所有列然后所有其他列,…)。如果仅对孤立的列执行单个vDSP_distancesq操作,则还有其他问题。矩阵的列操作因缓存问题而臭名昭著,尤其是如果每行的字节数是2的幂的倍数的倍数时。该操作可能受内存负载的约束,因此编写专门的代码来优化计算可能不会有所收获。

关于performance - 对于今天的vDSP性能,迈进1步仍然很关键吗?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/15753463/

10-11 07:08