exponenta event banner

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

В этом примере показано, как профилировать неявную связь, возникающую при использовании неравномерно распределенного массива. Начало работы с параллельным профилированием см. в разделе Профилирование параллельного кода.

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

Сначала просмотрите отчет Function Summary Report, удостоверившись, что он отсортирован по времени выполнения, щелкнув столбец Total Time. Затем перейдите по ссылке для функции pctdemo_aux_profdistarray для просмотра подробного отчета о функциях.

Таблица «Занятая линия» в подробном отчете о функциях

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

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

  • Сравните информацию о профилировании с помощью таблицы «Занятая линия». Щелкните Сравнить макс. и мин. TotalTime. Просмотрите таблицу «Занятая линия» и проверьте, какие номера линий занимают наибольшее время, отсортировав поле времени с помощью раскрывающегося списка. В этом коде нет циклов for-loops и нет возрастающей сложности. Однако между лабораториями все еще существует большая разница в вычислительной нагрузке. Посмотрите на sqrt( sin( D .* D ) ); линия.

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

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

Наблюдение за операциями с распределенным массивом на виде графика

Если щелкнуть соответствующее имя функции и открыть подробный отчет о функции, появится более подробная информация об операции с распределенным кодовым массивом.

  • Для получения данных межлабораторной связи нажмите Plot All Per Worker Communication. На первом рисунке можно увидеть лабораторию 1, передающую наибольшее количество данных, и последнюю лабораторию (лабораторию 12), передающую наименьшее количество данных.

  • Чтобы вернуться к сводному отчету по функциям, щелкните Главная страница, а затем нажмите кнопку pctdemo_aux_profdistarray для повторного просмотра таблицы «Занятая линия».

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

График полученных данных

В этом графике «Данные, полученные на работника» (Data Received Per Worker) наблюдается значительное уменьшение количества данных, переданных последней лабораторией, и увеличение количества данных, переданных первой лабораторией. Наблюдение за графиком времени приема сообщений (не показан) дополнительно показывает, что в первой лаборатории происходит что-то другое. То есть первая лаборатория проводит самое длительное время в общении.

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