我正在尝试使用pycuda实现稀疏矩阵向量运算。我能够找到的唯一例子是他们的wiki,它实现了一个稀疏的求解例程,但是我只对矩阵向量乘法部分感兴趣。
矩阵是块对角线NxM矩阵,我有一个密集长度的M向量。
下面是一些虚拟代码,可以执行我想要的操作,但应该为任何人运行(并且失败)。它使用scipy稀疏例程生成块对角矩阵,该例程是块对角线格式的100(100x7)矩阵。
然后我将这个'PacketedSpMV'函数称为失败的错误:only square matrices are supported
我找不到任何有用的文档来说明这个函数的功能,或者是否有适用于非方形矩阵的不同版本。我也不知道这种置换方式是做什么的,但它用于回答关于如何进行方形矩阵向量运算的不同问题。我也找不到任何有用的例子,例如,一旦创建了spmv对象,我可以使用具有相同结构的不同矩阵更新内容,而不是每次都调用此函数(这似乎很慢)
首先,第一件事是,没有非正方形的方法吗?或者我是否需要用零填充所有内容并进行稀疏稀疏矩阵向量乘法,这看起来很奇怪。
谢谢,并为基本问题道歉。
from __future__ import division
import pycuda.autoinit
import pycuda.driver as drv
import pycuda.gpuarray as gpuarray
import numpy
from pycuda.sparse.packeted import PacketedSpMV
import scipy.sparse as ss
A=np.ones([100,10,7])
M = ss.block_diag(A, format="csr")
spmv = PacketedSpMV(M, False, M.dtype)
rhs = numpy.random.rand(spmv.shape[0]).astype(spmv.dtype)
rhs_gpu = gpuarray.to_gpu(rhs)
xp = spmv.permute(rhs_gpu)
yp = spmv(xp)
y = spmv.unpermute(yp)