文档

提高性能的Element-wise MATLAB®函数使用ARRAYFUN在GPU上

这个例子显示了如何arrayfun可用于在GPU上运行一个MATLAB®函数本身。当MATLAB函数包含许多element-wise操作,arrayfun可以提供改进的性能相比,直接执行MATLAB函数在GPU gpuArray输入数据。MATLAB函数可以在它自己的文件中,或者可以是嵌套的或匿名函数。它必须只包含标量和算术操作。

我们把例子放进一个函数允许嵌套的函数:

函数paralleldemo_gpu_arrayfun

用霍纳氏法则来计算指数

霍纳氏规则允许幂级数扩张的有效评估。我们将用它来计算前10的指数函数的幂级数展开经验值。我们可以实现一个MATLAB函数。

函数y =霍纳(x)%霍纳——级数展开exp (x)用霍纳氏法则y = 1 + x。* (1 + x。* ((1 +x。* ((1 +x。* ((1 + x。* ((1 + x。* ((1 + x。* ((1 +x。* ((1 + x / 9)。/ 8))。/ 7)) / 6)) / 5)) / 4)) / 3)) / 2));结束

准备霍纳GPU的

在GPU上运行这个函数用最少的代码更改,我们可以通过gpuArray对象作为输入霍纳函数。自霍纳只包含单个element-wise操作,我们可能没有意识到良好的性能在GPU在执行每个操作一次。不过,我们可以提高性能通过执行所有element-wise操作的霍纳一次使用的函数arrayfun

在GPU上运行这个函数使用arrayfun中,我们使用一个句柄霍纳函数。霍纳自动适应不同大小和类型的输入。我们可以比较结果在GPU计算使用gpuArray对象和arrayfun与标准MATLAB CPU执行直接通过评估函数。

hornerFcn = @horner;

创建输入数据

我们创建一些不同类型和大小的输入,和使用gpuArray送他们到GPU。

data1 =兰德(2000“单一”);data2 =兰德(1000“双”);gdata1 = gpuArray (data1);gdata2 = gpuArray (data2);

评估霍纳在GPU

评估霍纳函数在GPU上,我们有两个选择。用最少的代码更改,我们可以评估在GPU通过提供一个原函数gpuArray对象作为输入。然而,提高性能的GPU的电话arrayfun使用相同的调用协定,与原始MATLAB函数。

我们可以比较通过评估结果的准确性直接在MATLAB在CPU上原来的函数。我们希望一些轻微的数值差异因为GPU上的浮点算术不精确匹配算法的CPU上执行。

gresult1 = arrayfun (hornerFcn gdata1);gresult2 = arrayfun (hornerFcn gdata2);comparesingle = max (max (abs (gresult1 -霍纳(data1))));comparedouble = max (max (abs (gresult2 -霍纳(data2))));
流(为单精度的最大差异:% g \ n ',comparesingle);流(双精度的最大差异:% g \ n ',comparedouble);
最大差异单精度:2.38419 e-07最大差异为双精度:0

GPU和CPU之间的性能比较

我们可以比较GPU的性能版本本机MATLAB CPU版本。当代gpu在单精度更好的性能,所以我们比较。

%的CPU执行抽搐hornerFcn (data1);tcpu = toc;只使用gpuArray % GPU执行对象tgpuObject = gputimeit (@ () hornerFcn (gdata1));%与arrayfun GPU执行使用gpuArray对象tgpuArrayfun = gputimeit (@ () arrayfun (hornerFcn gdata1));流(“加速实现仅使用gpuArray对象:% g \ n ',tcpu / tgpuObject);流(“加速通过使用与arrayfun gpuArray对象:% g \ n ',tcpu / tgpuArrayfun);
加速实现仅使用gpuArray对象:24.6764加速通过使用与arrayfun gpuArray对象:98.3555
结束
这个主题有帮助吗?