Почему parfor-loop тратит больше времени, чем for-loop?

function test_parfor
N = 1e8;
sum_all = 0; % sum all numbers
sum_odd = 0; % sum odd numbers
sum_even = 0; % sum even numbers
tic;
parfor i = 1 : N
  sum_all = sum_all + i; % sum all numbers
  if mod(i,2)
      sum_odd = sum_odd + i; % sum odd numbers
  else
      sum_even = sum_even + i; % sum even numbers
  end %endif
end %endfor
toc;
fprintf('sum_all=%d,\nsum_odd=%d,\nsum_even=%d.\n', ...
    sum_all, sum_odd, sum_even);

Я инициализировал окружение и запускаю коды выше. Однако цикл parfor занял гораздо больше времени, чем один цикл for. Более того, numCores на моем ПК - 12, и я инициализировал 12 рабочих перед выполнением кода функции. Зачем? Что не так с моими кодами?

Большое спасибо!:-)

Кроме того, код инициализации для параллельной вычислительной среды выглядит следующим образом.

function initpar(CoreNum)
%Initialize Matlab Parallel Computing Enviornment

if nargin==0
    CoreNum=feature('numCores');
end
if  isempty(gcp('nocreate'))
    clear ALL;
    parpool('local',CoreNum); % matlabpool in R2013
else
    disp('Parallel Computing Enviornment already initialized');
end

1 ответ

Решение

Смотрите эту страницу:

Параллельные накладные расходы. В вызове parfor есть издержки, а не for. Если оценки функций выполняются быстро, эти издержки могут стать заметными. В частности, решение проблемы параллельно может быть медленнее, чем решение проблемы последовательно.

Совет не использовать parfor, когда каждая итерация не занимает много времени; предел стоимости обработки, конечно, зависит от вашего оборудования.

РЕДАКТИРОВАТЬ: если вы удалите блок if-else, поведение цикла изменится. sum_all теперь определяется как редукционная переменная, как объясняется на этой странице. Цикл затем корректно разбивается на независимые части; частичные результаты объединяются в конце. С блоком if-else, sum_even а также sum_odd не рассматриваются как редукционные переменные (я думаю), поэтому он будет вести себя как классический цикл for плюс издержки параллельных вычислений.

Другие вопросы по тегам