2013-06-27 3 views
1

Как и для this question, я пытаюсь разделить матрицу между потоками cellfun, работающими на графическом процессоре.Могу ли я поделиться памятью между потоками cellfun на GPU?

Поскольку выполнение GPU не поддерживает глобальные переменные, я думал, что могу определить массив объектов класса handle с ссылкой на общую матрицу, поэтому дескриптор будет передан каждому экземпляру cellfun.

classdef VarByRefContainer < handle 
    properties 
     val = []; 
    end 
end 

handle = VarByRefContainer; 
handle.val = SharedMatrix; 
cellfun(@myfun, {handle, handle, handle}); 

Matlab, кажется, принять это, но там остаются несколько вопросов:

  1. Является ли это безопасно? То есть если я параллельно присваиваю значение элементам [1,3,5] и [2,4], существует ли вероятность того, что назначения будут сталкиваться?
  2. Является ли это эффективным? То есть класс обработчика может быть сохранен на хосте, и ссылка на память на графическом процессоре может занять много времени. Я бы хотел этого избежать.

ответ

1

я выложу один и тот же ответ здесь, как на другой вопрос - вы можете обмениваться данными с использованием вверх уровня переменных и вложенные функции:

function result = gpueg() 

largeArray = gpuArray.rand(5000); 

smallArray = magic(5); 

    function out = myNestedFcn(in) 
    element = ceil(in * 25); 
    out = smallArray(element); 
    end 

result = arrayfun(@myNestedFcn, largeArray); 

end 
+0

звук хороший! Это было бы безопасно и эффективно? –

+0

Это безопасно, потому что вы не можете изменять переменные верхнего уровня. В целом сложно сказать, эффективна ли она - зависит от того, сколько данных вы получаете таким образом. – Edric

+0

Дело в том, что мне нужно изменить переменную верхнего уровня ... Я просто попробовал это в Matlab и, похоже, это работает - это не мешает мне изменять переменную верхнего уровня. Протестировано на CPU, еще не на GPU. –