Вопрос

код, с которым я имею дело, имеет такие циклы:

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 В этом случае использует Встроенный многопотативный. Отказ Предполагая, что все работники работают на одном и том же ПК, нет никаких преимуществ, потому что один вызов уже использует все сердечки вашего процессора.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top