主要内容

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

gpuDevice

查询或选择 GPU 设备

说明

GPUDevice 对象代表计算机中的图形处理单元 (GPU)。您可以使用 GPU 运行支持 gpuArray 变量的 MATLAB® 代码或使用 CUDAKernel 对象执行 CUDA® 内核。

您可以使用 GPUDevice 对象来检查 GPU 设备的属性、重置 GPU 设备或等待 GPU 完成执行计算。要获取 GPUDevice 对象,请使用 gpuDevice 函数。您还可以使用 gpuDevice 函数选择或取消选择您的 GPU 设备。如果您可以访问多个 GPU,请使用 gpuDevice 函数选择要在其上执行代码的特定 GPU 设备。

您不需要使用 GPUDevice 对象在 GPU 上运行函数。有关如何使用支持 GPU 的函数的更多信息,请参阅 在 GPU 上运行 MATLAB 函数

创建对象

描述

gpuDevice 显示当前选定的 GPU 设备的属性。如果当前没有选定的设备,gpuDevice 将选择默认设备而不清除它。当您想要检查 GPU 设备的属性时,请使用此语法。

D = gpuDevice 返回一个代表当前选定的设备的 GPUDevice 对象。如果当前没有选定的设备,gpuDevice 将选择默认设备并返回代表该设备的 GPUDevice 对象而不清除它。

示例

D = gpuDevice(ind) 选择索引 ind 指定的 GPU 设备。如果指定的 GPU 设备不受支持,则会发生错误。此语法重置指定的设备并清除其内存,即使该设备当前已被选中(相当于 reset 函数)。所有代表 gpuArrayCUDAKernel 变量的工作区变量现在无效,必须从工作区中清除或重新定义。

示例

gpuDevice([]) 使用一个空参量(而不是没有参量)取消选择 GPU 设备并清除其内存中的 gpuArrayCUDAKernel 变量。此语法不选择任何 GPU 设备作为当前设备。

示例

输入参量

全部展开

GPU 设备的索引,指定为 1gpuDeviceCount 范围内的整数。

示例: gpuDevice(1);

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

属性

全部展开

标识

此 属性 为只读。

GPU 设备的名称,指定为字符数组。分配给设备的名称源自 GPU 设备模型。

数据类型: char

此 属性 为只读。

GPU 设备的索引,指定为 1gpuDeviceCount 范围内的整数。使用此索引来选择特定的 GPU 设备。

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

自 R2024a 起

此 属性 为只读。

设备的通用唯一标识符 (UUID),指定为字符数组。

UUID 通常以 'GPU-' 开头,包含 36 个字符的十六进制序列。您可以使用 UUID 来区分其他相同的 GPU。

数据类型: char

状态

此 属性 为只读。

当前选定的设备的标志,由逻辑值 0 (false) 或 1 (true) 指定。

数据类型: logical

此 属性 为只读。

可用设备的标志,由逻辑值 0 (false) 或 1 (true) 指定。此属性指示该设备是否可在当前 MATLAB 会话中使用。DeviceSupported 属性为 0 (false) 的不受支持的设备始终不可用。如果设备的 ComputeMode 属性设置为 'Exclusive thread''Exclusive process''Prohibited',则设备也可能不可用。

数据类型: logical

此 属性 为只读。

支持的设备标志,由逻辑值 0 (false) 或 1 (true) 指定。并非所有设备都受支持;例如 ComputeCapability 不足的设备。

数据类型: logical

自 R2024b 起

此 属性 为只读。

当前 MATLAB 会话上次访问设备的日期和时间,指定为标量 datetime 数组。如果在此会话中未访问过该设备,则 LastAccessed 为 Not-a-Time (NaT)。

MATLAB 更新 LastAccessed 中 GPU 设备的大多数用途,包括:

  • 使用 gpuDevice 选择设备。

  • 使用 reset 重置设备。

  • 创建或使用 gpuArray

查询当前选定的设备的属性不会更新 LastAccessed

数据类型: datetime

内存

此 属性 为只读。

设备上的总内存(以字节为单位),指定为标量值。

数据类型: double

此 属性 为只读。

可用于数据的总内存(以字节为单位),指定为标量值。此属性仅适用于当前选定的设备。由于内存缓存,该值可能与 NVIDIA® 系统管理接口报告的值不同。

数据类型: double

自 R2023a 起

GPU 设备的缓存策略,指定为 'balanced''minimum''maximum'。缓存策略决定可以缓存多少 GPU 内存来加速计算,指定为以下值之一。

  • 'minimum' - GPU 设备上可缓存的内存量很少。

  • 'balanced' - GPU 设备上可缓存的内存量已平衡。该策略在 GPU 内存使用量和计算性能之间提供了平衡。

  • 'maximum' - GPU 设备上可缓存的内存量仅受设备总内存的限制。

对于处于 'balanced''Default' 计算模式的设备,默认值为 'Prohibited';对于处于 'maximum' 计算模式的设备,默认值为 'Exclusive process'。有关计算模式属性的更多信息,请参阅 ComputeMode

注意

  • 使用 reset 重置设备、使用 gpuDevice([]) 清除设备或使用 gpuDevice 选择另一个设备会将缓存策略重置为默认策略。

  • 保存和加载包含 GPUDevice 对象的 MAT 文件不会保留缓存策略。

  • 您无法设置未选择的设备的缓存策略。例如,将第一个 GPUDevice 对象存储在数组中并选择另一个设备后,您无法设置第一个 GPUDevice 对象的缓存策略。

数据类型: char | string

驱动

自 R2023a 起

此 属性 为只读。

GPU 设备当前使用的图形驱动程序版本,指定为字符数组。

NVIDIA 驱动程序下载处下载适用于您的 GPU 的最新图形驱动程序。

数据类型: char

自 R2023a 起

此 属性 为只读。

图形驱动程序的操作模型,指定为以下值之一:

  • 'WDDM' - 使用显示操作模型。

  • 'TCC' - 使用计算操作模型。'TCC' 禁用 Windows® 图形并可以提高大规模计算的性能。

  • 'N/A' - 'WDDM''TCC' 仅在 Windows 上可用。在其他操作系统上,驱动程序模型是 'N/A'

有关更改模型以及哪些 GPU 设备支持 'TCC' 的更多信息,请参阅 NVIDIA 文档。

数据类型: char

此 属性 为只读。

设备的计算模式,指定为下列值之一。

'Default'该设备不受限制,多个应用程序可以同时使用它。MATLAB 可以与其他应用程序共享设备,包括其他 MATLAB 会话或工作单元。
'Exclusive process'每次只有一个应用程序可以使用该设备。虽然在 MATLAB 中选择了该设备,但其他应用程序不能使用它,包括其他 MATLAB 会话或工作单元。
'Prohibited'无法使用该设备。

有关更改 GPU 设备计算模式的更多信息,请查阅 NVIDIA 文档。

数据类型: char

此 属性 为只读。

长时间运行内核的超时标志,指定为 0 (false) 或 1 (true)。如果 KernelExecutionTimeout1 (true),那么操作系统就会对 CUDA 内核执行的时间设置上限。此后,CUDA 驱动程序会使内核超时并返回错误。

数据类型: logical

能力

此 属性 为只读。

GPU 设备的计算能力,指定为字符数组。要使用 MATLAB 中选择的 GPU 设备,ComputeCapability 必须满足 GPU 计算要求 中所需的规格。

数据类型: char

此 属性 为只读。

设备上存在的流多处理器的数量,指定为标量值。

此 属性 为只读。

GPU 的峰值时钟频率(以 kHz 为单位),指定为标量值。

数据类型: double

自 R2024b 起

此 属性 为只读。

设备上单精度与双精度浮点单元 (FPU) 的比例,指定为标量值。

该比率表示设备的单精度处理能力相对于双精度处理能力。适合双精度计算(例如求解线性系统)的设备通常具有较低的比率。适合单精度计算的设备(例如训练深度神经网络和渲染图形)通常具有较大的比例。

数据类型: double

内核编程

此 属性 为只读。

CUDAKernel 执行期间每个块支持的最大线程数,指定为标量值。

示例: 1024

数据类型: double

此 属性 为只读。

线程块在 CUDAKernel 执行期间可以使用的最大支持共享内存量,指定为标量值。

数据类型: double

此 属性 为只读。

线程块在每个维度上的最大大小,指定为向量。线程块的每个维度都不能超出这些维度。此外,线程块大小的乘积不得超过 MaxThreadsPerBlock

示例: [1024 1024 64]

数据类型: double

此 属性 为只读。

线程块网格的最大大小,指定为向量。

示例: [2.1475e+09 65535 65535]

数据类型: double

此 属性 为只读。

同时执行的线程数,指定为标量值。

数据类型: double

此 属性 为只读。

CUDA 当前版本使用的 MATLAB 工具包版本,指定为标量值。

数据类型: double

对象函数

reset重置 GPU 设备并清除其内存
wait (GPUDevice)等待 GPU 计算完成

还提供以下函数:

parallel.gpu.GPUDevice.isAvailable(ind)如果索引 1 指定的 GPU 受支持且能够被选择,则返回逻辑 trueindind 可以是整数或整数向量;默认索引是当前设备。
parallel.gpu.GPUDevice.getDevice(ind)返回一个 GPUDevice 对象而不选择它。

要获得完整的函数列表,请在 methods 对象上使用 GPUDevice 函数:

methods('parallel.gpu.GPUDevice')

您可以使用以下命令获取任何对象函数的帮助:

help parallel.gpu.GPUDevice.functionname

其中 functionname 是函数的名称。例如,要获取有关 isAvailable 的帮助,请输入:

help parallel.gpu.GPUDevice.isAvailable

示例

全部折叠

此示例显示如何使用 gpuDevice 来识别和选择您想要使用的设备。

要确定您的计算机中有多少个可用的 GPU 设备,请使用 gpuDeviceCount函数。

gpuDeviceCount("available")
ans = 2

当有多个设备时,第一个是默认的。您可以使用 gpuDeviceTable函数检查其属性,以确定它是否是您想要使用的函数。

gpuDeviceTable
ans=2×5 table
    Index           Name           ComputeCapability    DeviceAvailable    DeviceSelected
    _____    __________________    _________________    _______________    ______________

      1      "NVIDIA RTX A5000"          "8.6"               true              false     
      2      "Quadro P620"               "6.1"               true              false     

如果第一个设备是您想要使用的设备,那么您可以继续。要在 GPU 上运行计算,请使用启用 gpuArray 的函数。有关详细信息,请参阅在 GPU 上运行 MATLAB 函数

要验证 MATLAB® 是否可以使用您的 GPU,请使用 canUseGPU 函数。如果有可用于计算的 GPU,则该函数返回 1 (true),否则返回 0 (false)。

canUseGPU
ans = logical
   1

要诊断 GPU 设置的问题,例如如果 canUseGPU 返回 0 (false),请使用 validateGPU 函数。验证您的 GPU 是可选的。

validateGPU
# Beginning GPU validation
# Performing system validation
#    CUDA-supported platform .................................................PASSED
#    CUDA-enabled graphics driver exists .....................................PASSED
#        Version: 537.70
#    CUDA-enabled graphics driver load .......................................PASSED
#    CUDA environment variables ..............................................PASSED
#    CUDA device count .......................................................PASSED
#        Found 2 devices.
#    GPU libraries load ......................................................PASSED
# 
# Performing device validation for device index 1
#    Device exists ...........................................................PASSED
#        NVIDIA RTX A5000
#    Device supported ........................................................PASSED
#    Device available ........................................................PASSED
#        Device is in 'Default' compute mode.
#    Device selectable .......................................................PASSED
#    Device memory allocation ................................................PASSED
#    Device kernel launch ....................................................PASSED
# 
# Finished GPU validation with no failures.

要使用另一个设备,请使用另一个设备的索引调用gpuDevice

gpuDevice(2)
ans = 
  CUDADevice with properties:

                 Name: 'Quadro P620'
                Index: 2 (of 2)
    ComputeCapability: '6.1'
          DriverModel: 'WDDM'
          TotalMemory: 2147352576 (2.15 GB)
      AvailableMemory: 1596066816 (1.60 GB)
      DeviceAvailable: true
       DeviceSelected: true

  Show all properties.

或者,您可以确定有多少个可用的 GPU 设备,检查它们的一些属性,然后从 MATLAB® 桌面中选择要使用的设备。在主页选项卡上的环境区域中,选择并行 > 选择 GPU 环境

gpuDevice2.png

创建一个代表默认 GPU 设备的对象并查询其计算能力。

D = gpuDevice;
D.ComputeCapability
ans = 
'8.6'

查询所有可用 GPU 设备的计算能力。

for idx = 1:gpuDeviceCount
    D = gpuDevice(idx);
    fprintf(1,"Device %i has ComputeCapability %s \n", ...
        D.Index,D.ComputeCapability)
end
Device 1 has ComputeCapability 8.6 
Device 2 has ComputeCapability 6.1 

使用 gpuDeviceTable 比较系统中 GPU 设备的计算能力和可用性。

gpuDeviceTable
ans=2×5 table
    Index           Name           ComputeCapability    DeviceAvailable    DeviceSelected
    _____    __________________    _________________    _______________    ______________

      1      "NVIDIA RTX A5000"          "8.6"               true              false     
      2      "Quadro P620"               "6.1"               true              true      

更改 GPU 的缓存策略。

创建一个代表默认 GPU 设备的对象。

D = gpuDevice
D = 
  CUDADevice with properties:

                 Name: 'NVIDIA RTX A5000'
                Index: 1 (of 2)
    ComputeCapability: '8.6'
          DriverModel: 'TCC'
          TotalMemory: 25544294400 (25.54 GB)
      AvailableMemory: 25120866304 (25.12 GB)
      DeviceAvailable: true
       DeviceSelected: true

  Show all properties.

访问 GPU 设备的 CachePolicy 属性。

D.CachePolicy
ans = 
'balanced'

改变缓存策略,允许 GPU 缓存最大数量的内存,以加速计算。

D.CachePolicy = "maximum";
D.CachePolicy
ans = 
'maximum'

通过将属性设置为 [] 将缓存策略重置为默认策略。

D.CachePolicy = [];

调用 reset(D) 或使用 gpuDevice 选择另一个设备也会将缓存策略重置为其默认值。

如果您可以访问多个 GPU,则可以使用并行池在多个 GPU 上并行执行计算。

要确定 MATLAB 中可用的 GPU 数量,请使用 gpuDeviceCount函数。

availableGPUs = gpuDeviceCount("available")
availableGPUs = 3

启动一个并行池,其工作单元数量与可用的 GPU 数量相同。为了获得最佳性能,MATLAB 默认为每个工作单元分配不同的 GPU。

parpool("Processes",availableGPUs);
Starting parallel pool (parpool) using the 'Processes' profile ...
Connected to the parallel pool (number of workers: 3).

要识别每个工作单元正在使用哪个 GPU,请在 gpuDevice 代码块内调用 spmdspmd 代码块在每个工作单元上运行 gpuDevice

spmd
    gpuDevice
end

使用并行语言功能(例如 parforparfeval)将您的计算分配给并行池中的工作单元。如果您在计算中使用启用 gpuArray 的函数,这些函数将在工作单元的 GPU 上运行。有关详细信息,请参阅在 GPU 上运行 MATLAB 函数。有关示例,请参阅 在多个 GPU 上运行 MATLAB 函数

完成计算后,关闭并行池。您可以使用gcp函数来获取当前并行池。

delete(gcp("nocreate"));

如果您想使用不同的 GPU,那么您可以使用 gpuDevice 在每个工作单元上选择特定的 GPU,并使用 GPU 设备索引。您可以使用 gpuDeviceCount 函数获取系统中每个 GPU 设备的索引。

假设您的系统中有三个可用的 GPU,但您只想使用两个进行计算。获取设备的索引。

[availableGPUs,gpuIndx] = gpuDeviceCount("available")
availableGPUs = 3
gpuIndx = 1×3

     1     2     3

定义您想要使用的设备的索引。

useGPUs = [1 3];

启动您的并行池。使用 spmd 代码块和 gpuDevice 将每个工作单元与您想要使用的 GPU 之一关联起来,并使用设备索引。spmdIndex 函数标识每个工作单元的索引。

parpool("Processes",numel(useGPUs));
Starting parallel pool (parpool) using the 'Processes' profile ...
Connected to the parallel pool (number of workers: 2).
spmd
    gpuDevice(useGPUs(spmdIndex));
end

作为最佳做法,为了获得最佳性能,请为每个工作单元分配不同的 GPU。

完成计算后,关闭并行池。

delete(gcp("nocreate"));

扩展功能

全部展开

版本历史记录

在 R2010b 中推出

全部展开