MATLAB parfor и классификация / использование переменных

У меня нет большого опыта с распараллеливанием в MATLAB (<2 недели самостоятельной работы), тем не менее, я получил работающий цикл parfor, похожий на этот:

N = 11;
var1 = zeros(N, 2);

parfor n=1:N
  a = zeros(3, 3);
  b = zeros(3, 3);

  [a, b] = myfun(<arguments>);

  var1(n, :) = [sum(sum(a,1),2) sum(sum(b,1),2);]

end

<portion of non parallelized code that makes use of var1 contents>

Если я до сих пор понимал документацию / примеры, 'var1' классифицируется как секционированная переменная, а 'a' и 'b' - как временные переменные. Я использую 'var1' таким образом, потому что мне нужно использовать его содержимое после выполнения цикла parfor.

Я также хотел использовать переменные 'a' и 'b' в качестве секционированных переменных, чтобы избежать повторной инициализации / ненужного перераспределения памяти (?)/ Увеличения параллельной производительности.

Я пытался что-то вроде этого для переменной "а":

N = 11;
var1 = zeros(N, 2);
**a = zeros(3, 3, N);**

parfor n=1:N
  b = zeros(3, 3);

  [**a(:,:,n)**, b] = myfun(<arguments>);

  var1(n, :) = [sum(sum(**a(:,:,n)** ,1),2) sum(sum(b,1),2);]

end

<another portion of non parallelized code that makes use of var1 contents>

с целью заставить работников использовать кусочки одного и того же региона в памяти, но я получаю ошибку "Переменная a в parfor не может быть классифицирована".

Итак... почему он не может быть классифицирован и использован как секционированная переменная, например, var1?

Спасибо.

1 ответ

То, что вы пытаетесь сделать, не очень хорошая идея. Разделенная переменная означает связь, потому что основной экземпляр отправляет ее работнику и получает оттуда. Это также означает двойное использование памяти, потому что основной экземпляр хранит переменную и (по частям) рабочие.

Ваша первая версия в порядке. Вы можете удалить строки a = zeros(3, 3);b = zeros(3, 3);,

Вот как это будет выглядеть с нарезанной переменной a

N = 11;
var1 = zeros(N, 2);
a = zeros(3, 3,N);
parfor n=1:N

  [a(:,:,n), b] = myfun(2);

  var1(n, :) = [sum(sum(a(:,:,n),1),2) sum(sum(b,1),2);]
end

Вот код, который я бы порекомендовал:

N = 11;
var1 = zeros(N, 2);
parfor n=1:N

  [a, b] = myfun(2);

  var1(n, :) = [sum(a(:)) sum(b(:))]
end
Другие вопросы по тегам