此示例显示了如何arrayfun
可用于在GPU上本地运行MATLAB®功能。当MATLAB函数包含许多元素明智的操作时,arrayfun
与直接在GPU上使用gpuArray输入数据执行MATLAB函数相比,可以提供更好的性能。MATLAB函数可以在自己的文件中,也可以是嵌套的或匿名的函数。它必须只包含标量运算和算术运算。
我们把这个例子放到一个函数中来允许嵌套函数:
功能paralleldemo_gpu_arrayfun
霍纳规则允许对幂级数展开进行有效计算。我们将用它来计算指数函数的幂级数展开的前10项经验值
.我们可以用MATLAB函数来实现它。
功能y =霍纳(x)%霍纳-使用霍纳规则的exp(x)级数展开Y = 1 + x.*(1 + x.*(1 + x.*(1 + x.*)...x *((1 + x.*(1 + x.*(1 + x.*(1 + x.*))...x。* ((1 + x / 9)。/ 8))。/ 7))。/ 6))/ 5))/ 4))/ 3))/ 2));结束
霍纳
GPU的为了在GPU上运行这个函数,我们可以通过一个gpuArray
对象作为输入霍纳
函数。自霍纳
只包含单独的元素操作,当我们一次执行每个操作时,我们可能无法在GPU上实现很好的性能。方法中的所有元素操作都可以提高性能霍纳
使用一次功能arrayfun
.
使用图形处理器运行此功能arrayfun
,我们用一个手柄霍纳
函数。霍纳
自动适应不同大小和类型的输入。我们可以比较使用这两种图形处理器的计算结果gpuArray
对象和arrayfun
使用标准Matlab CPU仅通过直接评估函数来执行。
hornerFcn = @horner;
我们创建一些不同类型和大小的输入,并使用gpuArray
把它们送到GPU
Data1 = rand(2000,“单一”);Data2 = rand(1000,“双”);gdata1 = gpuarray(data1);gdata2 = gpuarray(data2);
霍纳
在GPU上评估霍纳
函数,我们有两个选择。通过最小的代码更改,我们可以在GPU上评估原始函数gpuArray
对象作为输入。但是,为了提高GPU调用的性能arrayfun
,使用与原始MATLAB函数相同的调用约定。
我们可以通过在CPU上的MATLAB中直接评估原始功能来比较结果的准确性。我们预期一些轻微的数值差异,因为GPU上的浮点算术没有精确地匹配CPU上执行的算术。
gresult1 = arrayfun(hornerFcn, gdata1);gresult2 = arrayfun(hornerFcn, gdata2);Comparesingle = max(max(abs(gresult1 - horner(data1))));Comparedouble = max(max(abs(gresult2 - horner(data2))));
流('单精度最大偏差:%g\n', comparesingle);流(双精度最大误差:%g\n',相比之下);
单精度最大偏差:2.38419e-07双精度最大偏差
我们可以将GPU版本的性能与本机Matlab CPU版本进行比较。目前的GPU在单精度下具有更好的性能,因此我们比较。
%CPU执行tic hornerFcn(data1);tcpu = toc;% GPU执行仅使用gpuArray对象tgpuobject = gputerimit(@()hornerfcn(gdata1));使用带有Arrayfun的GPuArray对象的%GPU执行tgpuArrayfun = gputimeit(@() arrayfun(hornerFcn, gdata1));流('只使用gpuArray对象实现加速:%g\n',...tcpu / tgpuobject);流(“使用带有Arrayfun的GPuarray对象实现加速:%g \ n',...tcpu / tgpuArrayfun);
仅使用gpuArray对象实现的加速:24.6764使用arrayfun: 98.3555
结束