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功能。
如果一个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 |
深度学习工具箱™ | *(另见使用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支持是自动的。万博1manbetx您不需要将数据转换为gpuArray。下面是一个非详尽的函数列表,默认情况下,如果GPU可用,这些函数将在GPU上运行。
有关“深度学习工具箱”中自动GPU支持的详细信息,请参阅万博1manbetxgpu大数据并行深度学习(深度学习工具箱)。
用于使用定义为的网络的高级网络和工作流dlnetwork
对象或模型功能,您的数据转换为gpuArray。采用支持gpuArray的函数万博1manbetx在GPU上运行自定义训练循环或预测。
如果你有一个GPU,那么MATLAB会自动使用它进行GPU计算。您可以使用gpuDevice
函数。如果您有多个gpu,那么您可以使用gpuDevice
选择其中一个,或者使用多个带有并行池的gpu。例如,参见识别并选择GPU和在并行池中使用多个GPU。要检查您的GPU支持,请参阅万博1manbetxGPU支万博1manbetx持方式发布。
为了深入学习,MATLAB为多个GPU提供自动并行支持。见万博1manbetx深度学习与MATLAB在多GPU(深度学习工具箱)。
这个例子展示了如何使用启用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上的答案对于真实的分析结果都是同样有效的浮点近似,在计算过程中经历了不同的舍入。在本例中,结果是整数和轮
消除了舍入误差。
这个例子说明了如何使用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的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]);轴从
以下函数支持稀疏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上运行的函数的输出可能很复杂,则必须显式地将其输入参数指定为复杂。这适用于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 |
启用GPU-功能的GPU只有当数据在GPU上运行。例如,在GPU下面的代码运行,因为数据,第一输入,是在GPU上:
>>和(gpuArray(magic(10)),2);
>>总和(魔(10),gpuArray(2));
岩浆是采取GPU加速的优势,线性代数例程库。Parallel Computing Toolbox中的杠杆作用MAGMA为gpuArrays实现线性代数函数来实现高性能和准确性。