Entry-wise multiplication of a sparse matrix on GPU
2 Ansichten (letzte 30 Tage)
Ältere Kommentare anzeigen
Using a GPU, I need to multiply sparse matrices using the entrywise ' times' (i.e. .*) operation. As far as I can tell, this is not currently supported on a gpuArray.
For example,
>> rand(5).*sparse(rand(5))
and
>> rand(5,'gpuArray').*rand(5,'gpuArray')
both work, but
>> rand(5,'gpuArray').*sparse(rand(5,'gpuArray'))
Error using .*
Sparse gpuArrays are not supported for this function.
Is there any way I can get around this without converting matrices back to full (which would negate most/all of the advantage of using the GPU).
Thanks
0 Kommentare
Antworten (1)
Joss Knight
am 8 Aug. 2017
Is the sparsity the same for both matrices?
[I, J, VA] = find(Asparse);
[~, ~, VB] = find(Bsparse);
C = sparse(I, J, VA.*VB);
If you just want to multiply it by itself you can use SPFUN:
Asqr = spfun(@(x)x.^2, Asparse);
If the sparsity is different then you have to merge the indices unfortunately. It's a horrible sequence of operations involving sorting and indexing, and not very efficient which is why it hasn't been implemented. I'm curious as to what your application is - maybe there's another solution that doesn't involve element-wise operations.
9 Kommentare
Joss Knight
am 12 Aug. 2017
Thanks Ben. Just to reiterate, there's no guarantee a GPU implementation will be faster than the CPU. Don't convert your sparse matrices to dense to work around this issue, gather them to the CPU.
Siehe auch
Kategorien
Mehr zu GPU Computing in MATLAB finden Sie in Help Center und File Exchange
Produkte
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!