PyCUDA: разреженное векторное умножение матрицы для неквадратных матриц?

#python #sparse-matrix #pycuda

#питон #разреженная матрица #пикуда

Вопрос:

Я пытаюсь реализовать разреженную матричную векторную операцию с использованием pycuda. Единственный пример, который я смог найти для этого, находится в их wiki, в котором реализована процедура разреженного решения, однако меня интересует только часть умножения матрицы на векторы.

Матрица представляет собой блочную диагональную матрицу NxM, и у меня есть вектор плотной длины M.

Ниже приведен некоторый фиктивный код, который делает то, что я хочу, но должен выполняться (и завершаться сбоем) для всех. Он создает блочную диагональную матрицу, используя процедуру scipy sparse, которая составляет 100, (100×7) матриц в блочном диагональном формате.

Затем я вызываю эту функцию ‘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)
 

Комментарии:

1. в scikits-cuda есть обертки python для cusparse . Может быть, стоит посмотреть. Вы, конечно, можете выполнить неквадратный spmv с помощью cusparse