2013-07-11 65 views
2

我需要计算以下矩阵运算:
D * A
其中D是稠密的,A是稀疏的,采用CSC格式。
cuSPARSE允许乘以稀疏*密集,其中稀疏矩阵采用CSR格式。


以下相关的问题,我可以简单地通过转置A“转换”CSC到CSR。
另外,我可以计算(A^T * D^T)^ T,因为我可以处理得到转置的结果。
在这种方法中,我也可以避免“转置”A,因为CSR^T是CSC。

唯一的问题是cuSPARSE不支持在此操作中转置D,所以我必须事先转移它,或将其转换为CSR,这是一种浪费,因为它是非常密集的

有什么解决方法吗?
谢谢。cuSPARSE密集时间稀疏

+0

可能您已经知道这一点,但您可以使用[geam](http://docs.nvidia.com/cuda/cublas/index.html#topic_9_1)函数在cublas中转置一个致密矩阵。 –

+0

这是一个独立的操作,还是你正在做'A'* D * A'? –

+0

该操作是X - D * A 其中X和D非常密集,A非常稀疏 – MrDor

回答

1

我找到了解决方法。
我在整个代码中将内存访问更改为D.
如果D是一个mxn矩阵,并且我用D[j * m + i]访问它,现在我正在通过D[i * n + j]访问它,这意味着我使它成为行 - 主要而不是列 - 主要。
cuSPARSE以列主格式排斥矩阵,并且因为rows-major转置的是columns-major,所以我可以将D作为伪转置传递给cuSPARSE函数,而无需进行转置。