Как и для 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,3,5] и [2,4], существует ли вероятность того, что назначения будут сталкиваться?
- Является ли это эффективным? То есть класс обработчика может быть сохранен на хосте, и ссылка на память на графическом процессоре может занять много времени. Я бы хотел этого избежать.
звук хороший! Это было бы безопасно и эффективно? –
Это безопасно, потому что вы не можете изменять переменные верхнего уровня. В целом сложно сказать, эффективна ли она - зависит от того, сколько данных вы получаете таким образом. – Edric
Дело в том, что мне нужно изменить переменную верхнего уровня ... Я просто попробовал это в Matlab и, похоже, это работает - это не мешает мне изменять переменную верхнего уровня. Протестировано на CPU, еще не на GPU. –