В этом примере показано, как профилировать неявную коммуникацию, которая происходит при использовании неравномерно распределенного массива. Для начала работы с параллельным профилированием см. Профильный Параллельный Код.
В этом примере показано, как использовать параллельный профилировщик в случае неравномерно распределенного массива. Самый легкий способ создать codistributed массив состоит в том, чтобы передать codistributor
в качестве аргумента, такой как в rand(N, codistributor)
. Это равномерно распределяет вашу матрицу размера N между вашими рабочими MATLAB®. Чтобы получить несбалансированное распределение данных, можно получить некоторое количество столбцов codistributed массива в зависимости от labindex
.
Графики передачи данных в этом примере производятся с помощью локального кластера с 12 рабочими. Все остальное показывают, работая на локальном кластере с 4 рабочими.
Алгоритм, который мы выбрали для этого codistributed массива, относительно прост. Мы генерируем большую матрицу, таким образом, что каждая лаборатория добирается приблизительно 512 512 субматрица, за исключением первой лаборатории. Первая лаборатория получает только один столбец матрицы, и другие столбцы присвоены последней лаборатории. Таким образом, в кластере с четырьмя лабораториями, лаборатория 1 сохраняет только 1 512 столбец, лаборатории 2 и 3 имеют свои выделенные разделы, и лаборатория 4 имеет свой выделенный раздел плюс дополнительные столбцы (перенесенный из лаборатории 1). Конечный результат является несбалансированной рабочей нагрузкой при выполнении нулевой коммуникации поэлементные операции (такие как sin
) и коммуникация задерживается с операциями параллели данных (такими как codistributed/mtimes
). Мы начинаем с операции параллели данных сначала (codistributed/mtimes
). Мы затем выполняем, в цикле, sqrt
, sin
, и операции скалярного произведения, все из которых только работают с отдельными элементами матрицы.
Код файла MATLAB для этого примера может быть найден в: pctdemo_aux_profdistarray
В этом примере размер матрицы отличается в зависимости от количества работников MATLAB (numlabs
). Однако это берет приблизительно то же самое значение времени вычисления (не включая коммуникацию), чтобы запустить этот пример в любом кластере, таким образом, можно попытаться использовать больший кластер, не имея необходимость ожидать долгое время.
spmd labBarrier; % synchronize all the labs mpiprofile reset mpiprofile on pctdemo_aux_profdistarray(); end
Worker 1: This lab has 1024 rows and 1 columns of a codistributed array Worker 2: This lab has 1024 rows and 256 columns of a codistributed array Worker 3: This lab has 1024 rows and 256 columns of a codistributed array Worker 4: This lab has 1024 rows and 511 columns of a codistributed array Worker 1: Calling mtimes on codistributed arrays Calling embarrassingly parallel math functions (i.e. no communication is required) on a codistributed array. Done Worker 2: Calling mtimes on codistributed arrays Calling embarrassingly parallel math functions (i.e. no communication is required) on a codistributed array. Done Worker 3: Calling mtimes on codistributed arrays Calling embarrassingly parallel math functions (i.e. no communication is required) on a codistributed array. Done Worker 4: Calling mtimes on codistributed arrays Calling embarrassingly parallel math functions (i.e. no communication is required) on a codistributed array. Done
mpiprofile viewer
Во-первых, просмотрите Параллельные Сводные данные Профиля, убедившись, что они сортируются по времени выполнения путем нажатия на Total Time column. Затем перейдите по ссылке для функционального pctdemo_aux_profdistarray
видеть Функциональный Детализированный отчет.
Каждая запись функции MATLAB имеет свою собственную Занятую таблицу линий, которая полезна, если вы хотите профилировать несколько программ или примеров одновременно.
В Функциональном Детализированном отчете наблюдайте информацию о коммуникации для выполняемого кода MATLAB по линию за линией базис.
Чтобы сравнить профильную информацию, нажмите кнопку Busy Lines в разделе View панели инструментов приложения. В разделе Compare панели инструментов нажмите кнопку Max vs. Min Total Time и выберите количества рабочих, которых вы хотите сравнить в Движении с рабочим и Сравнить с меню. Наблюдайте, что Занятая таблица линий и проверка видят, какие номера строки заняли большую часть времени. Нет никаких циклов for в этом коде и никакой увеличивающейся сложности. Однако все еще существуют значительные различия в загрузке расчета между лабораториями. Посмотрите на линию 35, который содержит код sqrt( sin( D .* D ) );
.
Несмотря на то, что никакая коммуникация не требуется для этой поэлементной операции, эффективность не оптимальна, потому что некоторые лаборатории действительно больше работают, чем другие. Во второй строке, (D*D*D
), общее потраченное время является тем же самым на обеих лабораториях. Однако Полученные Данные и Данные Отправленные столбцы показывают значительные различия в сумме данных, отправленных и полученных. Время потрачено для этого mtimes
операция подобна на всех лабораториях, потому что codistributed коммуникация массивов неявно синхронизирует связь между ними.
В последнем столбце Занятой таблицы линий панель показывает процент для выбранного поля. Эти панели могут также использоваться, чтобы визуально сравнить Общее Время, и Отправленные Данные или Данные, Полученные из основных лабораторий и лабораторий сравнения.
Чтобы получить более определенную информацию о codistributed операции над массивами, кликните по соответствующему имени функции в Функциональном Детализированном отчете.
Чтобы получить передаваемые данные межлаборатории, нажмите Heatmap в разделе Plots панели инструментов. На первом рисунке вы видите, что лаборатория 1 передача большая часть объема данных и последняя лаборатория (лаборатория 12) передает наименьшее количество объема данных.
Используя тепловые карты, можно также видеть объем данных, переданный между каждой лабораторией. Это постоянно для всех лабораторий за исключением первых и последних лабораторий. Когда нет никакой явной коммуникации, это указывает на проблему распределения. В типичном codistributed массиве mtimes
операция, лаборатории, которые имеют наименьшее количество объема данных (e.g., лаборатория 1) получают все необходимые данные их соседних лабораторий (e.g., лаборатория 2).
В Данных Переданный график существует значительное уменьшение в сумме данных, переданных последней лаборатории и увеличению суммы, переданной первой лаборатории. Наблюдение Коммуникационного Графика временной зависимости (не показанный) далее иллюстрирует, что существует что-то другое продолжающееся в первой лаборатории. Таким образом, первая лаборатория проводит самое долгое количество времени в коммуникации.
Как вы видите, неравномерное распределение матрицы вызывает ненужные коммуникационные задержки при использовании параллельных codistributed операций над массивами данных и неравномерного распределения работы с параллелью задачи (никакая коммуникация) операции. Кроме того, лаборатории (как первая лаборатория в этом примере), которые получают больше данных, запускаются с наименьшего количества объема данных до codistributed операции над массивами.