使用类方法在gpu上使用matlab arrayfun

时间:2019-05-31 18:05:55

标签: matlab oop gpu

考虑以下简单类

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()不能是静态的,或者应该使用类属性。

1 个答案:

答案 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会将这些值写入这些属性。