Matlab GPU计算

时间:2019-03-15 00:00:06

标签: matlab gpu gpu-programming

我正在学习matlab GPU函数。我的函数myfun具有2个输入参数delta, p。最终,我将myfun应用于delta,p的许多组合。对于delta,p的每个组合,“ myfun”将满足条件V,其中delta*V-p>0的数量V = [0:0.001:1]。理想情况下,我希望V成为global variable。但是似乎matlab GPU对全局变量有一些限制。所以我用另一种方式来做这件事。代码如下:

 function result = gpueg2()
          dd = 0.1;
          DELTA = [dd:dd:1];
          dp = 0.001;
          P = [0:dp:1];
          [p,delta]=meshgrid(P,DELTA);
          p = gpuArray(p(:));
          delta = gpuArray(delta(:));


           V = [0:0.001:1];

           function [O] = myfun(delta,p)
                     O = sum((delta*V-p)>0);
           end
           result = arrayfun(@myfun,delta,p);
 end

但是,它通过一条错误消息

Function passed as first input argument contains unsupported or unknown function 'sum'.

但是我相信sum适用于GPU。

任何意见和建议都受到高度赞赏。

1 个答案:

答案 0 :(得分:0)

sum的问题不在于GPU,而是与在GPU上使用arrayfun有关。 https://www.mathworks.com/help/distcomp/run-element-wise-matlab-code-on-a-gpu.html是GPU上arrayfun接受的功能列表。 sum不在该文档页面的列表中。

您的向量不是很大(尽管我接受这可能是您真正问题的一个玩具例子)。我建议以下替代实现:

function result = gpueg2()
dd = 0.1;
DELTA = dd:dd:1;
dp = 0.001;
P = 0:dp:1;
V = 0:0.001:1;
[p,delta,v] = meshgrid(P,DELTA,V);
p = gpuArray(p);
delta = gpuArray(delta);
v = gpuArray(v);
result = sum(delta.*v-p>0, 3);
end

请注意以下差异:

  1. 我制作p,delta,v的3D数组,而不是2D。这三个总共只有24MB。
  2. 我对整个3D阵列进行计算delta.*v-p>0:这将在GPU上很好地分解。
  3. 我对第三个索引求和,即超过V

我检查了您在CPU上的例程和在GPU上的例程是否给出了相同的结果。