В этом примере показано, как профилировать неявную коммуникацию, которая происходит при использовании неравномерно распределенного массива.
Предпосылки:
Интерактивный параллельный режим в Parallel Computing Toolbox™ (см. pmode
в пользовательском руководстве.)
В этом примере показано, как использовать параллельный профилировщик в случае неравномерно распределенного массива. Самый легкий способ создать 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 операции над массивами.
Чтобы получить передаваемые данные межлаборатории нажимают Plot All PerLab Communication
. В первой фигуре вы видите лабораторию 1 передача большей части объема данных и последней лаборатории (лаборатория 12) передача наименьшего количества объема данных.
Чтобы вернуться к Функциональному Сводному отчету, нажмите Home и затем нажмите на pctdemo_aux_profdistarray
соединитесь, чтобы просмотреть таблицу Busy Line снова.
Используя сравнения, можно также видеть объем данных, переданный между каждой лабораторией. Это постоянно для всех лабораторий за исключением первых и последних лабораторий. Когда нет никакой явной коммуникации, это указывает на проблему распределения. В типичном codistributed массиве mtimes
операция, лаборатории, которые имеют наименьшее количество объема данных (например, лаборатория 1) получает все необходимые данные их соседних лабораторий (например, лаборатория 2).
В этих Данных, Полученных На график Лаборатории, существует значительное уменьшение в сумме данных, переданных последней лабораторией и увеличением суммы, переданной первой лабораторией. Наблюдение Получить Коммуникационный График временной зависимости (не показанный) далее иллюстрирует, что существует что-то другое продолжающееся в первой лаборатории. Таким образом, первая лаборатория проводит самое долгое количество времени в коммуникации.
Как вы видите, неравномерное распределение матрицы вызывает ненужные коммуникационные задержки при использовании параллельных codistributed операций над массивами данных и неравномерного распределения работы с параллелью задачи (никакая коммуникация) операции. Кроме того, лаборатории (как первая лаборатория в этом примере), которые получают больше данных, запускаются с наименьшего количества объема данных до codistributed операции над массивами.