Профилирование параллельного распределения работы

Этот пример показывает, как решить смущающе параллельную проблему с неравномерным распределением работы с помощью for drange. for drange разделяет итерации одинаково. В результате это может сделать субоптимальное выравнивание нагрузки, которое является видимым использованием параллельного профилировщика. Процедуры, описанные здесь, также применимы к другим проблемам распределения работы.

Предпосылки:

Графики в этом примере производятся из кластера 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. Неравномерное распределение работы почти наверняка предотвращает оптимальное ускорение последовательных алгоритмов.

  1. Выберите max Time Aggregate из поля списка Manual Comparison Selection (см. Используя Параллельный Профилировщик в Pmode). С этим выбором можно наблюдать эффективное общее время для параллельной программы.

  2. Нажмите Compare макс. по сравнению с min TotalTime. Как вы видите, этот цикл берет намного дольше на последнем работнике MATLAB по сравнению с первым. for drange ясно не распределяет работу правильно, по крайней мере, на этих двух лабораториях. Чтобы подтвердить это верно для всех лабораторий, можно использовать функцию гистограммы страницы Plot View. Прежде, чем сделать так, кликните по функции pctdemo_aux_proftaskpar, чтобы получить более определенные графики.

  3. Нажмите Plot Time Histograms, чтобы видеть, как время вычисления было распределено на четырех локальных лабораториях. Наблюдайте общую гистограмму времени выполнения.

В главной фигуре этой страницы только первые несколько лабораторий занимают приблизительно то же количество времени; другие берут значительно дольше. Этими значительными различиями в общем распределении во времени является индикатор субоптимального выравнивания нагрузки.

Используя PARFOR для лучшего распределения работы

Оптимальная производительность для этого типа параллелизма требует ручного распределения итераций в 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

Чтобы сделать сериал (итерация независимый) for - цикл параллелен вам, должна добавить опция drange, когда в параллельном задании, или заменяют for на parfor. Цикл parfor будет только работать, как предназначено с parpool. Можно просмотреть различные стили параллелизма цикла for в коде, показанном в этом примере. См. pctdemo_aux_proftaskpar. Версия parfor находится под случаем, 'parfor' и версия drange находятся под случаем 'drange'.