矢量化嵌套索引

Posted

技术标签:

【中文标题】矢量化嵌套索引【英文标题】:Vectorized nested indexing 【发布时间】:2013-11-05 22:48:34 【问题描述】:

我有一个 for 循环来做索引:

for (int i=0; i<N; i++)
    a[i] = b[c[i]]

c 是感兴趣的索引,是 int *,而 bafloat * 和操纵值。

但是,这需要很长时间(而且不能花那么长时间)。我想要一些矢量化版本,很可能在 BLAS/LAPLACK/etc 中找到。

我正在寻找nested_indexing(float * output_vector, float * input_vector, int * input_indices)

我试过查看docs,但没有找到任何东西。

【问题讨论】:

您需要的是收集指令 - ***.com/questions/16193434/…。不确定是否有支持库 你看过 LAPACK 的 ?lapmt?laswp 吗?他们做了类似的事情(如果您不介意矩阵是就地置换而不是复制的事实。) 【参考方案1】:

vDSP_vgathr 正是这样做的。它接受两个float * 和一个int *。它相当于for (i=0; i&lt;N; i++) a[i] = b[c[i]]

他们使用的措辞是

使用向量 B 的元素作为索引,将向量 A 的选定元素复制到向量 C 中的连续位置

也许它也可以是顺序索引。我注意到,要找到这些晦涩难懂的函数,最难的部分是找到要在搜索中使用的正确词。

【讨论】:

以上是关于矢量化嵌套索引的主要内容,如果未能解决你的问题,请参考以下文章

嵌套循环的 OpenMP SIMD 矢量化

是否可以使用 SSE 对这个嵌套进行矢量化?

向量化嵌套循环,其中一个循环变量依赖于另一个

如何向量化嵌套循环

向量化嵌套 vmap

是否可以在 Numpy 矢量化广播操作期间访问当前索引?