Профилирование загрузки несбалансированные массивы 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). Однако это берет приблизительно ту же сумму времени вычисления (не включая коммуникацию), чтобы запустить этот пример в любом кластере, таким образом, можно попытаться использовать больший кластер, не имея необходимость ожидать долгое время.

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

Во-первых, просмотрите Функциональный Сводный отчет, убедившись, что он сортируется по времени выполнения путем нажатия на 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 Per Worker Communication. На первом рисунке вы видите лабораторию 1 передача большей части объема данных и последней лаборатории (лаборатория 12) передача наименьшего количества объема данных.

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

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

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

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

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