【问题标题】:matlab arrayfun on gpu with class methods带有类方法的gpu上的matlab arrayfun
【发布时间】:2019-10-17 09:17:47
【问题描述】:

考虑下面这个简单的类

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

现在开始运行

&gt;&gt;a=A(1);

&gt;&gt;a.foo();

&gt;&gt;a.foo2();

错误使用 gpuArray/arrayfun 作为第一个输入参数传递的函数包含 不支持的“MCOS”语言功能“CLASSDEF”。了解更多信息 请参阅提示和限制。

A/foo2 中的错误(第 20 行) arrayfun(@obj.bar,Array);

注意foo()foo2() 是同一个函数,唯一的例外是foo2() 应该运行arrayfun 的GPU 版本。

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

【问题讨论】:

    标签: matlab oop gpu matlab-gpu


    【解决方案1】:

    您不能在 GPU 上运行的代码中使用 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 可以将对象属性的任何新值作为输出返回,那么您的函数 foo2 将写入这些属性。

    【讨论】:

    • @MichaelMedvinsky:但是没有classdef参与那个电话!你清除了你之前对类的定义吗? (clear classes)。
    猜你喜欢
    • 2020-02-23
    • 2017-07-15
    • 1970-01-01
    • 2012-11-16
    • 1970-01-01
    • 2012-10-25
    • 1970-01-01
    • 1970-01-01
    • 2012-06-09
    相关资源
    最近更新 更多