我正在学习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。
任何建议和建议都非常感谢。
sum
的问题不在于GPU,而是在GPU上使用arrayfun
。这里给出了GPU接受的arrayfun
函数列表:https://www.mathworks.com/help/distcomp/run-element-wise-matlab-code-on-a-gpu.html。 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程序给出了相同的结果。