水平有限,仅供参考。
参考文档:http://docs.nvidia.com/cuda/cusparse/index.html#axzz49iopDHZG
Cusparse 库支持稠密和稀疏矩阵,以及稠密和稀疏向量格式。
3.1 索引基本格式
该库支持0和1索引,指标基通过cusparseIndexBase_t 类型来选择,作为一个独立参数或作为矩阵描述符 cusparseMatDescr_t 类型中的字段传递。
3.2 向量格式
本节说明稠密向量和稀疏向量。
3.2.1稠密格式
稠密向量由一个以为的数组表示,该数组在内存中线性存储。例如以下7×1的稠密向量。
[1.0 0.0 0.0 2.0 3.0 0.0 4.0]
3.2.2稀疏格式
稀疏向量由两个数组表示。
Ø 数值数组 同等稠密格式的非零值。
Ø 整数索引数组 对应同等稠密格式中非零值的位置。
例如,上一节中的向量可以存储为以下稀疏格式
Ø 0索引
[1.0 2.0 3.0 4.0]
[0 3 4 6]
Ø 1索引
[1.0 2.0 3.0 4.0]
[1 4 5 7]
两种格式中,上面一行都是数据数组而下面一行是索引数组,假设索引按升序给出并且每个索引最多只出现一次。
3.3 矩阵格式
本节讨论稠密矩阵和几种稀疏矩阵格式。
3.3.1 稠密格式
矩阵以列主元格式存储,并由以下参数表示:
m | 整数 | 矩阵的行数 |
n | 整数 | 矩阵的列数 |
ldx | 整数 | X的主维度,>=m,如果ldx>m,则X是内存中一大矩阵的子矩阵 |
x | 指针 | 指向包含矩阵元素的数据数组。它假设,有足够的存储空间分配给X,而且 cuSPARSE 库函数可以访问子矩阵之外的值,但不会覆盖它们。 |
比如,1索引格式的m×n阶稠密矩阵X如下:
在内存中存储为以下格式:
Tips 该格式和NVIDIA CUDA cuBLAS库中使用的数据类型一样。
3.3.2 坐标格式(COO)
COO格式的稀疏矩阵A由以下参数表示
整数 | 矩阵中非零元素的个数 | |
cooValA | 指针 | 指向长度为nnz的包含行主要格式的 A 的所有非零值的数据数组。 |
cooRowIndA | 指针 | 指向包含行索引的数组 cooValA 中的相应元素的长度非整数数组。 |
cooColIndA | 指针 | 指向包含列索引的数组 cooValA 中的相应元素的长度非整数数组。 |
COO格式的稀疏矩阵假定存储在行主要格式︰ 索引数组首先按行索引排序,然后在同一行内压缩的列索引。每一对行索引和列索引只出现一次。例如,如下矩阵A
0索引的COO格式为:
1索引的COO格式为:
3.3.3 压缩稀疏行格式(CSR)
CSR格式和COO的唯一区别是行索引是压缩格式的。
描述参数表
nnz | 整数 | 矩阵中非零元素的个数 |
csrValA | 指针 | 指向长度为nnz的包含行主要格式的 A 的所有非零值的数据数组。 |
csrRowPtrA | 指针 | 指向长度为m+1的整数数组,前m个元素是每行第一个非零元素在csrValA中的索引,最后一个元素为 nnz+csrRowPtrA(0)(0索引则为0或1索引为1) |
cooColPtrA | 指针 | 指向包含列索引的数组 cooValA 中的相应元素的长度非整数数组。 |
0索引
1索引
3.3.4 压缩稀疏列格式(CSC)
同上,列指标压缩
0索引的COO格式为:
1索引的COO格式为:
3.3.5 Ellpack-Itpack 格式(ELL)
m×n的稀疏矩阵A中,每行最多非零元素数为k,则用两个m×k的稠密矩阵来存储A,第一个表示非零元素,第二个表示非零元素对应的列索引。对于无值的元素,前一矩阵中用0表示,索引矩阵中用-1表示。
例如,前面蹂躏了好几遍的稀疏矩阵A
存储为ELL格式的稀疏矩阵有k=3:
因此数据阵
0索引格式的索引阵
1索引格式的索引阵
ELL格式并不能直接使用,而是经常用于存储下一节中混合模式的稀疏矩阵的整齐部分。
3.3.6 混合格式(HYB)
整齐的用ELL格式存,不整齐的用COO存。使用时需要转换。这个有鸟用?
3.3.7 块压缩稀疏行格式(BSR)
和CSR的区别是CSR存储原始数据,二BSR存储一个原始数据的二维方块。
上参数表:
blockDim | 整数 | 块大小 |
mb | 整数 | 块行数 |
nb | 整数 | 块列数 |
nnzb | 整数 | 非0块个数 |
bsrValA | 指针 | 指向nnzb*blockDim^2维的数据数组,包含A中所有非零元素,以行主元或列主元格式存储。 |
bsrRowPtrA | 指针 | 指向长度为mb+1的整数数组,包含bsrValA和bsrColIndA中所有元素,前mb个元素中i为第i个块行中第一个非零块的块列索引,最后一个值为nnzb+bsrRowPtrA(0), bsrRowPtrA(0)和前面的CSR和CSC一样,是0或者1 |
bsrColIndA | 指针 | 指向长度nnzb的整数数组,包含对应bsrValA中对应块的列索引。 |
还是矩阵A
如果块大小是2
那么mb=2
nb=3
(除完之后向上取整?可能是吧,反正文档里给的公式我看不太懂),如果有不满的块,则用0填充。
于是,各参数如下:
0索引
bsrRowPtrA=[0 2 5]
bsrColIndA[0 1 0 1 2]
列主元
bsrValA=[1 0 4 2 0 3 0 0 50 0 0 0 9 7 0 8 6 0 0]
行主元
bsrValA=[1 4 0 2 0 0 3 0 50 0 0 0 7 9 0 8 0 6 0]
11索引
BsrValA=[A11 A12 A21 A22 A23]
bsrRowPtrA=[1 3 6]
bsrColIndA[1 2 1 2 3]
列主元
bsrValA=[1 0 4 2 0 3 0 0 5 0 0 0 0 9 7 0 86 0 0]
行主元
bsrValA=[1 4 0 2 0 0 3 0 5 0 0 0 0 7 9 0 80 6 0]
3.3.8 扩展BSR格式
只是把bsrRowPtrA拆成两部分
[0 2 5]
拆成了[0 2] [2 5]
没看太懂。
公式下次更新,复制粘贴有点问题。有时间传图片。
水平有限,仅供参考。
参考文档:http://docs.nvidia.com/cuda/cusparse/index.html#axzz49iopDHZG
水平有限,仅供参考。
参考文档:http://docs.nvidia.com/cuda/cusparse/index.html#axzz49iopDHZG