3. mcSPARSE索引和数据格式

mcSPARSE库支持稠密向量、稀疏向量以及稠密矩阵和稀疏矩阵格式。

3.1. 基准索引格式

该库支持以0为基数和以1为基数的两种索引方式。 通过 mcsparseIndexBase_t 类型来选择基准索引,可作为独立参数或矩阵描述符 mcsparseMatDescr_t 类型中的字段进行传递。

3.1.1. 向量格式

本节描述了稠密向量和稀疏向量的格式。

3.1.1.1. 稠密格式

稠密向量用一个线性数据数组表示,线性地存储在内存中。

3.1.1.2. 稀疏格式

稀疏向量使用两个数组来表示。

  • 数据数组 包含了等价的稠密格式中的非零值。

  • 整数索引数组 包含了等价的稠密格式中对应非零值的位置。

3.2. 矩阵格式

在这节中讨论了矩阵的稠密格式和几种稀疏格式。

3.2.1. 稠密格式

假设稠密矩阵 X 以列主序格式存储在内存中,并由以下参数表示。

m

(integer)

矩阵的行数。

n

(integer)

矩阵的列数。

ldX

(integer)

X 的主维度,必须大于或等于 m。如果 ldX 大于 m,那么 X 表示存储在 内存中的较大矩阵的子矩阵。

X

(pointer)

指向包含矩阵元素的数据数组的指针。 假定为 X 分配了足够的存储空间以容纳所 有矩阵元素,并且mcSPARSE库函数可以访问子 矩阵之外的值,但永远不会覆盖它们。

3.2.2. 坐标格式 (COO)

m×n 稀疏矩阵 A 由以下参数以 COO 格式表示。

nnz

(integer)

该矩阵中非零元素的数量。

cooValA

(pointer)

指向长度为 nnz 的数据数组,该数组 按行主序格式存储了矩阵 A 中所有非 零值。

cooRowIndA

(pointer)

指向长度为 nnz 的整数数组,其中 包含了与数组 cooValA 中对应元素 的行索引。

cooColIndA

(pointer)

指向长度为 nnz 的整数数组,其中 包含了与数组 cooValA 中对应元素 的列索引。

假定COO格式的稀疏矩阵以行主格式存储。 每个 COO 元素由行列对组成。 COO格式假定按行排序。 支持已排序和未排序的列索引。

3.2.3. 压缩稀疏行格式(CSR)

CSR格式与COO格式之间唯一的区别在于,CSR格式中包含行索引的数组是压缩的。 m×n 稀疏矩阵 A 由以下参数以 CSR 格式表示。

nnz

(integer)

矩阵中非零元素的数量。

csrValA

(pointer)

指向长度为 nnz 的数据数组, 存储了矩阵A中所有非零值, 采用行主序格式存储。

csrRowPtrA

(pointer)

指向长度为 m+1 的整数数组,存储了 对数组 csrColIndAcsrValA 的索引。该数组的前 m 个元素包含第 i 行中第一个非零元素的索引(其中, i=i,...,m)而最后一个元素包含 nnz+csrRowPtrA(0) 一般而言, 对于以零为基和以一为基的索引方式, csrRowPtrA(0) 分别为0和1。

csrColIndA

(pointer)

指向长度为 nnz 的整数数组,包含 数组 csrValA 中相应元素的列索引。

稀疏矩阵以CSR格式存储时,假定其采用行优先的CSR格式存储。 对于稀疏矩阵,支持已排序和未排序的列索引。

3.2.4. 压缩稀疏列格式(CSC)

CSC格式与COO格式有两个不同之处:在CSC格式中,矩阵以列主序存储并且对包含列索引的数组进行了压缩。 一个大小为 m×n 的矩阵 A 由以下参数以 CSC 格式表示。

nnz

(integer)

该矩阵中非零元素的数量。

cscValA

(pointer)

指向长度为 nnz 数据数组的指针, 该数组按列主序的格式存储了矩阵 A 所有 非零值。

cscRowIndA

(pointer)

指向长度为 nnz 整数数组的指针, 该数组包含了 cscValA 数组中对应 元素的行索引。

cscColPtrA

(pointer)

指向长度为 n+1 整数数组的指针, 该数组保存着数组 cscRowIndAcscValA 的索引。该数组的前 n 个元素包含了第i行中第一个非零元素的 索引(对于 i=i,…,n),而最后一个元素 包含了 nnz+cscColPtrA(0)。通常, 对于以零为基和以一为基的索引方式, cscColPtrA(0) 分别为0和1。

备注

以 CSC 格式表示的矩阵 A 与其以 CSC 格式表示的转置具有完全相同的内存布局(反之亦然)。

3.2.5. 块压缩稀疏行格式 (BSR)

CSR格式和BSR格式之间唯一的区别是存储元素的格式。 前者存储原始数据类型( singledoublemcComplexmcDoubleComplex),而后者存储两维方块状的原始数据类型。 BSR格式有以下参数。

blockDim

(integer)

矩阵 A 的块维度。

mb

(integer)

矩阵 A 的行数。

nb

(integer)

矩阵 A 的块列数。

nnzb

(integer)

矩阵中非零块的数量。

bsrValA

(pointer)

指向保存矩阵 A 所 有非零块元素数据数组的 指针。这些块元素按列主 序或行主序存储。

bsrRowPtrA

(pointer)

指向长度为 mb+1 整 数数组的指针,该数组保 存了 bsrColIndAbsrValA 数组的索引。 这个数组的前mb个元素包 含了第i行非零块的索引 对于(i=1,…,mb), 而最后一个元素包含了 nnzb+bsrRowPtrA(0)。通 常,对于以零为基和 以一为基的索引方式 , cscColPtrA(0) 分别为0和1。

bsrColIndA

(pointer)

指向长度为 nnzb 整 数数组的指针,该数组包 含了 bsrValA 数组 中相应块对应的列索引。

和CSR格式一样,BSR格式中的(行,列)索引按行主序存储。 索引数组首先按行索引排序,然后在同一行内按列索引排序。

3.2.6. 扩展块压缩稀疏行格式(BSRX)

BSRX格式与BSR格式相同,但数组 bsrRowPtrA 被拆分为两部分。 每行的第一个非零块仍由数组 bsrRowPtrA 指定,这与BSR格式相同,但每行的最后一个非零块的位置由数组 bsrEndPtrA 指定。 简而言之,BSRX格式类似于BSR格式的4维向量变体。

矩阵 A 由以下参数以 BSRX 格式表示。

blockDim

(integer)

矩阵 A 的块维度

mb

(integer)

矩阵 A 的数。

nb

(integer)

矩阵 A 的块列数

nnzb

(integer)

矩阵中非零块的数量。

bsrValA

(pointer)

指向保存矩阵 A 所 有非零块元素数据数组的 针指。这些块元素按列主 序或行主序存储。

bsrRowPtrA

(pointer)

指向长度为 mb 整数 数组的指针,该数组保存 了 bsrColIndAbsrValA 数组的索引 。bsrRowPtrA(i) 是 第i行块在 bsrColIndAbsrValA 中的第一 个非零块的位置。

bsrEndPtrA

(pointer)

指向长度为 mb 整数 数组的指针,该数组保存 了 bsrColIndAbsrValA 数组的索引 。bsrRowPtrA(i) 是 第i行块在 bsrColIndAbsrValA 中最后一个 非零块的下一个位置。

bsrColIndA

(pointer)

指向长度为 nnzb 整 数数组的指针,该数组包 含bsrValA数组中相应块 对应的列索引。