В этом примере показано, как решить смущающе параллельную задачу с неравномерным распределением работы с помощью 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'
.