Этот пример показывает, как решить смущающе параллельную проблему с неравномерным распределением работы с помощью for drange
. for drange
разделяет итерации одинаково. В результате это может сделать субоптимальное выравнивание нагрузки, которое является видимым использованием параллельного профилировщика. Процедуры, описанные здесь, также применимы к другим проблемам распределения работы.
Предпосылки:
Интерактивный Параллельный Режим в Parallel Computing Toolbox™ (См. pmode
в руководстве пользователя.)
Графики в этом примере производятся из кластера MATLAB® с 12 узлами. Если не в противном случае заданный, все остальное показывают, работая на локальном кластере с 4 узлами. В частности, весь вывод текста от локального кластера.
Этот пример использует for drange
, чтобы проиллюстрировать, как вы используете профилировщик, чтобы наблюдать субоптимальное распределение нагрузки. Давайте посмотрим на этот смущающе параллельный цикл for drange
.
Цель в примере pctdemo_aux_proftaskpar
состоит в том, чтобы вычислить eig
случайной матрицы увеличивающегося размера и выбрать максимальное значение от итогового вектора. Важнейшей проблемой является увеличивающийся матричный размер на основе счетчика цикла ii
. Вот основная итерация:
v(ii) = max( abs( eig( rand(ii) ) ) )
;
Фактический цикл for
виден в примере кода.
Код для этого примера может быть найден в pctdemo_aux_proftaskpar.
Хорошая практика должна сбросить параллельный профилировщик на кластере перед включением mpiprofile в pmode
. Это убеждается, что данные очищены, и профилировщик выключен и в значении по умолчанию-messagedetail установка.
P>> mpiprofile reset; P>> mpiprofile on;
В for drange
не может быть никакой связи между лабораториями, таким образом, -messagedetail
может быть установлен в упрощенный (см., помогают mpiprofile
). Если вы не задаете опцию -messagedetail
, и вы запускаете программу без коммуникации, вы получаете 0s в коммуникационных полях.
P>> v = zeros( 1, 300, codistributor() );
P>> tic;pctdemo_aux_proftaskpar('drange');toc;
1 Start of for-drange loop. The computational complexity increases with the loop index. Done Elapsed time is 0.287845 seconds.
2 Start of for-drange loop. The computational complexity increases with the loop index. Done Elapsed time is 0.351070 seconds.
3 Start of for-drange loop. The computational complexity increases with the loop index. Done Elapsed time is 0.335363 seconds.
4 Start of for-drange loop. The computational complexity increases with the loop index. Done Elapsed time is 0.412805 seconds.
5 Start of for-drange loop. The computational complexity increases with the loop index. Done Elapsed time is 0.482021 seconds.
6 Start of for-drange loop. The computational complexity increases with the loop index. Done Elapsed time is 0.683651 seconds.
7 Start of for-drange loop. The computational complexity increases with the loop index. Done Elapsed time is 0.838188 seconds.
8 Start of for-drange loop. The computational complexity increases with the loop index. Done Elapsed time is 1.005636 seconds.
9 Start of for-drange loop. The computational complexity increases with the loop index. Done Elapsed time is 1.128090 seconds.
10 Start of for-drange loop. The computational complexity increases with the loop index. Done Elapsed time is 1.398578 seconds.
11 Start of for-drange loop. The computational complexity increases with the loop index. Done Elapsed time is 1.589610 seconds.
12 Start of for-drange loop. The computational complexity increases with the loop index. Done Elapsed time is 1.825993 seconds.
В этом алгоритме прошедшее время должно всегда быть самым долгим на последней лаборатории. Мы используем tic toc
здесь так, чтобы мы могли сравнить самое долгое время выполнения с parfor
. Использование профилирования в цикле parfor
с mpiprofile
в настоящее время не поддержано.
Чтобы получить интерфейс профилировщика, просто введите mpiprofile viewer
в pmode
. Можно также просмотреть данные из параллельного задания. Смотрите справку или документацию для получения информации о том, как сделать это.
P>> mpiprofile viewer; % The viewer action also turns off the profiler
1 Sending pmode lab2client to the MATLAB client for asynchronous evaluation.
Когда интерфейс профилировщика открывается, по умолчанию Функциональный Сводный отчет показывают для лаборатории 1. Нажмите Compare макс. по сравнению с min TotalTime, чтобы видеть различие в распределении работы между первой и последней лабораторией для всех вызванных функций. Посмотрите на функцию pctdemo_aux_proftaskpar
:
Вот несколько шагов для определения неравномерного распределения работы на работниках MATLAB. Неравномерное распределение работы почти наверняка предотвращает оптимальное ускорение последовательных алгоритмов.
Выберите max Time Aggregate
из поля списка Manual Comparison Selection (см. Используя Параллельный Профилировщик в Pmode). С этим выбором можно наблюдать эффективное общее время для параллельной программы.
Нажмите Compare макс. по сравнению с min TotalTime. Как вы видите, этот цикл берет намного дольше на последнем работнике MATLAB по сравнению с первым. for drange
ясно не распределяет работу правильно, по крайней мере, на этих двух лабораториях. Чтобы подтвердить это верно для всех лабораторий, можно использовать функцию гистограммы страницы Plot View. Прежде, чем сделать так, кликните по функции pctdemo_aux_proftaskpar
, чтобы получить более определенные графики.
Нажмите Plot Time Histograms, чтобы видеть, как время вычисления было распределено на четырех локальных лабораториях. Наблюдайте общую гистограмму времени выполнения.
В главной фигуре этой страницы только первые несколько лабораторий занимают приблизительно то же количество времени; другие берут значительно дольше. Этими значительными различиями в общем распределении во времени является индикатор субоптимального выравнивания нагрузки.
Оптимальная производительность для этого типа параллелизма требует ручного распределения итераций в pmode
или использовании parfor
с parpool
. Чтобы поправиться работают распределение (с pmode) в этом типе проблемы, необходимо создать случайное распределение задач, а не полагаться на for drange
, чтобы статически разделить итерации.
Используя parfor
обычно лучше подходит для этого типа задачи. С построением parfor (i=n:N)
вы получаете динамическое распределение работы, которое разделяет итерации во время выполнения через все лаборатории. Таким образом кластер лучше используется. Вы видите это путем выполнения той же функции за пределами pmode использование построения parfor
. Это приводит к значительно более высокому ускорению по сравнению с for drange
.
Чтобы попробовать это parfor, запустите следующие команды на клиенте MATLAB за пределами pmode
.
pmode close;
parpool;
tic;pctdemo_aux_proftaskpar('parfor');toc;
Необходимо получить вывод, который похож: Сделанное Прошедшее время составляет 6,376887 секунд.
Существует значительное ускорение (это почти в два раза быстрее на кластере с 4 узлами), использование parfor
вместо for drange
, без изменения в фактическом алгоритме. Обратите внимание на то, что parfor
действует в качестве стандартного цикла for
в pmode
. Гарантируйте, что вы пробуете parfor за пределами pmode, чтобы получить ускорение. Смотрите справку для parpool
и parfor
.
Чтобы сделать сериал (итерация независимый) for
- цикл параллелен вам, должна добавить опция drange
, когда в параллельном задании, или заменяют for
на parfor
. Цикл parfor
будет только работать, как предназначено с parpool
. Можно просмотреть различные стили параллелизма цикла for в коде, показанном в этом примере. См. pctdemo_aux_proftaskpar. Версия parfor
находится под случаем, 'parfor'
и версия drange
находятся под случаем 'drange'
.