Продукт CUDA CSR Matrix-Matrix транспонируется сам по себе - PullRequest
0 голосов
/ 10 марта 2019

У меня есть очень большая, очень разреженная матрица наименьших квадратов (A), которую я хотел бы умножить самостоятельно, следующим образом: N = A ^ T * A, где A & N хранятся в формате CSR.Очевидно, что A имеет больше строк, чем столбцов.Обычно я формирую N непосредственно строка за строкой, но в случае CSR мне сначала нужно будет сформировать график, чтобы определить, какие элементы N отличны от нуля.Я мог бы сделать это (и даже иметь некоторый старый c-код), но я надеюсь найти решение с меньшими затратами на разработку.Я использую CUDA, так что это может быть сделано как на GPU, так и на CPU, где я мог видеть преимущества использования GPU.Я набросал алгоритм, но надеялся, что эта проблема уже решена.Я не смог найти ничего в наборе инструментов CUDA, кроме прямого решателя A * x = l QR (где A = (m, n)).Google тоже не очень помог.

Я использую C ++.

У кого-нибудь есть здесь опыт?

Ответы [ 2 ]

3 голосов
/ 10 марта 2019

Упорядочение общей разреженной матрицы COO в формате CSR / CSC и, в частности, преобразование / преобразование между форматами CSR и CSC - это относительно дешевые операции, которые легко доступны в библиотека cuSPARSE .

После преобразования вашей матрицы A из CSR формата в CSC вы можете легко применить тривиальный алгоритм для вычисления N = A ^ T* A.
Это также легко можно распараллелить с CUDA, если каждый поток обрабатывает один столбец A для генерации одного вывода.

1 голос
/ 11 марта 2019

только что заметил, что cuSparse в наборе инструментов CUDA на самом деле имеет csr-gemm, который поддерживает транспонирование для любой матрицы. Я не знаю, как я это упустил. См. https://docs.nvidia.com/cuda/cusparse/index.html#cusparse-lt-t-gt-csrgemm. Похоже, самое простое решение ...

...