我有一个非常大,非常稀疏的最小二乘设计矩阵(A),我想将其自身相乘,如下所示:N = A ^ T * A,其中A和N以CSR格式存储。显然,A的行多于列。我通常直接逐行形成N,但是对于CSR,我必须首先形成一个图,以确定N的哪些元素不为零。我可以做到这一点(甚至有一些旧的C代码),但我希望能得到开发较少的解决方案。我正在使用CUDA,因此可以在GPU或CPU上完成,在那里我可以看到使用GPU的优势。我已经草拟了一个算法,但是希望这个问题已经解决。除了直接A * x = l QR解算器(其中A =(m,n))之外,我在CUDA工具包中找不到任何东西。 Google也不是很有帮助。
我正在使用C ++。
有人在这里有经验吗?
答案 0 :(得分:3)
订购general COO sparse matrix into CSR/CSC format,特别是transposition / conversion between CSR and CSC formats相对便宜,并且可以在cuSPARSE library中轻松获得。
将矩阵A从CSR格式转换为CSC后,您可以轻松地应用平凡的算法来计算N = A ^ T *A。
通过使每个线程处理A的一列以生成一个输出,这也可以很容易地与CUDA并行化。
答案 1 :(得分:1)
只是注意到CUDA工具包中的cuSparse实际上有一个csr-gemm,它支持在任一矩阵上转置。我不知道我怎么忽略了这一点。参见https://docs.nvidia.com/cuda/cusparse/index.html#cusparse-lt-t-gt-csrgemm。看起来是最简单的解决方案...