如何将Eigen Sparse Matrix转换为CUDA CuSparse矩阵及*val疑问
Eigen SparseMatrix 转 CuSparse 矩阵的核心细节
首先明确CuSparse中最常用的稀疏矩阵存储格式是CSR(压缩稀疏行),它由三个核心数组构成,其中你疑惑的val是以下内容:
val是存储矩阵所有非零元素数值的一维数组,它的大小等于原Eigen稀疏矩阵的非零元素总数,也就是调用matrix.nonZeros()得到的数值。每个非零元素对应val里的一个位置,顺序和稀疏矩阵的存储结构对应。
举个直观例子:
假设你有一个3×3的Eigen稀疏矩阵,非零元素只有4个:
Eigen::SparseMatrix<double> mat(3,3); mat.insert(0,0) = 1.0; mat.insert(0,2) = 2.0; mat.insert(1,1) = 3.0; mat.insert(2,0) = 4.0;
此时mat.nonZeros()返回4,所以val数组的大小就是4,内容为[1.0, 2.0, 3.0, 4.0](注意Eigen默认列优先存储,转CSR时需要调整为行优先顺序,不过val的大小只由非零元素数量决定)。
额外给你几个新手转格式的关键提醒:
- Eigen默认是列优先(ColMajor)存储,而CuSparse的CSR是行优先结构,转格式前需要把Eigen矩阵转为行优先:
Eigen::SparseMatrix<double, Eigen::RowMajor> row_mat = mat; - 除了
val,还需要准备两个数组:row_ptr:大小为N+1(N是矩阵维度),存储每一行第一个非零元素在val/col_ind中的起始索引,最后一个元素等于总非零数col_ind:大小等于非零元素总数,存储每个非零元素的列索引
- 这些数组需要分配在GPU显存上,可以用
cudaMalloc或者CuSparse的辅助函数完成内存分配与数据拷贝
内容的提问来源于stack exchange,提问作者pk68
相关产品推荐
相关产品推荐

