MATLAB parfor работает медленнее, чем for — что не так?
-
02-10-2019 - |
Вопрос
код, с которым я имею дело, имеет такие циклы:
bistar = zeros(numdims,numcases);
parfor hh=1:nt
bistar = bistar + A(:,:,hh)*data(:,:,hh+1)' ;
end
для малых nt (10).
После времени это на самом деле в 100 раз медленнее чем использование обычного цикла!!!Я знаю, что parfor может выполнять параллельные суммы, поэтому я не уверен, почему это не работает.
я бегу
matlabpool
с готовыми конфигурациями перед запуском моего кода.
Я относительно новичок в Matlab и только начал использовать параллельные функции, поэтому не думайте, что я не делаю чего-то глупого.
Спасибо!
ПС:Я запускаю код на четырехъядерном процессоре, поэтому ожидаю увидеть некоторые улучшения.
Решение
Создание разбиения и группировки результатов (накладные расходы в разделите работу и результаты сбора из нескольких потоков / ядер) высоки для небольших значений nt
. Отказ Это нормально, вы не разбиваете данные для легких задач, которые могут быть выполнены быстро в простом цикле.
Всегда выполняйте что-то сложное в петле, который стоит распределения накладных расходов. Вот приятный Введение в параллельное программирование.
Темы поступают из пула резьбы, поэтому накладные расходы на создание нитей не должны быть там. Но для того, чтобы создать частичные результаты n
Матрицы от bistar
Размер должен быть создан, все частичные результаты вычислены, а затем все эти частичные результаты должны быть добавлены (рекомбинация). В прямой петли это с высокой вероятностью, выполненной на месте, никакие ассигнования не имеют место.
Полное утверждение в справке (спасибо за вашу ссылку настоящего):
Если время для вычисления f, g и h большой, Parorfor будет значительно быстрее, чем соответствующий для выписки, даже если n относительно невелик.
Итак, вы видите, что они имеют в виду точно так же, как то, что я имею в виду, накладные расходы на небольшие N ценностей стоит только усилия, если то, что вы делаете в цикле, является сложным / достаточно трудоемким.
Другие советы
Parfor
идет с небольшими накладными расходами.Таким образом, если nt
действительно мал, и если вычисления в цикле выполняются очень быстро (как сложение), то parfor
решение медленнее.Более того, если вы запустите parfor
на четырехъядернике прирост скорости будет близок к линейному для 1-3 ядер, но меньше, если использовать 4 ядра, так как последнему ядру тоже нужно запускать системные процессы.
Например, если parfor имеет накладные расходы в 100 мс, а вычисления в цикле занимают 5 мс, и если мы предположим, что прирост скорости линейный до 4 ядер с коэффициентом 1 (т.использование 4 ядер ускоряет вычисления в 4 раза), nt
должно быть около 30, чтобы вы могли добиться прироста скорости с parfor
(150 мс с for
, 132 мс с parfor
).Если бы вы выполнили только 10 итераций, parfor
будет медленнее (50 мс с for
, 112 мс с parfor
).
Вы можете рассчитать накладные расходы на своей машине, сравнив время выполнения с 1 рабочим и 0 рабочих, и вы можете оценить прирост скорости, настроив лайнер, соответствующий времени выполнения с 1–4 рабочими.Тогда вы поймете, когда полезно использовать parfor
.
Помимо плохих производительности из-за общения накладных расходов (см. Другие ответы), есть еще одна причина не использовать parfor
в этом случае. Все, что сделано в parfor
В этом случае использует Встроенный многопотативный. Отказ Предполагая, что все работники работают на одном и том же ПК, нет никаких преимуществ, потому что один вызов уже использует все сердечки вашего процессора.