Main Content

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

gpuArray

存储在 GPU 上的数组

说明

gpuArray 对象表示存储在 GPU 内存中的数组。MATLAB® 和其他工具箱中的大量函数支持 gpuArray 对象,允许您以最少的代码更改在 GPU 上运行代码。要使用 gpuArray 对象,请使用任何启用 gpuArray 的 MATLAB 函数,例如 fftmtimesmldivide。要查找 MATLAB 和其他工具箱中启用 gpuArray 的函数的完整列表,请参阅 GPU 支持的函数。有关详细信息,请参阅在 GPU 上运行 MATLAB 函数

如果您想从 GPU 检索数组,例如当使用不支持 gpuArray 对象的函数时,请使用 gather 函数。

注意

当 GPU 不可用时,您可以将包含 gpuArray 数据的 MAT 文件加载为内存数组。未使用 GPU 加载的 gpuArray 对象受到限制,您无法使用它进行计算。要使用未通过 GPU 加载的 gpuArray 对象,请使用 gather 检索内容。

创建对象

使用 gpuArray 将 MATLAB 工作区中的数组转换为 gpuArray 对象。一些 MATLAB 函数还允许您直接创建 gpuArray 对象。有关详细信息,请参阅在 GPU 上建立数组

描述

G = gpuArray(X) 将数组 X 复制到 GPU 并返回 gpuArray 对象。

示例

输入参量

全部展开

要传输到 GPU 的数组,指定为数值或逻辑数组。GPU 设备必须有足够的可用内存来存储数据。如果 X 已经是 gpuArray 对象,则 gpuArray 将输出 X 不变。

您还可以将稀疏数组传输到 GPU。gpuArray 仅支持双精度的稀疏数组。

示例: G = gpuArray(magic(3));

数据类型: single | double | int8 | int16 | int32 | int64 | uint8 | uint16 | uint32 | uint64 | logical
复数支持:

对象函数

arrayfun将函数应用于 GPU 上的数组的每个元素
gather将分布式数组、Composite 对象或 gpuArray 对象传输到本地工作区
pagefun将函数应用到分布式或 GPU 数组的每一页

有几种方法可以检查 gpuArray 对象的特征。大多数行为类似于同名的 MATLAB 函数。

isgpuarray判断输入是否为 gpuArray
existsOnGPU确定 GPU 上是否提供 gpuArray 或 CUDAKernel
isUnderlyingType确定输入是否有指定的基础数据类型
ndims数组维度数目
size数组大小
underlyingType确定数组行为的基础数据的类型

几个 MATLAB 工具箱包含支持 gpuArray 的函数。要查看这些工具箱中支持 gpuArray 对象的所有函数的列表,请使用下表中的链接。带有信息指示器的列表中的函数具有在 GPU 上运行该函数的特定限制或使用说明。您可以在函数参考页面的扩展功能部分查看使用说明和限制。有关单个启用 gpuArray 的函数的更新信息,请参阅发行说明。

工具箱名称支持 gpuArray 的函数列表GPU 特定文档
MATLAB支持 gpuArray 的函数 
Statistics and Machine Learning Toolbox™支持 gpuArray 的函数 (Statistics and Machine Learning Toolbox)Analyze and Model Data on GPU (Statistics and Machine Learning Toolbox)
Image Processing Toolbox™支持 gpuArray 的函数 (Image Processing Toolbox)GPU 计算 (Image Processing Toolbox)
Deep Learning Toolbox™

支持 gpuArray 的函数 (Deep Learning Toolbox)

*(另请参阅 利用 GPU 进行深度学习)

Scale Up Deep Learning in Parallel, on GPUs, and in the Cloud (Deep Learning Toolbox)

Deep Learning with MATLAB on Multiple GPUs (Deep Learning Toolbox)

Computer Vision Toolbox™支持 gpuArray 的函数 (Computer Vision Toolbox)GPU Code Generation and Acceleration (Computer Vision Toolbox)
Communications Toolbox™支持 gpuArray 的函数 (Communications Toolbox)C/C++ Code Generation (Communications Toolbox)
5G Toolbox™支持 gpuArray 的函数 (5G Toolbox) 
Signal Processing Toolbox™支持 gpuArray 的函数 (Signal Processing Toolbox)代码生成和 GPU 支持 (Signal Processing Toolbox)
Audio Toolbox™支持 gpuArray 的函数 (Audio Toolbox)Code Generation and GPU Support (Audio Toolbox)
Wavelet Toolbox™支持 gpuArray 的函数 (Wavelet Toolbox)Code Generation and GPU Support (Wavelet Toolbox)
Curve Fitting Toolbox™支持 gpuArray 的函数 (Curve Fitting Toolbox) 

有关所有 MathWorks® 产品中支持 gpuArray 的函数列表,请参阅 gpuArray 支持的函数。或者,您也可以按产品进行过滤。在帮助栏上,点击函数。在函数列表中,浏览左侧窗格以选择一个产品,例如 MATLAB。在左侧窗格的底部,选择 GPU 数组。如果您选择的产品不具备启用 gpuArray 的函数,则 GPU 数组过滤器不可用。

示例

全部折叠

要将数据从 CPU 传输到 GPU,请使用 gpuArray 函数。

创建一个数组 X

X = [1,2,3];

X 传输到 GPU。

G = gpuArray(X);

检查数据是否在 GPU 上。

isgpuarray(G)
ans = logical
   1

计算数组 G 的逐元素平方。

GSq = G.^2;

将结果 GSq 传回 CPU。

XSq = gather(GSq)
XSq = 1×3

     1     4     9

检查数据不在 GPU 上。

isgpuarray(XSq)
ans = logical
   0

您可以通过使用一些 MATLAB 函数并指定选项“gpuArray"”直接在 GPU 上创建数据。

直接在 GPU 上创建随机数数组。

G = rand(1,3,"gpuArray")
G =

    0.3640    0.5421    0.6543

检查输出是否存储在 GPU 上。

isgpuarray(G)
ans = logical
   1

此示例显示如何使用启用 gpuArray 的 MATLAB 函数来操作 gpuArray 对象。您可以使用gpuDevice函数检查 GPU 的属性。

gpuDevice
ans = 
  CUDADevice with properties:

                      Name: 'Quadro P620'
                     Index: 2
         ComputeCapability: '6.1'
            SupportsDouble: 1
     GraphicsDriverVersion: '511.79'
               DriverModel: 'WDDM'
            ToolkitVersion: 11.2000
        MaxThreadsPerBlock: 1024
          MaxShmemPerBlock: 49152 (49.15 KB)
        MaxThreadBlockSize: [1024 1024 64]
               MaxGridSize: [2.1475e+09 65535 65535]
                 SIMDWidth: 32
               TotalMemory: 2147287040 (2.15 GB)
           AvailableMemory: 1615209678 (1.62 GB)
               CachePolicy: 'balanced'
       MultiprocessorCount: 4
              ClockRateKHz: 1354000
               ComputeMode: 'Default'
      GPUOverlapsTransfers: 1
    KernelExecutionTimeout: 1
          CanMapHostMemory: 1
           DeviceSupported: 1
           DeviceAvailable: 1
            DeviceSelected: 1

创建一个重复值从 -15 到 15 的行向量。要将其传输到 GPU 并创建 gpuArray 对象,请使用 gpuArray函数。

X = [-15:15 0 -15:15 0 -15:15];
gpuX = gpuArray(X);
whos gpuX
  Name      Size            Bytes  Class       Attributes

  gpuX      1x95              760  gpuArray              

要操作 gpuArray 对象,请使用任何启用 gpuArray 的 MATLAB 函数。MATLAB 自动在 GPU 上运行计算。有关详细信息,请参阅在 GPU 上运行 MATLAB 函数。例如,将 diagexpmmodroundabsfliplr 一起使用。

gpuE = expm(diag(gpuX,-1)) * expm(diag(gpuX,1));
gpuM = mod(round(abs(gpuE)),2);
gpuF = gpuM + fliplr(gpuM);

绘制结果。

imagesc(gpuF);
colormap(flip(gray));

Figure contains an axes object. The axes object contains an object of type image.

如果需要将数据从 GPU 传回,请使用 gather。将数据传输回 CPU 的成本可能很高,并且通常没有必要,除非您需要将结果与不支持 gpuArray 的函数一起使用。

result = gather(gpuF);
whos result
  Name         Size            Bytes  Class     Attributes

  result      96x96            73728  double              

一般来说,由于 GPU 和 CPU 之间的数值精度和算法差异,在 CPU 和 GPU 上运行代码会产生不同的结果。CPU 和 GPU 的答案都是对真实分析结果同样有效的浮点近似值,只是在计算过程中受到了不同的舍入行为的影响。在这个例子中,结果是整数,并且 round 消除了舍入误差。

此示例说明如何使用 MATLAB 函数和运算符与 gpuArray 对象通过蒙特卡洛积分法计算函数的积分。

定义要采样的点数。通过使用 rand 函数创建随机点,在函数的定义域中对 x 和 y 坐标中的区间 [-1,1] 进行采样。要直接在 GPU 上创建随机数组,请使用 rand 函数并指定“gpuArray"。有关详细信息,请参阅在 GPU 上建立数组

n = 1e6;
x = 2*rand(n,1,"gpuArray")-1;
y = 2*rand(n,1,"gpuArray")-1;

定义要积分的函数,并对其使用蒙特卡洛积分公式。该函数通过对单位圆内的点进行采样来近似 π 的值。由于代码在 gpuArray 对象上使用启用 gpuArray 的函数和运算符,因此计算会自动在 GPU 上运行。您可以使用与 MATLAB 数组相同的语法执行二元运算,例如逐元素乘法。有关启用 gpuArray 的函数的更多信息,请参阅 在 GPU 上运行 MATLAB 函数

f = x.^2 + y.^2 <= 1;
result = 4*nnz(f)/n
result = 3.1433

限制

  • 以下任何一项都不能超过 intmax("int32")

    • 密集数组的元素数量。

    • 稀疏数组中非零元素的数量。

    • 任意给定维度的大小。例如,不允许使用 zeros(0,3e9,"gpuArray")

  • 不支持使用 distributedcodistributed 函数在并行池中的工作进程之间分配 gpuArray。如果您有多个 GPU,并且并行池中的每个工作进程都可以访问唯一的 GPU,那么您可以手动拆分或最初将数据生成为不同工作进程上的多个 gpuArray 对象。有关如何在并行池中使用 gpuArray 数据的示例,请参阅 在多个 GPU 上运行 MATLAB 函数

  • 稀疏 gpuArray 限制:

    • 稀疏 GPU 数组仅支持通过索引引用整行或整列。

    • 不支持通过索引为稀疏 GPU 数组分配值。

    有关详细信息,请参阅在 GPU 上使用稀疏数组

提示

  • 如果您需要更好的性能,或者 GPU 上无法使用某个函数,gpuArray 支持以下选项:

  • 要控制 GPU 上的随机数流,请使用 gpurng 函数。

替代方法

您还可以通过指定 gpuArray 输出,使用一些 MATLAB 函数创建 gpuArray 对象。下表列出了使您能够直接创建 gpuArray 对象的 MATLAB 函数。有关更多信息,请参阅函数参考页的扩展功能部分。

eye(___,"gpuArray")true(___,"gpuArray")
false(___,"gpuArray")zeros(___,"gpuArray")
Inf(___,"gpuArray")createArray(___,"gpuArray") (自 R2024a 起)
NaN(___,"gpuArray")gpuArray.colon
ones(___,"gpuArray")gpuArray.freqspace
rand(___,"gpuArray")gpuArray.linspace
randi(___,"gpuArray")gpuArray.logspace
randn(___,"gpuArray")gpuArray.speye

扩展功能

版本历史记录

在 R2010b 中推出