可以使用BLAS加速稀疏矩阵乘法吗?
我现在正在尝试加快我处理的大型稀疏矩阵的乘法运算。我已经成功地把我的numpy安装和OpenBLAS连接起来,因此也顺利地连接了scipy。我运行了这些测试,结果都很不错。
当我使用numpy.dot(X,Y)
时,我能明显感受到性能提升,而且多个核心同时被使用。但是,当我使用scipy的点乘功能时,就没有看到这样的性能提升,仍然只使用了一个核心。例如:
x = scipy.sparse.csr_matrix(numpy.random.random((1000,1000)))
x.dot(x.T)
有没有人知道我该如何让BLAS也能和scipy的点乘功能一起工作呢?
2 个回答
1
可能已经太晚了,帮不了你,但也许能帮到其他人:
SciPy中稀疏矩阵和稀疏矩阵相乘的实现是单线程的,也就是说它一次只能处理一个任务。
不过,如果你使用这个链接中的库:https://pypi.org/project/sparse-dot-mkl/,你的计算就可以使用多线程,这样可以同时处理多个任务,因为这个库使用了英特尔的MKL。
4
BLAS主要是用来处理密集的浮点矩阵的。对于scipy.sparse.csr_matrix
这种稀疏矩阵的乘法运算,使用的是纯C++的函数,这些函数并不会调用外部的BLAS库。
举个例子,矩阵乘法的实现可以在这里找到,具体是在csr_matmat_pass_1
和csr_matmat_pass_2
这两个函数里。
优化过的BLAS库非常精细地调整,以便高效利用CPU缓存,它通过将密集的输入矩阵分解成更小的块矩阵来提高局部性,这样可以更快地访问数据。我的理解是,这种策略不容易应用到稀疏矩阵上,因为稀疏矩阵中的非零元素可能分布得很不规律。