主要内容

本页采用了机器翻译。点击此处可查看英文原文。

在 GPU 上使用稀疏数组

稀疏数组可高效存储包含大量零值的 doublesingle 数据。虽然(或稠密)矩阵会将每个元素都存储在内存中(无论其值为何),但稀疏矩阵仅存储非零元素及其位置。因此,使用稀疏矩阵可以显著减少数据存储所需的内存量。

创建稀疏 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     1
S = 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。有关更多信息,请参阅函数参考页的扩展功能部分。

函数描述
gpuArray.speye

稀疏单位矩阵

gpuArray.sprand

稀疏均匀分布随机矩阵

gpuArray.sprandn

稀疏正态分布随机矩阵

gpuArray.sprandsym

稀疏对称随机矩阵

对稀疏 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)

Sparsity pattern of a 10-by-10 sparse gpuArray. The matrix has ones along the diagonal, except in column five.

支持稀疏 GPU 数组的函数

这些表格列出了支持稀疏 gpuArray 输入的函数。有关特定函数的限制和使用说明,请参阅函数参考页面的“扩展功能”部分。

稀疏矩阵函数

矩阵与数组运算

小学数学

三角函数

线性代数

创建函数

这些生成函数支持稀疏的 gpuArray 输入。所有这些函数都支持使用现有的稀疏 gpuArray p 对象,并采用 like=p 语法来生成稀疏 gpuArray 对象。

数据类型、类型识别和参量验证

另请参阅

| |

主题