主要内容

gpuArray

存储在GPU上的数组

描述

一个gpuArray对象表示存储在GPU内存中的数组。MATLAB中大量的函数®并在其他工具箱中支持万博1manbetxgpuArray对象,允许您在gpu上运行代码,只需对代码进行最小的更改。与…一起工作gpuArray对象,使用任何gpuArray-启用MATLAB函数如fftmtimesmldivide.的完整列表gpuArray-在MATLAB和其他工具箱中启用的函数,请参见GPU-万博1manbetxsupported功能.有关更多信息,请参见在图形处理器上运行MATLAB函数

如果您想从GPU检索数组,例如当使用不支持的函数时万博1manbetxgpuArray对象,使用收集函数。

请注意

您可以加载MAT文件包含gpuArray当GPU不可用时,将数据作为内存数组。一个gpuArray没有GPU加载的对象是有限的,你不能使用它进行计算。使用gpuArray对象加载没有GPU,检索内容使用收集

创建

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

描述

例子

G = gpuArray(X复制数组X返回一个gpuArray对象。

输入参数

全部展开

要传输到GPU的数组,指定为数字或逻辑数组。GPU设备需要有足够的空闲内存来存储数据。如果X已经是gpuArray对象,gpuArray输出X不变。

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

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

数据类型:||int8|int16|int32|int64|uint8|uint16|uint32|uint64|逻辑
复数支持:万博1manbetx是的

对象的功能

arrayfun 在GPU上应用函数到数组的每个元素
收集 将分布式数组或gpuArray传输到本地工作区
pagefun 应用功能到分布式或GPU阵列的每一页

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

isgpuarray 确定输入是否为gpuArray
existsOnGPU 确定GPU上是否有gpuArray或CUDAKernel可用
isUnderlyingType 确定输入是否具有指定的底层数据类型
ndims 数组维数
大小 数组大小
underlyingType 决定数组行为的底层数据类型

有几个MATLAB工具箱包含带有gpuArray万博1manbetx支持。查看这些工具箱中支持的所有函数的列表万博1manbetxgpuArray对象,请使用下表中的链接。带有信息指示器的列表中的函数具有特定于在GPU上运行该函数的限制或使用说明。您可以在函数参考页面的Extended Capabilities部分查看使用说明和限制。有关个人更新的信息gpuArray-启用的函数,请参见发布说明。

工具箱的名字 函数列表gpuArray万博1manbetx GPU-Specific文档
MATLAB 功能与gpuArray万博1manbetx
统计和机器学习工具箱™ 功能与gpuArray万博1manbetx(统计和机器学习工具箱) 在GPU上分析和建模数据(统计和机器学习工具箱)
图像处理工具箱™ 功能与gpuArray万博1manbetx(图像处理工具箱) GPU计算(图像处理工具箱)
深度学习工具箱™

功能与gpuArray万博1manbetx(深度学习工具箱)

*(参见gpu深度学习

并行、gpu和云中扩展深度学习(深度学习工具箱)

基于MATLAB的多gpu深度学习(深度学习工具箱)

计算机视觉工具箱 功能与gpuArray万博1manbetx(计算机视觉工具箱) GPU代码生成和加速(计算机视觉工具箱)
通信工具箱™ 功能与gpuArray万博1manbetx(通信工具箱) 代码生成和加速支持万博1manbetx(通信工具箱)
信号处理工具箱 功能与gpuArray万博1manbetx(信号处理工具箱) 代码生成和GPU支持万博1manbetx(信号处理工具箱)
音频工具箱™ 功能与gpuArray万博1manbetx(音频工具箱) 代码生成和GPU支持万博1manbetx(音频工具箱)
小波工具箱™ 功能与gpuArray万博1manbetx(小波工具箱) 代码生成和GPU支持万博1manbetx(小波工具箱)
曲线拟合工具箱™ 功能与gpuArray万博1manbetx(曲线拟合工具箱)

的函数列表gpuArray万博1manbetx支持所有MathWorks®s manbetx 845产品,请参阅gpuArray支万博1manbetx持功能.或者,您可以根据产品进行过滤。在帮助栏,点击功能.在功能列表中,浏览左侧窗格选择一个产品,例如MATLAB。在左侧窗格的底部,选择GPU数组.如果您选择的产品没有gpuArray-enabled函数,然后GPU数组过滤器不可用。

例子

全部折叠

从CPU传输数据到GPU时,使用gpuArray函数。

创建数组X

X = [1,2,3];

转移X到GPU。

G = gpuArray(X);

检查数据是否在GPU上。

isgpuarray (G)
ans =逻辑1

计算数组的元素平方G

GSq = g ^2;

转移结果GSq回到CPU。

XSq = gather(GSq)
XSq =1×31 4 9

检查数据是否在图形处理器上。

isgpuarray (XSq)
ans =逻辑0

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

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

G = rand(1,3,“gpuArray”
G = 0.3640 0.5421 0.6543

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

isgpuarray (G)
ans =逻辑1

这个例子展示了如何使用gpuArray-启用MATLAB函数来操作gpuArray对象。属性可以检查GPU的属性gpuDevice函数。

gpuDevice
ans = CUDADevice with properties: Name: 'NVIDIA RTX A5000' Index: 1 ComputeCapability: '8.6' 万博1manbetxSupportsDouble: 1 DriverVersion: 11.6000 ToolkitVersion: 11.2000 MaxThreadsPerBlock: 1024 MaxShmemPerBlock: 49152 (49.15 KB) MaxThreadBlockSize: [1024 1024 64] MaxGridSize: [2.1475e+09 65535 65535] SIMDWidth: 32 TotalMemory: 25553076224 (25.55 GB) AvailableMemory: 25153765376 (25.15 GB) MultiprocessorCount: 64 ClockRateKHz: 1695000 ComputeMode: 'Default' GPUOverlapsTransfers: 1 KernelExecutionTimeout:0 CanMapHostMemory: 1 Device万博1manbetxSupported: 1 DeviceAvailable: 1 DeviceSelected: 1

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

X = [-15:15 0 -15:15 0 -15:15];gpx = gpuArray(X);谁gpuX
名称大小字节类属性gpuX 1x95 760 gpuArray

用…操作gpuArray对象,使用任何gpuArray-启用MATLAB函数。MATLAB在GPU上自动运行计算。有关更多信息,请参见在图形处理器上运行MATLAB函数.例如,使用诊断接头expm国防部腹肌,fliplr在一起。

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

画出结果。

显示亮度图像(gpuF);colormap(翻转(灰色));

如果需要将数据从GPU传输回来,请使用收集.将数据传输回CPU的成本很高,通常没有必要,除非您需要将结果用于不支持的函数万博1manbetxgpuArray

结果= gather(gpuF);谁结果
名称大小字节类属性result 96x96 73728 double

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

这个例子展示了如何使用MATLAB函数和运算符gpuArray对象用蒙特卡罗积分法计算函数的积分。

定义取样点的数量。函数定义域内的样本点,即区间[1]在这两个xy坐标,通过创建随机点兰德函数。要直接在GPU上创建随机数组,请使用兰德函数并指定"gpuArray”.有关更多信息,请参见在GPU上建立array

N = 1e6;X = 2*rand(n,1,“gpuArray”) 1;Y = 2*rand(n,1,“gpuArray”) 1;

定义要积分的函数,并对其使用蒙特卡罗积分公式。这个函数近似于的值 π 通过单位圆内的采样点。因为代码使用了gpuArray-启用函数和操作符gpuArray对象,计算自动运行在GPU上。您可以使用与MATLAB数组相同的语法执行二进制操作,例如逐元素的乘法。欲了解更多有关gpuArray-enabled函数,参见在图形处理器上运行MATLAB函数

F = x.^2 + y.^2 <= 1;结果= 4*1/n*f*ones(n,1,“gpuArray”
Result = 3.1403

提示

  • 如果你需要更好的性能,或者GPU上无法使用某个功能,gpuArray万博1manbetx支持以下选项:

    • 来预编译和运行纯元素代码gpuArray对象,使用arrayfun函数。

    • 运行包含CUDA的c++代码®设备代码或库调用时,使用MEX函数。有关更多信息,请参见运行包含CUDA代码的MEX-Functions

    • 要运行用CUDA c++编写的现有GPU内核,请使用MATLAB CUDAKernel接口。有关更多信息,请参见在GPU上运行CUDA或PTX Code

    • 要从MATLAB代码生成CUDA代码,使用GPU Coder™。有关更多信息,请参见开始使用GPU编码器(GPU编码器)

  • 支持对GPU上的随机数流进行控制gpurng

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

    • 密集数组的元素数。

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

    • 任何给定维度的大小。例如,0 (0,3 e9,“gpuArray”)是不允许的。

选择

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

眼睛(___“gpuArray”) 真正的(___“gpuArray”)
(___“gpuArray”) 0(___“gpuArray”)
(___“gpuArray”) gpuArray。结肠
(___“gpuArray”) gpuArray。freqspace
(___“gpuArray”) gpuArray。linspace
兰德(___“gpuArray”) gpuArray。logspace
兰迪(___“gpuArray”) gpuArray。speye
randn(___“gpuArray”)

扩展功能

版本历史

在R2010b中引入