0

考虑以下简单类

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()是,应该运行 GPU 版本的arrayfun.

是否有任何解决方法或技巧可以使foo2()上述工作,即在 GPU 上运行的类方法?考虑bar()不能​​是静态的,或者它应该使用类属性。

4

1 回答 1

0

您不能classdef在 GPU 上运行的代码中使用对象。您将必须创建一个函数,该函数将它使用的每个类属性作为输入参数。像这样的东西应该可以工作(未经测试!):

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可以将对象属性的任何新值作为输出返回,那么您的函数foo2会将其写入这些属性。

于 2019-06-03T20:46:18.740 回答