_axpy是blas一级操作,它实现了以下
for i = 1:n
a[i] = a[i]-$\alpha$ b[i]
通过各种blas库(例如MKL)可以有效地实现这种常规daxpy。
在我的情况下,我想实现以下使用间接寻址的daxpy操作变体。
for i = 1:n
a[ind1[i]] = a[ind1[i]]-$\alpha$ b[i]
其中ind1包含向量A的元素索引,需要更新。我得到的信息是ind1是一个单调的数组,即$ ind1 [i]> ind [j] \ forall i> j $。
我认为这种计算在稀疏线性代数中经常出现。有没有人知道基于SSE / AVX的这种例程的任何有效实现。
答案 0 :(得分:0)
你可以movss
,然后是3 insrps
,直到你填充一个向量,然后进行数学计算。然后分散回位置?如果index为16或32bit,则可以将多个索引一次加载到64位GP寄存器中,并移位+ movzx
以获取数组索引。
参见例如https://github.com/pcordes/par2-asm-experiments/blob/master/asm-pinsrw.s。该功能根据16位字的高半部分和低半部分查找16位GF16 longmultiply组件。所以我的索引是8位,所以我可以在一个64位负载中获得很多。
如果您的索引中有足够的连续数据值得发现许多分支误预测,那么正如@StephenCanon所说,可能值得寻找运行并使用SIMD执行每个连续的块。