Numba已更新, (我正在回答自己的问题。)
日期为2017年12月12日的此博客文章讨论了Numba并行计算功能的改进。这是该博客的相关摘要:
很久以前(超过20个发行版!),Numba曾经支持惯用语来编写称为的并行for循环prange()
。在2014年对代码库进行了重大重构之后,必须删除此功能,但自那以来,它一直是Numba最常请求的功能之一。英特尔开发人员将数组表达式并行化之后,他们意识到带回prange
是很容易的
使用Numba版本0.36.1,我可以for
使用以下简单代码并行化尴尬的parallel -loop:
@numba.jit(nopython=True, parallel=True)
def csrMult_parallel(x,Adata,Aindices,Aindptr,Ashape):
numRowsA = Ashape[0]
Ax = np.zeros(numRowsA)
for i in numba.prange(numRowsA):
Ax_i = 0.0
for dataIdx in range(Aindptr[i],Aindptr[i+1]):
j = Aindices[dataIdx]
Ax_i += Adata[dataIdx]*x[j]
Ax[i] = Ax_i
return Ax
在我的实验中,并行化for
-loop使该函数的执行速度比我在问题开头发布的版本快了八倍,该版本已经在使用Numba了,但尚未并行化。此外,在我的实验中,并行版本比Ax = A.dot(x)
使用scipy的稀疏矩阵矢量乘法函数的命令快大约5倍。 ,我终于有了一个python稀疏的矩阵向量乘法例程,它的 。