我正在尝试使用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)