根据MKL BLAS文档,“所有矩阵-矩阵操作(第3级)都是密集和稀疏BLAS的线程。”http://software.intel.com/en-us/articles/parallelism-in-the-intel-math-kernel-library
我用MKL BLAS构建了Scipy。使用下面的测试代码,我看到了密集矩阵乘法的预期多线程加速,但稀疏矩阵乘法没有。Scipy是否有任何更改以启用多线程稀疏操作?
# test dense matrix multiplication
from numpy import *
import time
x = random.random((10000,10000))
t1 = time.time()
foo = dot(x.T, x)
print time.time() - t1
# test sparse matrix multiplication
from scipy import sparse
x = sparse.rand(10000,10000)
t1 = time.time()
foo = dot(x.T, x)
print time.time() - t1
2条答案
按热度按时间kgsdhlau1#
据我所知,答案是否定的。但是,您可以围绕MKL稀疏乘法例程构建自己的 Package 器。你问了两个稀疏矩阵相乘的问题。下面是我用来将一个稀疏矩阵乘以一个密集向量的一些 Package 器代码,因此应该不难修改(请参阅mkl_cspiral_dcsrgemm的英特尔MKL参考)。另外,请注意scipy数组是如何存储的:默认为COO,但CSR(或CSC)可能是更好的选择。我选择了csr,但MKL支持大多数类型(只需调用适当的例程)。
据我所知,scipy的default和MKL都是多线程的。通过改变
OMP_NUM_THREADS
,我可以看到性能上的差异。要使用下面的函数,如果你有一个最新版本的MKL,只要确保你有
LD_LIBRARY_PATHS
设置为包括相关的MKL目录。对于旧版本,您需要构建一些特定的库。我从IntelMKL in python得到的信息xhv8bpkk2#
(Idea答案复制自https://stackoverflow.com/a/75663143/9569654)
有一个Python Package 器,允许使用英特尔MKL库进行多线程稀疏矩阵操作(项目网站:https://pypi.org/project/sparse-dot-mkl/)。它也可以使用conda安装(按照https://anaconda.org/conda-forge/sparse_dot_mkl上的说明)!
使用此包,您的代码将更改为
请注意,您需要将稀疏矩阵的格式指定为CSR或CSC以使用
dot_product_mkl
。我还将print语句更改为Python 3语法。在我的机器上,numpy代码的时间是3.39秒,稀疏乘法的时间是0.27秒。