考虑以下简单类
classdef A < handle
properties
M;
end
methods
function obj= A(m)
obj.M=m;
end
function foo(obj)
Array = linspace(0,obj.M,100);
arrayfun(@obj.bar,Array);
end
function foo2(obj)
Array = gpuArray.linspace(0,obj.M,100);
arrayfun(@obj.bar,Array);
end
function y = bar(obj,x)
y = x^2/obj.M;
end
end
end
现在运行
>>
a = A(1);
>>
a.foo();
>>
a.foo2();使用gpuArray / arrayfun的错误作为第一个输入参数包含的函数传递 不支持的“ MCOS”语言功能“ CLASSDEF”。了解更多信息 请参阅提示和限制。
A / foo2中的错误(第20行) arrayfun(@ obj.bar,Array);
请注意,foo()
和foo2()
是同一功能,唯一的例外是,foo2()
应该运行arrayfun
的GPU版本。
是否有任何变通方法或技巧可以使foo2()
在GPU上正常工作?考虑bar()
不能是静态的,或者应该使用类属性。
答案 0 :(得分:0)
您不能在GPU上运行的代码中使用data
对象。您将必须创建一个函数,该函数采用它用作输入参数的每个类属性。像这样的应该可以工作(未经测试!):
classdef
如果函数classdef A < handle
properties
M;
end
methods
function obj = A(m)
obj.M = m;
end
function foo2(obj)
Array = gpuArray.linspace(0,obj.M,100);
arrayfun(@(x)bar(obj.M,x),Array);
end
end
end
function y = bar(M,x)
y = x^2/M;
end
可以返回对象属性的任何新值作为输出,而函数bar
会将这些值写入这些属性。