主要内容

运行MATLAB图形处理器功能

MATLAB功能与gpuArray参数

MATLAB中的数百个函数®和其他工具箱自动运行在GPU上,如果你提供一个gpuArray论点。

A = gpuArray([1 0 1;-1 -2 0;0 1 -1]);e = eig(A);

当您至少使用一个函数调用这些函数时gpuArray作为数据输入参数,函数在GPU上执行。函数生成gpuArray,除非返回MATLAB数据更合适(例如,大小).您可以混合使用这两种输入gpuArray和MATLAB数组在同一个函数中调用。有关函数何时在GPU或CPU上运行的详细信息,请参见gpuArray输入的特殊条件gpuArray启用的函数包括离散傅里叶变换(fft),矩阵乘法(mtimes),左矩阵除法(mldivide),以及数以百计的其他网站。有关更多信息,请参见检查gpuarray支持的函数万博1manbetx

检查gpuArray支万博1manbetx持功能

如果一个MATLAB函数有支持万博1manbetxgpuArray对象,您可以在其功能页面上咨询其他GPU使用信息。看到GPU数组扩展功能部分在功能页的末尾。

提示

获取支持的MATLAB函数的筛选列表万博1manbetxgpuArray对象,看到功能列表(gpu -array)

几个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数组过滤器不可用。

gpu深度学习

对于深度学习工具箱中的许多功能,如果您有合适的GPU和并行计算工具箱™,GPU支持是自动的。万博1manbetx您不需要将数据转换为gpuArray.下面是一个非详尽的函数列表,默认情况下,如果可用,这些函数将在GPU上运行。

有关“深度学习工具箱”中自动GPU支持的更多信息,请参见万博1manbetx并行、gpu和云中扩展深度学习(深度学习工具箱)

用于使用定义为的网络的高级网络和工作流dlnetwork(深度学习工具箱)对象或模型函数,将数据转换为gpuArray.使用功能与gpuArray万博1manbetx(深度学习工具箱)在GPU上运行自定义训练循环或预测。

选中或选择图形处理器

如果你有一个GPU, MATLAB会自动使用它来进行GPU计算。您可以使用gpuDevice函数。如果你有多个gpu,那么你可以使用gpuDeviceTable检查系统中检测到的所有gpu的属性。你可以使用gpuDevice选择其中之一,或者使用多个具有并行池的gpu。有关示例,请参见识别并选择GPU设备而且并行池使用多gpu.要检查是否支持您的GPU,请参见万博1manbetxGPU支万博1manbetx持版本

对于深度学习,MATLAB提供了多个gpu的自动并行支持。万博1manbetx看到基于MATLAB的多gpu深度学习(深度学习工具箱)

使用GPU的MATLAB函数

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

gpuDevice
ans = CUDADevice with properties: Name: 'TITAN RTX' Index: 1 ComputeCapability: '7.5' 万博1manbetxSupportsDouble: 1 DriverVersion: 11.2000 ToolkitVersion: 11 MaxThreadsPerBlock: 1024 MaxShmemPerBlock: 49152 MaxThreadBlockSize: [1024 1024 64] MaxGridSize: [2.1475e+09 65535 65535] SIMDWidth: 32 TotalMemory: 2.5770e+10 AvailableMemory: 2.4177e+10 MultiprocessorCount: 72 ClockRateKHz: 1770000 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];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的答案都是对真实分析结果同样有效的浮点近似,在计算过程中受到不同的舍入行为的影响。在本例中,结果是整数和消除舍入错误。

使用GPU锐化图像

这个例子展示了如何使用gpuArrays和启用gpu的函数锐化图像。

读取图像,并将其发送到GPU使用gpuArray函数。

image = gpuArray(imread(“peppers.png”));

将图像转换为双重图像,并应用卷积得到梯度图像。然后,使用梯度图像,锐化图像的一个因素

Dimage = im2double(图像);梯度= convn(image,ones(3)./9,“相同”- convn(image,ones(5)./25,“相同”);金额= 5;锐化=图像+数量。*梯度;

调整大小,绘图和比较原始和锐化图像。

imshow (imresize ([dimage,磨),0.7));标题(“原始图像(左)vs锐化图像(右)”);

通过gpu功能计算Mandelbrot集

这个例子展示了如何使用gpu支持的MATLAB函数来计算一个著名的数学结构:Mandelbrot集。检查您的GPU使用gpuDevice函数。

定义参数。Mandelbrot算法在实部和虚部的网格上迭代。下面的代码定义了迭代次数、网格大小和网格限制。

maxIterations = 500;gridSize = 1000;Xlim = [-0.748766713922161, -0.748766707771757];Ylim = [0.123640844894862, 0.123640851045266];

您可以使用gpuArray函数将数据传输到GPU,并创建一个gpuArray,或者直接在GPU上创建数组。gpuArray提供了可用于创建数据数组的许多函数的GPU版本,例如linspace.有关更多信息,请参见直接创建GPU阵列

x = gpuArray.linspace(xlim(1),xlim(2),gridSize);y = gpuArray.linspace(ylim(1),ylim(2),gridSize);谁xy
名称大小字节类属性x 1x1000 8000 gpuArray y 1x1000 8000 gpuArray

很多MATLAB函数都支持gpuArrays万博1manbetx。当你为任何GPU启用的函数提供一个gpuArray参数时,该函数会自动在GPU上运行。有关更多信息,请参见在图形处理器上运行MATLAB函数.为算法创建一个复杂的网格,并创建数组为了结果。要直接在GPU上创建此数组,请使用函数,并指定“gpuArray”

[xGrid,yGrid] = meshgrid(x,y);z0 = complex(xGrid,yGrid);Count = ones(size(z0),“gpuArray”);

下面的代码使用启用gpu的函数实现Mandelbrot算法。因为代码使用gpuArrays,所以计算是在GPU上进行的。

Z = z0;n = 0:maxIterations z = z.*z + z0;Inside = abs(z) <= 2;计数=计数+内部;结束Count = log(Count);

计算完成后,把结果画出来。

Imagesc (x,y,count) colormap([jet();flipud(jet());0 0 0]);轴

在GPU上使用稀疏数组

下面的函数支持稀疏万博1manbetxgpuArray对象。

abs acos acosd acosh acot acotd acth acsc acscd acsch angle asec asecd asech asin asind asinh atan atand atanh bicg bicgstab ceil cgs class底层conj cos cosd cosh cospi cot cotd coth csc cscd csch ctranspose deg2rad diag
end eps exp expm1 find fix floor full gmres gpuArrayspeye imag isisdiag isempty isequal isequal isfinite isfloat isinteger islogical isnumeric isreal issparse istril istriu isUnderlyingType长度log log2 log10 log1p lsqr减去mtimes mustBeUnderlyingType ndims nextpow2 nnz
非零范数nzmax pcg + qmr rad2deg real reallog realsqrt round sec secd sech符号sin sinind sinh sinpi大小稀疏spfun spones sprandsym根号sum tan tand tanh tfqmr times (.*) trace转置tril triu uminus基础类型uplus

你可以创建一个稀疏gpuArray要么打电话稀疏的与一个gpuArray输入,或者调用gpuArray使用稀疏输入。例如,

X = [0 1 0 0 0;0 0 0 0 1]
0 1 0 0 0 0 0 0 0 1
S =稀疏(x)
(1,2) 1 (2,5
g = gpuArray(s);% g是一个稀疏gpuArrayGt =转置(g);% gt是一个稀疏gpuArrayF =满(gt)% f是一个完整的gpuArray
0 0 1 0 0 0 0 0 0 1

稀疏的gpuArray对象不支持索引。万博1manbetx相反,使用找到定位数组的非零元素及其行和列索引。然后,替换你想要的值并构造一个新的稀疏gpuArray

在GPU上使用复数

如果在GPU上运行的函数的输出可能是复杂的,那么必须显式地将其输入参数指定为复杂的。这适用于gpuArray或者在代码中调用的函数arrayfun

例如,如果创建一个gpuArray可能会有负面因素G = gpuArray(complex(p)),则可以成功执行sqrt (G)

或者,在传递给的函数中arrayfun,如果x是实数向量,有些元素为负值,sqrt (x)生成错误;相反你应该打电话给√复杂(x))

如果结果是agpuArray对于复杂的数据,所有虚部为零,这些部分被保留,数据仍然是复杂的。这可能会在使用时产生影响排序伊斯雷尔等等。

下表列出了可能返回复杂数据的函数,以及输出为实数的输入范围。

函数 实际输出的输入范围
这些“可信赖医疗组织”(x) Abs (x) <= 1
作用(x) X >= 1
acoth (x) Abs (x) >= 1
正式启动(x) Abs (x) >= 1
asec (x) Abs (x) >= 1
asech (x) 0 <= x <= 1
正如(x) Abs (x) <= 1
atanh (x) Abs (x) <= 1
日志(x) X >= 0
log1p (x) X >= -1
log10 (x) X >= 0
log2 (x) X >= 0
功率(x, y) X >= 0
reallog (x) X >= 0
realsqrt (x) X >= 0
sqrt (x) X >= 0

gpuArray输入的特殊条件

仅当数据在图形处理器上时,GPU功能才会在图形处理器上运行。例如,下面的代码运行在GPU上,因为数据,第一个输入,是在GPU上:

> >总和(gpuArray(魔法(10)),2);
但是,这段代码不能在GPU上运行,因为第一个输入的数据不在GPU上:
> >总和(魔法(10),gpuArray (2));
如果你的输入参数gpuArray对象包含诸如尺寸、缩放因子或迭代次数等项,然后函数将它们收集起来并在CPU上进行计算。函数只有在实际的数据参数为时才在GPU上运行gpuArray对象。

致谢

岩浆是一个利用GPU加速的线性代数例程库。实现的线性代数函数gpuArray并行计算工具箱中的对象利用MAGMA实现高性能和高精度。

另请参阅

|

相关的例子

更多关于