主要内容

使用ARRAYFUN提高MATLAB函数在GPU上的元素性能

此示例显示了如何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与CPU性能比较

我们可以将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
结束