matlab GPU计算

问题描述 投票:1回答:1

我正在学习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。

任何建议和建议都非常感谢。

matlab gpu gpu-programming
1个回答
0
投票

sum的问题不在于GPU,而是在GPU上使用arrayfun。这里给出了GPU接受的arrayfun函数列表:https://www.mathworks.com/help/distcomp/run-element-wise-matlab-code-on-a-gpu.htmlsum不在该文档页面的列表中。

你的向量不是那么大(虽然我接受这可能是你真正问题的一个玩具例子)。我建议以下替代实现:

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程序给出了相同的结果。

© www.soinside.com 2019 - 2024. All rights reserved.