2013-07-11 91 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函數,而無需進行轉置。