2013-07-11 3 views
2

다음 행렬 연산을 계산해야합니다.
D * A
여기서 D는 밀도가 높고 A는 희소식입니다 (CSC 형식).
cuSPARSE는 스파 스 매트릭스가 CSR 형식 인 스파 스 * 밀도를 곱할 수 있습니다.

Q를 간단히 A로 바꾸면 CSC를 CSR으로 "변환"할 수 있습니다.
결과를 바꿀 수있게 처리 할 수 ​​있으므로 (A^T * D^T)^T도 계산할 수 있습니다.
CSR^T가 CSC이기 때문에이 방법에서는 A를 "전치"하는 것을 피할 수도 있습니다.

유일한 문제는 cuSPARSE가이 작업에서 D를 조 변경하는 것을 지원하지 않기 때문에 미리 조정해야하거나 매우 짙은 밀도이므로 총 낭비 인 CSR로 변환해야합니다.

해결 방법이 있습니까?
감사합니다.cuSPARSE dense times sparse

+0

이미 알고 계실지 모르지만 [geam] (http://docs.nvidia.com/cuda/cublas/index.html#topic_9_1) 함수를 사용하여 cube에서 고밀도 매트릭스를 조 변경 할 수 있습니다. –

+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는 행렬 메이저 포맷의 행렬을 기대하며, 행 중점이 전치 된 행이기 때문에, 전치를 만들지 않고도 가짜 전치 연산자로서 cuSPARSE 함수에 D를 전달할 수 있습니다.