在 GPU 上使用稀疏数组
稀疏数组可高效存储包含大量零值的 double 或 single 数据。虽然全(或稠密)矩阵会将每个元素都存储在内存中(无论其值为何),但稀疏矩阵仅存储非零元素及其位置。因此,使用稀疏矩阵可以显著减少数据存储所需的内存量。
创建稀疏 GPU 数组
您可以通过使用 gpuArray 输入调用 sparse 来创建稀疏 gpuArray,或者通过使用稀疏输入调用 gpuArray 来创建它。例如,
X = [0 1 0 0 0; 0 0 0 0 1]
X = 2×5
0 1 0 0 0
0 0 0 0 1S = sparse(X)
S = 2×5 sparse double matrix (2 nonzeros) (1,2) 1 (2,5) 1
G = gpuArray(S); % G is a sparse gpuArray Gt = transpose(G); % Gt is a sparse gpuArray F = full(Gt) % F is a full gpuArray
F =
0 0
1 0
0 0
0 0
0 1
您还可以直接使用以下函数创建一个稀疏的 gpuArray。有关更多信息,请参阅函数参考页的扩展功能部分。
对稀疏 GPU 数组进行索引
稀疏 GPU 数组仅支持通过索引引用整行或整列。例如,要访问稀疏矩阵 A 的第五行,请调用 A(5,:) 或 A(5,1:end)。
A = gpuArray.speye(10); A(5,:)
1×10 sparse gpuArray double row vector (1 nonzero) (1,5) 1
full(A(5,:))
0 0 0 0 1 0 0 0 0 0
要定位稀疏 GPU 数组的非零元素,请使用 find 函数。
[row,col,val] = find(A); [row,col,val]
1 1 1
2 2 1
3 3 1
4 4 1
5 5 1
6 6 1
7 7 1
8 8 1
9 9 1
10 10 1然后,您可以替换所需的值或添加新的非零元素,并构建一个新的稀疏 gpuArray 数组,因为不支持通过索引向稀疏 GPU 数组赋值。例如,使用 find 函数的输出替换第 5 个非零元素,在位置 (1,7) 处添加一个新的非零元素,并构建一个新的稀疏矩阵 gpuArray。
val(5) = 0; val(end+1) = 1; row(end+1) = 1; col(end+1) = 7; A = sparse(row,col,val);
使用 spy 函数绘制新的稀疏模式。向稀疏数组中添加或移除元素会影响其稀疏模式,从而改变数组在内存中的大小。
spy(A)

支持稀疏 GPU 数组的函数
这些表格列出了支持稀疏 gpuArray 输入的函数。有关特定函数的限制和使用说明,请参阅函数参考页面的“扩展功能”部分。
稀疏矩阵函数
矩阵与数组运算
小学数学
三角函数
线性代数
创建函数
这些生成函数支持稀疏的 gpuArray 输入。所有这些函数都支持使用现有的稀疏 gpuArray p 对象,并采用 like=p 语法来生成稀疏 gpuArray 对象。