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