我正在学习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。
任何意见和建议都受到高度赞赏。
答案 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
请注意以下差异:
p,delta,v
的3D数组,而不是2D。这三个总共只有24MB。delta.*v-p>0
:这将在GPU上很好地分解。V
。我检查了您在CPU上的例程和在GPU上的例程是否给出了相同的结果。