建立稀疏矩阵的十字链表算法,稀疏矩阵十字链表加法
编辑:看到这个问题。在那里,我们学习了如何使用Numba在Python上并行化稀疏矩阵向量乘法,Numba可以与Matlab交互。在
原标题:
Matlab发现稀疏矩阵的向量乘法比python(使用scipy稀疏矩阵)快4到5倍。以下是来自Matlab命令行的详细信息。谁是A
名称大小字节类属性
47166 x 113954610732376双精度空间
谁是ATrans
名称大小字节类属性
Trans 113954x47166610198072双精度间隔
NZ(a )/numel(A ) (a)).
ans=
0.0071
谁是x
名称大小字节类属性
X 113954 x1 911632双精度
my fun=@(a * x;时间(myfun))。
ans=
0.0601
my fun=@(atrans * x;时间(myfun))。
ans=
0.0120
矩阵ATrans是.请注意,在Matlab中,A乘以X大约需要0.06秒,但是,如果我用奇怪的“转置技术”来计算ATrans的X次(与A乘以X的结果相同),计算需要0.012秒。不知道这一招为什么管用。)
下面是Python命令行的一些计时结果。
^{pr2}$
所以Python运行时同样的矩阵A乘以X所需的时间是Matlab运行时的4.5倍左右。如果我保存一个csr格式的,Python运行时会稍微差一点。在[ 63 ]中:a=sp.sparse.CSR _ matrix (a).
in[64]:timeit.timeit(a.dot ) x)、setup=from __main__ import A,x 、number=100 )/100.0。
Out[64]:
0.0722580226496575
以下是我使用的python版本和anaconda版本的信息。In [2]:导入sys;print(python%son%s ) sys.version,sys.platform)))).
python 2 . 7 . 12 anacond 4 . 2 . 0(64位)((默认,292016,11336007336013)[mscv . 150064 bit]amd64).
问:为什么Matlab中这种稀疏矩阵的向量乘法比Python快?如何在Python上实现同样的速度?
1:这里有个线索。在Python中,如果线程数设置为1,那么在执行密集矩阵向量乘法时会受到很大影响,而在执行稀疏矩阵向量乘法时几乎不会改变。在[48]中:m=NP.random.rand (1000 1000,1000)
在[ 49 ] : y=NP.random.rand (1000,1)))).) ) ) ) )。
在[50]:导入mkl
In[51]: mkl.get_max_threads(
Out[51]:
20
in [ 52 ] : time it.time it (m.dot (y),setup=from __main__ import M,y ,number=100 )/100.0。
Out[52]:
7.2574948 e-05
in [ 53 ] : mkl.set _ num _ threads (1).
in [ 54 ] : time it.time it (m.dot (y),setup=from __main__ import M,y ,number=100 )/100.0。
Out[54]:
0.00044465965093536396
在[56]:类型(a))
Out[56]:
scipy.sparse.csc.csc_matrix
in[57]:timeit.timeit(a.dot ) x)、setup=from __main__ import A,x 、number=100 )/100.0。
Out[57]:
0.055780856886028685
in [ 58 ] : mkl.set _ num _ threads (20)).
in[59]:timeit.timeit(a.dot ) x)、setup=from __main__ import A,x 、number=100 )/100.0。
Out[59]:
0.05550840215802509
因此,关于密集矩阵的叉积,如果线程数设置为1,运行时将减少约6倍。但是,关于疏散的叉积,即使线程数减少到1,运行时也不会改变。在
我觉得这说明了Python中稀疏矩阵向量乘法不是并行执行的,密集矩阵向量乘法利用了所有可用的核。你同意这个结论吗?如果有,有没有办法用Python中所有可用的核来乘稀疏矩阵向量?在
2.编辑:
这里阅读MKL:“对于稀疏矩阵,除了稀疏三角形解算器之外,所有级别的[BLAS]操作都是线程化的。”这表明scipy没有使用MKL来执行稀疏矩阵向量乘法。@hpaulj通过查看函数csr_matvec的代码(在下面的回答中)似乎印证了这个结论。那么,你能直接调用“英特尔MKL稀疏矩阵向量乘法”函数吗?我该怎么办?在
编辑:这是另一个证据。如果将最大线程数设置为1,当执行Matlab稀疏矩阵的向量乘法时,似乎没有变化。在maxNumCompThreads中
ans=
20
my fun=@(atrans * x;时间(myfun))。
ans=
0.012545604076342
maxnumcompthreads(1) %将线程数设置为一
ans=
20
maxnumcompthreads %检查maxnumberofthreads是否为1
ans=
一
我的乐趣=@(atrans * x;时间它(myfun)。
ans=
0.012164191957568
这质疑了我以前的理论,也就是矩阵实验室的优势在于多线程。在