Профилирование загрузки несбалансированные массивы Codistributed

Этот пример показывает, как профилировать неявную коммуникацию, которая происходит при использовании неравномерно распределенного массива.

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

Этот пример показывает, как использовать параллельный профилировщик в случае неравномерно распределенного массива. Самый легкий способ создать codistributed массив состоит в том, чтобы передать codistributor в качестве аргумента, такой как в rand(N, codistributor). Это равномерно распределяет вашу матрицу размера N между вашими рабочими MATLAB®. Чтобы получить несбалансированное распределение данных, можно получить некоторое количество столбцов codistributed массива как функция labindex.

Графики в этом примере производятся из кластера MATLAB с 12 узлами. Все остальное показывают, работая на локальном кластере с четырьмя узлами.

Алгоритм

Алгоритм, который мы выбрали для этого codistributed массива, относительно прост. Мы генерируем большую матрицу, таким образом, что каждая лаборатория добирается приблизительно 512 512 субматрица, за исключением первой лаборатории. Первая лаборатория получает только один столбец матрицы, и другие столбцы присвоены последней лаборатории. Таким образом, на кластере с четырьмя лабораториями, лаборатория 1 сохраняет только 1 512 столбец, лаборатории 2 и 3 имеют свои выделенные разделы, и лаборатория 4 имеет свой выделенный раздел плюс дополнительные столбцы (перенесенный из лаборатории 1). Конечный результат является несбалансированной рабочей нагрузкой при выполнении нулевой коммуникации поэлементные операции (такие как sin) и коммуникационные задержки с операциями параллели данных (такими как codistributed/mtimes). Мы запускаем с операции параллели данных, первой (codistributed/mtimes). Мы затем выполняем, в цикле, sqrt, sin и операциях скалярного произведения, все из которых только работают с отдельными элементами матрицы.

Код файла MATLAB для этого примера может быть найден в: pctdemo_aux_profdistarray

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

P>> labBarrier; % synchronize all the labs
P>> mpiprofile reset;
P>> mpiprofile on;
P>> pctdemo_aux_profdistarray();
1    This lab has 1773 rows and 1 columns of a codistributed array
     Calling mtimes on codistributed arrays
     Calling embarrassingly parallel math functions (i.e. no communication is required)
     on a codistributed array.
     Done
2    This lab has 1773 rows and 148 columns of a codistributed array
     Calling mtimes on codistributed arrays
     Calling embarrassingly parallel math functions (i.e. no communication is required)
     on a codistributed array.
     Done
3    This lab has 1773 rows and 148 columns of a codistributed array
     Calling mtimes on codistributed arrays
     Calling embarrassingly parallel math functions (i.e. no communication is required)
     on a codistributed array.
     Done
4    This lab has 1773 rows and 148 columns of a codistributed array
     Calling mtimes on codistributed arrays
     Calling embarrassingly parallel math functions (i.e. no communication is required)
     on a codistributed array.
     Done
5    This lab has 1773 rows and 148 columns of a codistributed array
     Calling mtimes on codistributed arrays
     Calling embarrassingly parallel math functions (i.e. no communication is required)
     on a codistributed array.
     Done
6    This lab has 1773 rows and 148 columns of a codistributed array
     Calling mtimes on codistributed arrays
     Calling embarrassingly parallel math functions (i.e. no communication is required)
     on a codistributed array.
     Done
7    This lab has 1773 rows and 148 columns of a codistributed array
     Calling mtimes on codistributed arrays
     Calling embarrassingly parallel math functions (i.e. no communication is required)
     on a codistributed array.
     Done
8    This lab has 1773 rows and 148 columns of a codistributed array
     Calling mtimes on codistributed arrays
     Calling embarrassingly parallel math functions (i.e. no communication is required)
     on a codistributed array.
     Done
9    This lab has 1773 rows and 148 columns of a codistributed array
     Calling mtimes on codistributed arrays
     Calling embarrassingly parallel math functions (i.e. no communication is required)
     on a codistributed array.
     Done
10    This lab has 1773 rows and 147 columns of a codistributed array
     Calling mtimes on codistributed arrays
     Calling embarrassingly parallel math functions (i.e. no communication is required)
     on a codistributed array.
     Done
11    This lab has 1773 rows and 147 columns of a codistributed array
     Calling mtimes on codistributed arrays
     Calling embarrassingly parallel math functions (i.e. no communication is required)
     on a codistributed array.
     Done
12    This lab has 1773 rows and 294 columns of a codistributed array
     Calling mtimes on codistributed arrays
     Calling embarrassingly parallel math functions (i.e. no communication is required)
     on a codistributed array.
     Done
P>> mpiprofile viewer;
1    Sending  pmode lab2client  to the MATLAB client for asynchronous evaluation.

Во-первых, просмотрите Функциональный Сводный отчет, убедившись, что он сортируется по времени выполнения путем нажатия на Total Time column. Затем перейдите по ссылке для функции верхнего уровня (который должен быть pctdemo_aux_profdistarray) видеть Функциональный Детализированный отчет.

Занятая таблица строки в функциональном детализированном отчете

Каждая запись функции MATLAB имеет свою собственную таблицу Busy Line, которая полезна, если вы хотите профилировать несколько программ или примеров одновременно.

  • В Функциональном Детализированном отчете наблюдайте информацию о коммуникации для выполняемого кода MATLAB по линию за линией основание.

  • Сравните профильную информацию с помощью таблицы Busy Line. Нажмите Compare макс. по сравнению с min TotalTime. Наблюдайте, что таблица Busy Line и проверка видят, какие номера строки заняли большую часть времени путем сортировки поля времени с помощью выпадающего списка. Нет никаких циклов for в этом коде и никакой увеличивающейся сложности, как вы видели в предыдущем Профильном Параллельном примере Распределения работы. Однако все еще существуют значительные различия в загрузке вычисления между лабораториями. Посмотрите на строку sqrt( sin( D .* D ) );.

Несмотря на то, что никакая коммуникация не требуется для этой поэлементной операции, производительность не оптимальна, потому что некоторые лаборатории действительно больше работают, чем другие. Во второй строке, (D*D*D), общее потраченное время является тем же самым на обеих лабораториях. Однако Данные Rec и Данные Отправленные столбцы показывают значительные различия в сумме данных, отправленных и полученных. Время, потраченное для этого mtimes, подобно на всех лабораториях, потому что codistributed коммуникация массивов неявно синхронизирует все лаборатории.

В девятом столбце (слева) таблицы Busy Line, панель показывает процент для выбранного поля (использующий сортировку занятого поля списка строк). Эти панели могут также использоваться, чтобы визуально сравнить Общее Время, и Отправленные Данные или Данные, Полученные из основных лабораторий и лабораторий сравнения.

Наблюдение операций над массивами Codistributed в представлении графика

Если вы кликаете по соответствующему имени функции и находитесь в Функциональном Детализированном отчете, вы получаете более определенную информацию о codistributed операции над массивами.

  • Чтобы получить передаваемые данные межлаборатории нажимают Plot All PerLab Communication. В первой фигуре вы видите лабораторию 1 передача большей части объема данных и последней лаборатории (лаборатория 12) передача наименьшего количества объема данных.

  • Чтобы вернуться к Функциональному Сводному отчету, нажмите Home и затем нажмите на ссылку pctdemo_aux_profdistarray, чтобы просмотреть таблицу Busy Line снова.

Используя сравнения, можно также видеть объем данных, переданный между каждой лабораторией. Это постоянно для всех лабораторий за исключением первых и последних лабораторий. Когда нет никакой явной коммуникации, это указывает на проблему распределения. В типичной codistributed операции mtimes массивов лаборатории, которые имеют наименьшее количество объема данных (например, лаборатория 1) получают все необходимые данные своих соседних лабораторий (например, лаборатория 2).

Данные полученный график

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

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