提高性能的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
结束