matlab arrayfun на gpu с методами класса - PullRequest
0 голосов
/ 31 мая 2019

Рассмотрим следующий простой класс

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() не может быть статическим или таким, как предполагается использовать свойства класса.

1 Ответ

0 голосов
/ 03 июня 2019

Вы не можете использовать 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 будет выполнятьнаписать в эти свойства.

...