MATLAB在GPU功能

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),矩阵乘法(mtimes),左矩阵分裂(mldivide),和数百人。欲了解更多信息,请参阅检查GPU支持的功能万博1manbetx

检查GPU支持的功能万博1manbetx

如果MATLAB功能有gpuArrays支持,您可万博1manbetx以参考它的功能页面上附加GPU使用信息。看到GPU阵列在里面扩展功能在功能页面的末端部分。

小费

对于MATLAB的过滤列表的支持GPU阵列,请参见万博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的浏览G万博1manbetxPU支持的功能®s manbetx 845产品通过以下链接:GPU支万博1manbetx持的功能。另外,您也可以按产品进行过滤。在帮帮我栏中,单击功能。在功能列表中,浏览左窗格中选择一个产品,例如,MATLAB。在左侧窗格的底部,选择GPU阵列。如果选择一个产品,没有启用GPU的功能,那么GPU阵列过滤不可用。

深度学习与GPU的

对于深度学习工具箱中的许多功能,GPU的支持是自动的,如果你有一个合适的GPU和并行计算工具箱™。万博1manbetx你并不需要将数据转换为gpuArray。以下是,默认情况下,在GPU(如果可用)运行函数的不完全名单。

有关在深学习工具箱自动GPU支持的更多信息,请参阅万博1manbetx深度学习与大数据在GPU和并行(深学习工具箱)。

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

检查或选择一个GPU

如果你有一个GPU,那么MATLAB会自动将其用于GPU计算。您可以使用检查你的GPUgpuDevice功能。如果你有多个GPU,那么你可以使用gpuDevice选择其中的一个,或者使用多个GPU与并行库。对于一个示例,请参见识别并选择一个GPU使用多个GPU在并行池。要检查您的GPU支持,请参阅万博1manbetxGPU支万博1manbetx持方式发布

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

与使用GPU功能的MATLAB

这个例子说明了如何使用启用GPU-功能的MATLAB与gpuArrays操作。您可以检查使用的GPU的性能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功能。例如,使用的组合诊断expmMOD回合ABSfliplr

gpuE = expm(DIAG(gpuX,-1))* expm(DIAG(gpuX,1));gpuM = MOD(圆(ABS(gpuE)),2);gpuF = gpuM + fliplr(gpuM);

绘制的结果。

于imagesc(gpuF);颜色表(翻转(灰色));

如果您需要转移从GPU,采用数据备份收集。收集回来的CPU可能是昂贵的,并且通常是没有必要的,除非你需要与不支持gpuArray函数使用你的结果。万博1manbetx

导致=聚集(gpuF);谁是结果
名称大小字节类属性的结果96x96的73728双

一般有可能在结果的差异,如果你的CPU上运行的代码,由于数值精度和GPU和CPU之间的差异算法。CPU和GPU的答案都同样有效浮点近似真实分析结果,计算期间具有经受了不同的舍入。在这个例子中,结果是整数,回合消除了舍入误差。

锐化图像使用GPU

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

读取图像,并利用其发送给GPUgpuArray功能。

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

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

DIMAGE = im2double(图像);梯度= CONVN(DIMAGE,酮(3)./ 9,'相同') -  CONVN(DIMAGE,酮(5)./ 25,'相同');量= 5;锐化= DIMAGE +量*梯度。

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

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

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

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

定义参数。曼德尔布罗算法遍历的实部和虚部的网格。下面的代码定义的迭代中,网格尺寸和网格限值的数量。

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);谁是Xÿ
名称大小字节类属性X 1x1000的4 gpuArrayŸ1x1000的4 gpuArray

许多MATLAB功能支持gpuArrays。万博1manbetx当您提供一个gpuArray参数到任何支持GPU功能,该功能在GPU上自动运行。欲了解更多信息,请参阅在GPU上运行MATLAB功能。创建算法复杂的网格,并创建阵列计数出来的结果。要直接在GPU上创建这个数组,使用那些工作,并指定'gpuArray'

[XGRID,YGRID] = meshgrid(X,Y);Z0 =络合物(XGRID,YGRID);计数=酮(大小(Z0),'gpuArray');

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

Z = Z0;对于N = 0:maxIterations Z = Z * Z + Z 0;内部= ABS(Z)<= 2;计数=计数+内部;结束计数= LOG(计数);

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

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

与一个GPU稀疏矩阵工作

以下功能支持稀疏gpuArrays。万博1manbetx

ABS角度BICG BICGSTAB小区CGS classUnderlying连词ctranspose deg2rad诊断结束的expm1找到修复地板全GMRES gpuArray.speye IMAG isaUnderlying isdiag的isEmpty
ISEQUAL isequaln isfloat isinteger ISLOGICAL ISNUMERIC伊斯雷尔issparse istril istriu长度log1p LSQR减去mtimes为ndims nextpow2 NNZ非零范数numel nzmax PCG
加上QMR rad2deg真正realsqrt圆形标志尺寸稀疏spfun spones sprandsym开方和TFQMR倍(。*)跟踪转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)1
G = gpuArray(S);%G是稀疏gpuArrayGT =转置(克);%GT是一个稀疏gpuArrayf =完全(GT)%f是一个完整的gpuArray
0 0 1 0 0 0 0 0 0 1

稀疏gpuArrays不支持索引。万博1manbetx取而代之的是,使用来定位该阵列和其行和列索引的非零元素。然后,替换你想要的值,并建立一个新的稀疏gpuArray。

与一个GPU复数起作用

如果在GPU上运行的函数的输出可能是复杂的,你必须明确指定其输入参数一样复杂。这适用于gpuArray或通过在所谓的代码运行的功能arrayfun

例如,如果创建一个gpuArray可能有负面因素,使用G = gpuArray(络合物(P)),那么你就可以成功执行SQRT(G)

或者,在一个函数传递给arrayfun如果X是实数的向量,并且一些元件具有负值,SQRT(x)的产生一个错误;相反,你应该叫SQRT(复合物(X))

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

下表列出了可能返回的复杂数据,有超过其输出保持实际的输入范围内沿的功能。

功能 输入范围为真正的输出
ACOS(x)的 ABS(X)<= 1
ACOSH(x)的 X> = 1
acoth(x)的 ABS(X)> = 1
ACSC(x)的 ABS(X)> = 1
ASEC(x)的 ABS(X)> = 1
asech(x)的 0 <= X <= 1
ASIN(x)的 ABS(X)<= 1
ATANH(x)的 ABS(X)<= 1
日志(X) X> = 0
log1p(x)的 X> = -1
日志10(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上运行。例如,在GPU下面的代码运行,因为数据,第一输入,是在GPU上:

>>总和(gpuArray(魔(10)),2);
但是,此代码不能在GPU上运行,因为数据,第一个输入,是不是在GPU上:
>>总和(魔(10),gpuArray(2));
如果你的输入参数gpuArrays包含CPU上的项目,如尺寸,缩放因子,或迭代次数,那么功能可采集他们并计算。功能只在当实际数据参数是gpuArrays在GPU上运行。

致谢

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

也可以看看

|

相关的例子

更多关于