【问题标题】:matlab GPU computationmatlab GPU计算
【发布时间】:2019-08-06 00:13:51
【问题描述】:

我正在学习 matlab GPU 函数。我的函数myfun 有两个输入参数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。

非常感谢任何意见和建议。

【问题讨论】:

  • sum(A) 和 sum(A>10) 在底层实现不同。第二个,插入一个控制流 if,这对于 GPU 来说很重要。 GPU 很难编码,只有某些功能可以从它们的架构中受益,所以当 Matlab 说它支持 GPU 数组的 sum 时,我猜它支持 sum(A)、sum(A(10:30)) 和类似的东西,其中输入是一个实际的数组。

标签: matlab gpu


【解决方案1】:

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

【讨论】:

    猜你喜欢
    • 2014-09-12
    • 1970-01-01
    • 2014-10-10
    • 2015-08-21
    • 2018-08-19
    • 2011-11-23
    • 2012-03-22
    • 1970-01-01
    • 2015-04-14
    相关资源
    最近更新 更多