В этом примере показано, как профилировать неявное общение, которое происходит при использовании неравномерно распределенного массива. Для начала работы с параллельным профилированием смотрите Профилирование Параллельного Кода.
В этом примере показано, как использовать параллельный профилировщик в случае неравномерно распределенного массива. Самый легкий способ создать кодируемый массив - пройти codistributor
как аргумент, например, в rand(N, codistributor)
. Это равномерно распределяет вашу матрицу размера N между работниками MATLAB ®. Чтобы получить несбалансированное распределение данных, можно получить некоторое количество столбцов кодируемого массива как функции labindex
.
Графики в этом примере создаются из 12-узлового кластера MATLAB. Все остальное показано в четырехузловом локальном кластере.
Алгоритм, который мы выбрали для этого кодового массива, относительно прост. Мы генерируем большую матрицу, так что каждая лаборатория получает подматрицу приблизительно 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
Analyzing and transferring files to the workers ...done. Lab 1: This lab has 1024 rows and 1 columns of a codistributed array Lab 2: This lab has 1024 rows and 256 columns of a codistributed array Lab 3: This lab has 1024 rows and 256 columns of a codistributed array Lab 4: This lab has 1024 rows and 511 columns of a codistributed array Lab 1: Calling mtimes on codistributed arrays Calling embarrassingly parallel math functions (i.e. no communication is required) on a codistributed array. Done Lab 2: Calling mtimes on codistributed arrays Calling embarrassingly parallel math functions (i.e. no communication is required) on a codistributed array. Done Lab 3: Calling mtimes on codistributed arrays Calling embarrassingly parallel math functions (i.e. no communication is required) on a codistributed array. Done Lab 4: Calling mtimes on codistributed arrays Calling embarrassingly parallel math functions (i.e. no communication is required) on a codistributed array. Done
mpiprofile viewer
Сначала просмотрите Сводный отчет функции, чтобы убедиться, что он отсортирован по времени выполнения, нажав на столбец Общее время. Затем перейдите по ссылке для функции pctdemo_aux_profdistarray
чтобы увидеть Детализированный отчет Function.
Каждая запись функции MATLAB имеет свою собственную таблицу Busy Line, которая полезна, если вы хотите профилировать несколько программ или примеров одновременно.
В Function Детализированного отчета наблюдайте коммуникационную информацию для исполняемого кода MATLAB на линейном базисный.
Сравните информацию о профилировании с помощью таблицы Busy Line. Щелкните Сравнить макс и мин. значение TotalTime. Наблюдайте за таблицей Busy Line и проверяйте, какие номера линий занимали наибольшее время, отсортировав поле времени с помощью раскрывающегося списка. В этом коде нет циклов for-loops и нет увеличивающейся сложности. Однако все еще существует большое различие в вычислительной нагрузке между лабораториями. Посмотрите на sqrt( sin( D .* D ) );
линия.
Несмотря на то, что для этой поэлементной операции коммуникация не требуется, эффективность не оптимальна, потому что одни лаборатории выполняют больше работы, чем другие. Во второй строке, (D*D*D
), общее затраченное время совпадает на обеих лабораториях. Однако столбцы Data Rec и Data Send показывают большое различие в объеме отправленных и полученных данных. Время, затраченное на это mtimes
аналогичен во всех лабораториях, потому что коммуникация с кодовым распределением массивов неявно синхронизирует все лаборатории.
В девятом столбце (слева) таблицы Busy Line на панели отображается процент для выбранного поля (с помощью поля списка Sort busy lines). Эти панели могут также использоваться для визуального сравнения общего времени и отправленных данных или полученных данных основной и сравнительной лабораторий.
Если вы кликнете соответствующее имя функции и находитесь в Детализированном отчете Function, то получите более конкретную информацию о кодовой операции над массивами.
Для получения данных межлабораторной связи нажмите Plot All Per Worker Communication
. На первом рисунке можно увидеть, как лаборатория 1 передает наибольший объем данных, а последняя лаборатория (лаборатория 12) - наименьший объем данных.
Чтобы вернуться к отчету Сводных данных функций, нажмите Home, а затем нажмите на pctdemo_aux_profdistarray
чтобы снова просмотреть таблицу Занятая линия (Busy Line).
Используя сравнения, вы также можете увидеть объем данных, передаваемых между каждой лабораторией. Это постоянно для всех лабораторий, кроме первой и последней лабораторий. Когда явного сообщения нет, это указывает на проблему с распределением. В типичном кодовом распределенном массиве mtimes
операция, лаборатории, которые имеют наименьший объем данных (например, лаборатория 1), получают все необходимые данные от своих соседних лабораторий (например, лаборатория 2).
На этом графике Data Received Per Worker происходит значительное уменьшение объема данных, переданных последней лабораторией, и увеличение суммы, переданной первой лабораторией. Наблюдение за графиком «Время связи приема» (не показан) дополнительно иллюстрирует, что в первой лаборатории происходит что-то другое. То есть первая лаборатория проводит самое долгое время в общении.
Как видим, неравномерное распределение матрицы вызывает ненужные задержки связи при использовании данных, параллельных с кодовым распределением операций над массивами и неравномерное распределение работы с параллельными операциями задачи (без связи). В сложение лаборатории (как и первая лаборатория в этом примере), которые получают больше данных, начинаются с наименьшего объема данных до кодирования операций над массивами.