Kae*_*ure 3 performance vectorization intrinsics vdsp vmat
在2006 年 11 月一篇关于使用vDSP向量化代码的有用但有些过时的文章中,作者做出了这样的声明:
\n\n\n\n\n需要记住的重要一点是,只有步长等于 1 的操作才能提供速度极快的矢量化代码。
\n
今天仍然如此吗?即使是在具有更强大矢量内在函数的较新英特尔处理器上?
\n\n我问这个问题是因为我正在编写一些矩阵数学例程,并且刚刚开始将它们全部切换为使用类似Fortran的列优先顺序,以便更容易地与MATLAB、BLAS和LAPACK兼容。但现在我发现对vDSP的一些调用需要在不再连续的向量上工作\xe2\x80\xa6
\n\n目前,这些vDSP调用是我的代码所执行的瓶颈例程。并不是说情况总是如此,但至少现在我不想放慢它们的速度,只是为了使对其他库的调用更简单。
\n\n我现在最常调用的vDSP例程是vDSP_distancesq例程是以防万一会产生影响。
尚真。AFAIK(从 SSE4.x 开始,我不认为 AVX 改变了这一点)SSE 内存加载指令仅加载连续的块。
您可以使用步长 2 进行矢量化,但需要一些额外的改组操作。
这实际上是一个适合同一高速缓存行的问题,以便立即从高速缓存加载整个 SSE 寄存器。(内存 -> 缓存传输的数量对于性能来说更为关键)。
为了支持分散-聚集 SSE,需要大更新的不是 SIMD 指令,而是缓存和内存控制器。