Я бы предположил, что ваш внешний цикл должен быть parfor
, чтобы каждый работник имел относительно долгую работу, и вы тратите меньше времени на ожидание завершения работы других работников.
Имея это внутри, вы должны ждать, пока все работники будут заканчивать каждый раз через петлю.
for main = 1:N
doing_smth = zeros(N1,1);
parfor pal = 1:2N
%// This task may not be very long-running
doing_smth(pal) = whatever;
end
%// Have to wait for all runners to complete before we can continue
%// Obviously we have to do this waiting N times (each time through the loop)
act(main)= doing_smth/2
end
Если переместить ее к внешней петле, то задание будет отправлено на рабочий будет выполняться дольше (более эффективным за счет снижения трафика назад и вперед с работником), и вы не ждали все работники заканчивают в течение петли.
parfor main = 1:N
doing_smth = zeros(N1, 1);
for pal = 1:2N
doing_smth(pal) = whatever;
end
%// No waiting anymore!
act(main) = doing_smth/2;
end
%// Now wait here for all workers to finish
Update
На основе обновления вы предоставили в свой код, я на самом деле думаю, что было бы лучше иметь parfor
на внутреннем цикле, предполагая, что этот расчет внутри этого цикла происходит достаточно длинный. Это позволит лучше использовать рабочих, потому что, если у вас есть внешний цикл, это parfor
, так как у вас всего 4 рабочих и 5 итераций внешней петли, тогда это займет 2x больше, чем если бы у вас было 5 рабочих, потому что 4 рабочих закончили 4 из итераций, а затем 3 работника будут сидеть без дела, а 1 рабочий завершает пятую итерацию. Используя внутреннюю часть parfor
, вы будете полностью использовать всех работников. Вы do хотите быть уверены, что внутри этого внутреннего цикла требуется достаточное количество времени, чтобы уменьшить накладные расходы на связь. В противном случае вы захотите вручную вырезать свои данные в блоки и обработать их в пределах parfor
.
Как долго «что угодно»? – Suever
Я изо всех сил пытаюсь понять ваш пример кода. 'act (main)' является скаляром, а 'make_smth/2' является вектором. – Daniel
@Suever требуется очень много времени, часов, недель .. в зависимости от количества итераций – HappyBee