如今,使用步幅 1 对于 vDSP 性能仍然至关重要吗?

Kae*_*ure 3 performance vectorization intrinsics vdsp vmat

在2006 年 11 月一篇关于使用vDSP向量化代码的有用但有些过时的文章中,作者做出了这样的声明:

\n\n
\n

需要记住的重要一点是,只有步长等于 1 的操作才能提供速度极快的矢量化代码。

\n
\n\n

今天仍然如此吗?即使是在具有更强大矢量内在函数的较新英特尔处理器上?

\n\n

我问这个问题是因为我正在编写一些矩阵数学例程,并且刚刚开始将它们全部切换为使用类似Fortran的列优先顺序,以便更容易地与MATLABBLASLAPACK兼容。但现在我发现对vDSP的一些调用需要在不再连续的向量上工作\xe2\x80\xa6

\n\n

目前,这些vDSP调用是我的代码所执行的瓶颈例程。并不是说情况总是如此但至少现在我不想放慢它们的速度,只是为了使对其他库的调用更简单。

\n\n

我现在最常调用的vDSP例程是vDSP_distancesq例程是以防万一会产生影响。

\n

Ben*_*igt 5

尚真。AFAIK(从 SSE4.x 开始,我不认为 AVX 改变了这一点)SSE 内存加载指令仅加载连续的块。

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

这实际上是一个适合同一高速缓存行的问题,以便立即从高速缓存加载整个 SSE 寄存器。(内存 -> 缓存传输的数量对于性能来说更为关键)。

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