2013-07-11 2 views
2

мне нужно вычислить следующую матрицу математике:
D * A
где D плотно, и А разреженный, в формате CSC.
cuSPARSE позволяет умножать разреженные * плотные, где разреженная матрица находится в формате CSR.

Следуя связанным вопросам, я могу «преобразовать» CSC в CSR просто путем переноса A.
Также я могу вычислить (A^T * D^T)^T, поскольку я могу справиться с передачей результата.
В этом методе я также могу избежать «переноса» A, потому что CSR^T является CSC.

Единственная проблема заключается в том, что cuSPARSE не поддерживает перенос D в этой операции, поэтому я должен предварительно транслировать его или преобразовать в CSR, что является общим количеством отходов, так как это очень плотный.

Есть ли обходной путь?
Спасибо.cuSPARSE плотные времена редкие

+0

Возможно, вы уже знаете это, но вы можете транспонировать плотную матрицу в cublas с помощью функции [geam] (http://docs.nvidia.com/cuda/cublas/index.html#topic_9_1). –

+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 ожидает матриц в формате столбца-майор, а так как строки-майоры транспонированы - столбцы-майоры, я могу передавать функции D в cuSPARSE в качестве поддельного транспонирования без необходимости делать транспонирование.

Смежные вопросы