跑步MATLABGPU上的函数

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输入的特殊条件。启用GPU-功能包括离散傅立叶变换(fft),矩阵乘法(时间),左矩阵除法(分水岭),和数百人。欲了解更多信息,请参阅检查GPU-Supp万博1manbetxorted功能

检查GPU-Supp万博1manbetxorted功能

如果一个MATLAB函数支持gpuarray,您可万博1manbetx以在它的函数页上查阅其他GPU使用信息。见GPU阵列扩展功能功能页末尾的部分。

小费

有关支持GPU阵列的MATLAB的筛选列表,请参见万博1manbetx函数列表(GPU数组)

一些MATLAB工具箱包含内置GPU支持的函数。万博1manbetx要查看这些支持gpuArrays的工具箱中的所有函数列表,请使用下表中的链接。万博1manbetx带有警告指示器的列表中的函数具有特定于在GPU上运行该函数的限制或用法说明。您可以在函数参考页面的扩展功能部分中查看使用说明和限制。有关单个启用gpu的函数的更新信息,请参阅发布说明。

工具箱的名字 支持gpuArray的函数列表万博1manbetx
MATLAB 支持gpuArray的函数万博1manbetx
统计与机器学习工具箱™ 支持gpuArray的函数万博1manbetx
图像处理工具箱™ 支持gpuArray的函数万博1manbetx
深度学习工具箱™

支持gpuArray的函数万博1manbetx

*(另见使用gpu进行深度学习)

计算机视觉工具箱™ 支持gpuArray的函数万博1manbetx
通信工具箱™ 支持gpuArray的函数万博1manbetx
信号处理工具箱™ 支持gpuArray的函数万博1manbetx
音频工具箱™ 支持gpuArray的函数万博1manbetx
小波工具箱™ 支持gpuArray的函数万博1manbetx
曲线拟合工具箱™ 支持gpuArray的函数万博1manbetx

您可以从所有MathWorks中浏览受万博1manbetxgpu支持的函数®s manbetx 845产品链接如下:GPU支万博1manbetx持的功能。或者,您可以根据产品进行筛选。在帮帮我栏中,单击功能. 在“函数”列表中,浏览左侧窗格以选择产品,例如MATLAB。在左窗格的底部,选择GPU阵列。如果您选择的产品没有启用gpu的功能,则GPU阵列过滤器不可用。

使用gpu进行深度学习

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

有关“深度学习工具箱”中自动GPU支持的详细信息,请参阅万博1manbetxgpu大数据并行深度学习(深度学习工具箱)。

用于使用定义为的网络的高级网络和工作流dlnetwork对象或模型功能,您的数据转换为gpuArray。采用支持gpuArray的函数万博1manbetx在GPU上运行自定义训练循环或预测。

检查或选择GPU

如果你有一个GPU,那么MATLAB会自动使用它进行GPU计算。您可以使用gpuDevice函数。如果您有多个gpu,那么您可以使用gpuDevice选择其中一个,或者使用多个带有并行池的gpu。例如,参见识别并选择GPU在并行池中使用多个GPU。要检查您的GPU支持,请参阅万博1manbetxGPU支万博1manbetx持方式发布

为了深入学习,MATLAB为多个GPU提供自动并行支持。见万博1manbetx深度学习与MATLAB在多GPU(深度学习工具箱)。

使用GPU使用MATLAB函数

这个例子展示了如何使用启用GPU的MATLAB函数来操作gpuarray。您可以使用gpuDevice函数。

gpuDevice
ANS = CUDADevice与属性:名称: '的GeForce GTX 1080' 索引:1个ComputeCapability: '6.1' SupportsDouble:1 Dr万博1manbetxiverVersion:10.1000 ToolkitVersion:10.1000 MaxThreadsPerBlock:1024 MaxShmemPerBlock:49152 MaxThreadBlockSize:[1024 1024 64] MaxGridSize:[2.1475e + 0965535 65535] SIMDWidth:32 TotalMemory:8.5899e + 09 AvailableMemory:6.9012e + 09 MultiprocessorCount:20 ClockRateKHz:1733500 ComputeMode: '默认' GPUOverlapsTransfers:1 KernelExecutionTimeout:1 CanMapHostMemory:1 DeviceSupported万博1manbetx:1 DeviceSelected:1

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

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

要使用gpuArrays,请使用任何支持gpu的MATLAB函数。MATLAB在GPU上自动运行计算。欲了解更多信息,请参阅在GPU上运行MATLAB功能。例如,使用的组合诊断,expm,MOD,,防抱死制动系统,翻转

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

绘制结果。

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

如果您需要转移从GPU,采用数据备份聚集。将数据收集回CPU的成本可能很高,而且通常没有必要这样做,除非您需要将结果用于不支持gpuArray的函数。万博1manbetx

结果=收集(gpuF);谁是结果
名称大小字节类属性结果96x96 73728双精度

通常情况下,如果你在CPU上运行代码,结果可能会有差异,这是由于GPU和CPU之间的数值精度和算法差异造成的。CPU和GPU上的答案对于真实的分析结果都是同样有效的浮点近似,在计算过程中经历了不同的舍入。在本例中,结果是整数和消除了舍入误差。

使用GPU锐化图像

这个例子说明了如何使用gpuArrays并启用GPU的功能,锐化图像。

读取图像,并使用gpuArray函数。

图像= gpuArray(imread('peppers.png'));

将图像转换为双打,并应用卷积获得梯度图像。然后,使用梯度图像,通过一个因子锐化图像

dimage=im2double(图像);gradient=convn(dimage,1(3)。/9,“相同”) -  CONVN(DIMAGE,酮(5)./ 25,“相同”);数量=5;锐化=尺寸+数量。*渐变;

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

imshow(imresize([DIMAGE,削尖],0.7));标题('原始图像(左)与锐化图像(右)');

使用GPU-启用函数计算Mandelbrot集

这个例子说明了如何使用启用GPU的MATLAB函数来计算一个著名的数学结构:Mandelbrot集。检查您的GPU使用gpuDevice函数。

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

最大迭代次数=500;网格大小=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),网格大小);y=gpuArray.linspace空间(ylim(1),ylim(2),网格大小);whos是的
名称大小字节类属性X 1x1000的4 gpuArrayŸ1x1000的4 gpuArray

许多MATLAB函数都支持gpuarray。万博1manbetx当您为任何启用GPU的函数提供gpuArray参数时,该函数将在GPU上自动运行。有关详细信息,请参见在GPU上运行MATLAB功能。创建算法复杂的网格,并创建阵列计数出来的结果。要直接在GPU上创建这个数组,使用那些函数,并指定“gpuArray”

[xGrid, yGrid] = meshgrid (x, y);z0 =复杂(xGrid yGrid);数= 1(大小(z0),“gpuArray”);

下面的代码实现的Mandelbrot算法使用支持GPU-功能。由于代码使用gpuArrays,计算发生在GPU上。

z = z0;对于n = 0: maxiteration z = z。* z + z0;内= abs(z) <= 2;count = count + inside;结束计数= LOG(计数);

当计算完成后,绘制结果。

于imagesc(X,Y,计数)颜色表([射流(); flipud(喷射()); 0 0 0]);轴

在GPU上使用稀疏数组

以下函数支持稀疏gpuArrays。万博1manbetx

abs angle bicg bicgstab ceil cgs classunderprinding conj ctranspose deg2rad diag end expm1 find fix floor full gmresgpuArray.speye公司imag是基础isdiag是空的
isequal isequaln isfloat isinteger islogical isnumeric isreal issparse istril istriu长度log1p lsqr减去mtimes ndimes nextpow2 nnz非零范数numel nzmax pcg
加上qmr rad2deg real sqrt圆形符号大小稀疏spfun spones sprandsym sqrt sum tfqmr times(.*跟踪转置tril triu uminus uplus

您可以创建一个稀疏gpuArray通过调用稀疏的用gpuArray输入,或通过调用gpuArray用稀疏的输入。例如,

x=[0 1 0 0 0;0 0 0 1]
0 1 0 0 0 0 0 0 0 1
s=稀疏(x)
(1,2)1(2,5)1
g = gpuArray(年代);%g是稀疏的gpuArrayGT =转置(克);% gt是一个稀疏的gpuArrayf =全(gt)%f是一个完整的gpuArray
0 0 1 0 0 0 0 0 1

稀疏gpuArrays不支持索引。万博1manbetx取而代之的是,使用找到定位数组及其行和列索引的非零元素。然后,替换您想要的值并构造一个新的稀疏gpuArray。

在GPU上处理复数

如果在GPU上运行的函数的输出可能很复杂,则必须显式地将其输入参数指定为复杂。这适用于gpuArray或通过在所谓的代码运行的功能阵列风

例如,如果创建的gpuArray可能包含负元素,请使用G = gpuArray(络合物(P)),则可以成功执行sqrt (G)

或者,在传递给的函数内阵列风,如果是实数向量,有些元素有负值,SQRT(x)的生成一个错误;你应该打电话SQRT(复合物(X))

如果结果是复杂的数据的gpuArray和所有的虚部为零,这些部分被保留,所述数据仍然很复杂。这可能使用时产生影响排序,以色列, 等等。

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

函数 实际输出的输入范围
这些“可信赖医疗组织”(x) ABS(X)<= 1
ACOSH(x)的 x>=1
阿科思(x) ABS(X)> = 1
ACSC(x)的 ABS(X)> = 1
asec (x) ABS(X)> = 1
阿塞奇(x) 0 <= x <= 1
正如(x) ABS(X)<= 1
atanh (x) ABS(X)<= 1
日志(x) x>=0
对数1p(x) x > = 1
日志10(x)的 x>=0
LOG2(x)的 x>=0
功率(x, y) x>=0
reallog (x) x>=0
实数(x) x>=0
SQRT(x)的 x>=0

gpuArray输入的特殊条件

启用GPU-功能的GPU只有当数据在GPU上运行。例如,在GPU下面的代码运行,因为数据,第一输入,是在GPU上:

>>和(gpuArray(magic(10)),2);
但是,此代码不能在GPU上运行,因为数据,第一个输入,是不是在GPU上:
>>总和(魔(10),gpuArray(2));
如果输入参数gpuarray包含维度、缩放因子或迭代次数等项,则函数将收集这些项并在CPU上进行计算。只有当实际的数据参数是GPU数组时,函数才在GPU上运行。

致谢

岩浆是采取GPU加速的优势,线性代数例程库。Parallel Computing Toolbox中的杠杆作用MAGMA为gpuArrays实现线性代数函数来实现高性能和准确性。

另见

|

相关实例

更多关于