#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