CUsparse ch3 Cusparse索引及其数据格式

来源:互联网 发布:虚拟炒股软件 编辑:程序博客网 时间:2024/06/04 19:55

水平有限,仅供参考。

参考文档: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由以下参数表示

nnz

整数

矩阵中非零元素的个数

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索引

BsrValA=[A00  A01  A10  A11  A12]

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

0 0
原创粉丝点击