建立稀疏矩阵的十字链表算法,稀疏矩阵十字链表加法

  建立稀疏矩阵的十字链表算法,稀疏矩阵十字链表加法

  编辑:看到这个问题。在那里,我们学习了如何使用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

  这质疑了我以前的理论,也就是矩阵实验室的优势在于多线程。在

建立稀疏矩阵的十字链表算法,稀疏矩阵十字链表加法