matlab-GPU计算

matlab-GPU计算,matlab,gpu,Matlab,Gpu,我正在学习MatlabGPU函数。My functionmyfun采用2个输入参数delta,p。最后,我将把myfun应用于delta,p的许多组合。对于每个delta,p,“myfun”将显示满足条件delta*V-p>0,其中V=[0:0.001:1]的V。理想情况下,我希望V成为全局变量。但MatlabGPU似乎对全局变量有一些限制。所以我用另一种方法来做这件事。代码如下: function result = gpueg2() dd = 0.1;

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

 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的问题不在于GPU,而在于在GPU上使用
arrayfun
。此处给出了GPU上接受的
arrayfun
函数列表:<代码>总和不在该文档页的列表中

你的向量没有那么大(尽管我承认这可能是你真正问题的一个玩具例子)。我建议采取以下替代实施方式:

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
请注意以下差异:

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

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

    sum的问题不在于GPU,而在于在GPU上使用
    arrayfun
    。此处给出了GPU上接受的
    arrayfun
    函数列表:<代码>总和不在该文档页的列表中

    你的向量没有那么大(尽管我承认这可能是你真正问题的一个玩具例子)。我建议采取以下替代实施方式:

    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
    
    请注意以下差异:

  • 我制作了p、delta、v的3D数组,而不是2D数组。这三个总共只有24MB
  • 我在整个3D阵列上进行计算
    delta.*v-p>0
    :这将在GPU上很好地分割
  • 我在第三个索引上求和,即超过
    V
  • 我已经检查了您在CPU上的例程和我在GPU上的例程是否给出了相同的结果。

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