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
对象而不清除它。
gpuDevice([])
使用一个空参量(而不是没有参量)取消选择 GPU 设备并清除其内存中的 gpuArray
和 CUDAKernel
变量。此语法不选择任何 GPU 设备作为当前设备。
输入参量
GPU 设备的索引,指定为 1
到 gpuDeviceCount
范围内的整数。
示例: gpuDevice(1);
数据类型: single
| double
| int8
| int16
| int32
| int64
| uint8
| uint16
| uint32
| uint64
属性
标识
此 属性 为只读。
GPU 设备的名称,指定为字符数组。分配给设备的名称源自 GPU 设备模型。
数据类型: char
此 属性 为只读。
GPU 设备的索引,指定为 1
到 gpuDeviceCount
范围内的整数。使用此索引来选择特定的 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 起
此 属性 为只读。
图形驱动程序的操作模型,指定为以下值之一:
'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
)。如果 KernelExecutionTimeout
是 1
(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 受支持且能够被选择,则返回逻辑 true 或 ind 。ind 可以是整数或整数向量;默认索引是当前设备。 |
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 环境。
创建一个代表默认 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
代码块内调用 spmd
。spmd
代码块在每个工作单元上运行 gpuDevice
。
spmd gpuDevice end
使用并行语言功能(例如 parfor
或 parfeval
)将您的计算分配给并行池中的工作单元。如果您在计算中使用启用 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"));
扩展功能
该函数完全支持基于线程的环境。有关详细信息,请参阅在基于线程的环境中运行 MATLAB 函数。
版本历史记录
在 R2010b 中推出使用 gpuDevice
函数检查 GPU 设备的这些新属性:
LastAccessed
- 当前 MATLAB 会话上次访问设备的日期和时间。SingleDoubleRatio
- 设备上单精度与双精度浮点单元 (FPU) 的比例。
创建或查询 GPUDevice
对象现在仅显示 Name
、Index
、ComputeCapability
、DriverModel
、TotalMemory
、AvailableMemory
、DeviceAvailable
和 DeviceSelected
属性。要查看设备的所有属性,请创建或查询 GPUDevice
对象而不抑制输出,然后点击 Show all properties
链接。
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.
SupportsDouble
、GPUOverlapsTransfers
和 CanMapHostMemory
属性不再显示,但您仍然可以使用点符号查询这些属性。目前没有计划删除这些属性。
使用 GPUDevice
对象的 UUID
属性检查 GPU 的通用唯一标识符 (UUID)。您可以使用 UUID 来区分其他相同的 GPU。
例如,您可以使用 gpuDeviceTable
函数检查两个 GPU 的 UUID。
gpuDeviceTable(["Index","Name","UUID"])
Index Name UUID _____ __________________ __________________________________________ 1 "NVIDIA RTX A5000" "GPU-957b509e-322a-ae88-59c8-b7435d0f98f4" 2 "NVIDIA RTX A5000" "GPU-6f3ad2c0-5ea1-b1a2-1dca-cd756d10dbc0" 3 "NVIDIA RTX A5000" "GPU-41c24f34-c915-919b-0bb3-20d07117e0ec" 4 "NVIDIA RTX A5000" "GPU-23ab01ce-2f42-2d0c-0f6b-db7ac8c10867"
或者,您可以使用 gpuDevice
函数选择 GPU 并查询其 UUID。
D = gpuDevice; D.UUID
'GPU-957b509e-28ca-ae88-59c8-b7435d0f98f4'
添加
GraphicsDriverVersion
属性以显示当前正在使用的图形驱动程序版本。添加
DriverModel
属性以显示 Windows 上显卡驱动程序的运行模型。添加
CachePolicy
属性以允许更改 GPU 内存缓存策略。DriverVersion
属性不再默认显示,但您仍然可以使用点符号查询该属性。没有计划删除DriverVersion
属性。
MATLAB Command
You clicked a link that corresponds to this MATLAB command:
Run the command by entering it in the MATLAB Command Window. Web browsers do not support MATLAB commands.
选择网站
选择网站以获取翻译的可用内容,以及查看当地活动和优惠。根据您的位置,我们建议您选择:。
您也可以从以下列表中选择网站:
如何获得最佳网站性能
选择中国网站(中文或英文)以获得最佳网站性能。其他 MathWorks 国家/地区网站并未针对您所在位置的访问进行优化。
美洲
- América Latina (Español)
- Canada (English)
- United States (English)
欧洲
- Belgium (English)
- Denmark (English)
- Deutschland (Deutsch)
- España (Español)
- Finland (English)
- France (Français)
- Ireland (English)
- Italia (Italiano)
- Luxembourg (English)
- Netherlands (English)
- Norway (English)
- Österreich (Deutsch)
- Portugal (English)
- Sweden (English)
- Switzerland
- United Kingdom (English)