2010-07-04 5 views
17

кода, который я имею дело с зацикливающимся, как следующее:MATLAB parfor медленнее, чем для - что не так?

bistar = zeros(numdims,numcases); 
parfor hh=1:nt  
    bistar = bistar + A(:,:,hh)*data(:,:,hh+1)' ; 
end 

для малого нта (10).

После определения времени, это фактически 100 раз медленнее, чем при использовании обычной петли !!! Я знаю, что parfor может делать параллельные суммы, поэтому я не уверен, почему это не работает.

Я бегу

matlabpool 

с неработающей коробки конфигурации перед запуском моего кода.

Я относительно новичок в Matlab и начал использовать параллельные функции, поэтому, пожалуйста, не предполагайте, что я не делаю что-то глупое.

Спасибо!

PS: Я запускаю код на четырехъядерном ядре, поэтому ожидаю увидеть некоторые улучшения.

+0

Не могли бы вы рассказать нам о значениях numdims, numcases и фактических временных данных, которые вы нашли? Благодарю. – rwong

ответ

23

Выполнение разбиения на разделы и группировка результатов (накладные расходы при разделении результатов работы и сбора нескольких нитей/сердечников) высока при малых значениях nt. Это нормально, вы не будете разбивать данные на простые задачи, которые можно быстро выполнить в простой петле.

Всегда выполняйте что-то сложное внутри цикла, которое стоит накладных расходов. Вот хороший introduction to parallel programming.

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

Полная инструкция в помощи (спасибо за вашу ссылку по настоящему Договору) составляет:

Если времени для вычисления F, G и Н большого, parfor будет значительно быстрее соответствующий для заявление, даже если n относительно маленький.

Таким образом, вы видите, что они означают то же самое, что и я, накладные расходы при малых значениях n стоят всего лишь усилий, если то, что вы делаете в цикле, достаточно сложно/занимает много времени.

+0

Спасибо за ответ, однако в http://www.mathworks.com/access/helpdesk/help/toolbox/distcomp/parfor.html говорится, что «parfor будет значительно быстрее, чем соответствующий для оператора, даже если n относительно маленький." (Ofcourse idk, что относительно малые средства.) Я в замешательстве, но что вы имеете в виду под накладными расходами при делении работы и сборе результатов от нескольких потоков/ядер? Вары A и данные являются глобальными и должны использоваться совместно для всех потоков. Все, что должен сделать Matlab, - это прибавление к бистару. – Junier

+0

Я добавил точность, спасибо за ссылку, которую я посмотрел на помощь, и она заявляет то же самое, что и я пытаюсь прояснить. Я не очень хорошо объясняю :-) «Если» часть предложения весьма важна. Надеюсь, поможет! Это справедливо не только для Matlab, но и для всех видов параллельных вычислений. Важное значение имеет разделение проблемы. – jdehaan

+4

+1 для указания необходимости чтения всей справки, а не только той части, которая, кажется, говорит, что вы хотите. – Donnie

13

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.

3

Помимо плохой производительности из-за служебных данных связи (см. Другие ответы), в этом случае есть еще одна причина не использовать parfor. Все, что сделано в parfor, в этом случае использует built-in multithreading. Предполагая, что все рабочие работают на одном ПК, нет никакого преимущества, поскольку один звонок уже использует все ядра вашего процессора.

Смежные вопросы