Информационные технологии Вестник Нижегородского университета им. Н.И. Лобачевского, 2012, № 5 (2), с. 385-391
УДК 004.051
MPIPerf: ПАКЕТ ОЦЕНКИ ЭФФЕКТИВНОСТИ КОММУНИКАЦИОННЫХ ФУНКЦИЙ СТАНДАРТА MPI*
© 2012 г. М.Г. Курносов
Институт физики полупроводников им. А.В. Ржанова СО РАН, Новосибирск
mkumo sov@isp.nsc.ru
Поступила в редакцию 10.09.2012
Рассмотрены методы измерения времени выполнения коллективных операций обмена информацией (Collective communications) между ветвями параллельных MPI-программ. Отражены систематические ошибки измерений, характерные для программных пакетов, реализующих эти методы. Предложен подход к измерению времени выполнения коллективных операций обменов, основанный на синхронизации моментов запуска коммуникационных функций в ветвях MPI-программы.
Ключевые слова: коллективные обмены, оценка эффективности, синхронизация, MPI, вычислительные системы.
Введение
Коммуникационные библиотеки стандарта MPI (MPICH2, Open MPI и др.) являются основным средством создания параллельных программ для распределенных вычислительных систем (ВС). Основу этих библиотек составляют коммуникационные функции дифференцированных (Point-to-point communications) и коллективных операций (Collective communications) обмена информацией между ветвями параллельных программ. Коллективные операции подразделяются на несколько видов [1, 2]: трансляционный (ТО, One-to-all broadcast), трансляционно-циклический (ТЦО, All-to-all broadcast), коллекторный обмены (КО, All-to-one broadcast) и коллективные операции синхронизации ветвей (Barrier, Eureka). Коллективные операции реализуются на основе дифференцированных обменов или аппаратурно с использованием специализированных коммуникационных сетей (например, на базе сети с древовидной топологией в системах семейства IBM Blue Gene). Для широкого класса параллельных алгоритмов время выполнения коллективных операций является критически важным и определяет их масштабируемость.
Коллективные операции обменов информацией реализуются программно в виде коммуникационных функций. Например, операции ТО и КО в библиотеках стандарта MPI реализуются функциями: MPI_Bcast, MPI_Gather; в библиотеках Cray Shmem: shmem_broadcast,
shmem_collect; в языке параллельного программирования Unified Parallel C: upc_all_broadcast, upc_all_gather.
Пользователями и разработчиками системного программного обеспечения распределенных ВС востребованы средства для оценки времени выполнения функций, реализующих коллективные операции обменов. Такая информация необходима для определения оптимального алгоритма реализации коллективной операции -алгоритма, обеспечивающего минимум времени её выполнения, для определения эффективности реализаций коммуникационных библиотек и runtime-систем языков параллельного программирования, а также для верификации аналитических (LogP, PLogP, LogGP) и имитационных моделей (LogGOPSim, PSINS, DIMEMAS, Big-Sim) выполнения параллельных программ [3].
В данной работе предложен подход к измерению времени выполнения коллективных операций обменов, основанный на синхронизации моментов запуска коммуникационных функций в ветвях MPI-программы. Метод составил основу пакета MPIPerf, в котором учтены известные систематические ошибки измерений, характерные для известных подходов.
1. Методы измерения времени выполнения коллективных операций
Сформулируем суть задачи измерения времени выполнения функции, реализующей коллективную операцию обмена информацией. За-
Статья рекомендована к публикации программным комитетом Международной научной конференции «Параллельные вычислительные технологии 2012».
даны функция и значения ее входных параметров (буферы приема-передачи, размеры сообщений и номера ветвей, участвующих в операции). Требуется измерить время t0, t1, ..., tn-1 выполнения функции в n ветвях программы на заданной подсистеме ЭМ.
В основе большинства известных методов (пакеты Intel MPI Benchmarks, mpptest, Phloem, LLCBench, MPIBlib, OSU Micro-Benchmarks и др.) время выполнения коллективной операции оценивается путем измерения времени к выполнений функции. За время t выполнения функции в ветви принимается среднее время одного её запуска (среднее время одной итерации цикла измерений). Ниже приведен пример такой процедуры для измерения времени выполнения функции MPI_Bcast (далее все примеры приводятся для функций стандарта MPI).
2. Ошибки измерения времени выполнения коллективных операций
2.1. Игнорирование отложенной инициализации MPI-функций. Время выполнения коллективной операции измеряется без её предварительной инициализации (пакеты Intel MPI Benchmarks, Phloem, MPIBlib, SKaMPI [4]). Во многих библиотеках стандарта MPI и системах параллельного программирования ветви программы, участвующие в коллективной операции, устанавливают между собой сетевое соединение только при её первом вызове (Late initialization). Поэтому время выполнения первого вызова может значительно превосходить время выполнения последующих обращений к функции. Результаты первого вызова не должны учитываться в итоговой оценке времени вы-
MPI_Bcast(buf, count, MPI_BYTE, root, comm) /* Инициализация */
MPI_Barrier(comm) /* Синхронизация */
t = MPI_Wtime()
for i = 1 to k do /* Цикл измерений */
MPI_Bcast(buf, count, MPI_BYTE, root, comm) end for
t = (MPI_Wtime() - t) / k /* Среднее время */
Время выполнения коллективной операции зависит от значений её входных параметров. Так, на время выполнения функции трансляционного обмена MPI_Bcast влияют способ выделения памяти для буфера приема-передачи buf (выбор границы выравнивания адреса буфера, размещение передаваемой информации в кэш-памяти процессора), тип передаваемых данных (встроенный тип данных MPI с непрерывным размещением элементов в памяти или производный тип данных с размещением элементов в памяти по несмежным адресам), выбор корневого процесса root и коммуникатора comm, который задает распределение ветвей программы по ЭМ системы. Кроме того, на время выполнения функции оказывают влияние и ветви других программ, которые загружают совместно используемые ресурсы системы (коммуникационную сеть, контроллер(ы) оперативной памяти вычислительных узлов и др.). По этой причине результаты измерений времени выполнения коллективных операций известными пакетами различны. Кроме этого, существующим методам присущи систематические ошибки измерений.
полнения операции. Например, на системе Б, описанной в п. 5, время выполнения второго вызова функции MPI_Allreduce в 11.7 раза меньше времени выполнения первого вызова (использованы: библиотека OpenMPI 1.4.4; 64 процесса - 8 узлов по 8 ядер; при повторном вызове функции использовался буфер такого же размера - 8192 байт, но размещенный по другому адресу в оперативной памяти).
2.2. Учёт времени выполнения коллективной операции только в одной ветви. В
качестве конечного значения времени выполнения коллективной операции обмена информацией принимается только время определенной ветви (например, ветви 0). Однако время выполнения операции в ветвях различно. Это обусловлено тем, что алгоритмы коллективных операций реализуются на основе дифференцированных обменов. В зависимости от используемого алгоритма коллективной операции ветви выполняют различное количество таких обменов [2, 5, 6]. Например, на рис. 1 приведена диаграмма выполнения коллекторного приема (MPI_Reduce) алгоритмом биномиального дерева (Binomial tree) [6].
| 1 MPI_Re$v^ | MPI_Recv ^ | MPI_Recy*|
| fHVTPLSend |
| | MPI_Recv___—►! pft/IPI_Send
| |—MFTSend
| | MPI_Recv____—*| f^MPI_Send |
| |—MFl3end
Рис. 1. Диаграмма выполнения коллекторного приема информации (MPI_Reduce) ветвью 0 (6 ветвей, результаты получены пакетом Intel Trace Analyzer and Collector)
За время выполнения коллективной операции обмена информацией следует принимать максимальное из времен выполнения операции в ветвях программы.
2.3. Измерение времени выполнения MPI-функции при разных значениях параметров.
На каждой итерации цикла измерений (см. п. 1) используются различные значения входных параметров. Например, в пакетах Intel MPI Benchmarks, mpptest при измерении времени выполнения функции MPI_Bcast на каждой итерации цикла номер root корневой ветви изменяется. Это приводит к тому, что при выполнении коллективной операции используются различные каналы связи (меняется последовательность обменов сообщениями).
2.4. Игнорирование иерархической организации подсистемы памяти. В некоторых пакетах не учитывается, что при повторном использовании одного и того же буфера приема/передачи его данные с большой вероятностью будут размещены в кэш-памяти процессора. Это приводит к тому, что время выполнения первого и последующих вызовов коллективной операции может значительно отличаться.
2.5. Некорректная синхронизация ветвей программы. Синхронизация ветвей параллельной программы перед и/или в цикле измерений выполняется при помощи барьерной синхронизации (МР1_Багг1ег). Это приводит к неравномерному смещению моментов запуска коллективной операции в ветвях. Причина в том, что барьерная синхронизация реализуется путем дифференцированных обменов сообщениями нулевой длины [5; 6]. Количество таких обменов, выполняемых каждой ветвью, различно и зависит от используемого алгоритма барьерной синхронизации. В конечном счете, ветви осуществляют выход из функции синхронизации в разные моменты времени (ситуация аналогичная примеру на рис. 1).
2.6. Измерение времени выполнения коллективной операции без синхронизации моментов её запуска в ветвях. Измерение времени выполнения МР1-функции выполняется в цикле (см. п. 1) без синхронизации моментов её запуска в ветвях программы. Это приводит к тому, что результирующая оценка времени выполнения операции включает и время ожидания начала следующей итерации цикла измерений. Рассмотрим измерение времени выполнения
Рис. 2. Диаграмма выполнения линейного алгоритма трансляционного обмена (МР1_Бсаз^ между 4 ветвями параллельной программы
Рис. 3. Диаграмма выполнения четырех итераций цикла измерений времени выполнения линейного алгоритма трансляционного обмена
функции MPI_Bcast, в соответствии с процедурой из п. 1. Для определенности будем полагать, что MPI_Bcast реализуется линейным алгоритмом, при котором сообщение размером m байт из ветви 0 передается в ветвь 1, затем в ветвь 2 и т.д. На рис. 2 показана диаграмма выполнения этого алгоритма. Время ti выполнения обменов ветвью i е {0, 1, 2, 3} выражено в модели Дж. Хокни, в которой а - латентность канала связи, в - время передачи одного байта.
На рис. 3 приведена диаграмма выполнения четырех итераций цикла измерений из п. 1. Из диаграммы видно, что измеренное время T1 выполнения функции в ветви 1 в 2.5 раза превосходит «истинное» время t1 (рис. 2). Это объясняется тем, что после выполнения первой итерации, ветвь 1 сразу (без синхронизации) переходит к итерации 2 и запускает операцию, в которой она ожидает сообщение от ветви 0. В состоянии ожидания ветвь 1 пребывает до тех пор, пока ветвь 0 не передаст сообщения ветвям 2 и 3. Таким образом, на каждой итерации к истинному времени выполнения операции добавляется время ожидания. Измеренное таким способом время выполнения функции включает систематическую ошибку, связанную с несин-хронизированным запуском операций в ветвях программы (Pipelined measurements). Сказанное справедливо не только для измерения времени выполнения алгоритмов ТО, но и для алгоритмов других коллективных операций.
Одним из известных подходов к устранению описанной ошибки является организация одновременного запуска операций в ветвях. Это достигается за счет синхронизации показаний локальных часов ветвей и формирования расписаний запуска операции в них. Такой подход лежит в основе пакетов SKaMPI, MPIBench и Netgauge [7]. Однако эти пакеты не лишены перечисленных выше систематических ошибок измерений.
Автором предложен метод измерения времени выполнения коллективных операций обменов информацией, основанный на синхронизации моментов запуска функций.
3. Описание метода
Разработанный метод включает нижеследующие шаги.
1. Синхронизация показаний локальных часов ветвей. Каждая ветвь I вычисляет смещение о1 показаний своих локальных часов относительно часов ветви 0, показания которых принимаются за глобальное время. Зная свое локальное время Т,, ветвь I может вычислить показания глобальных часов Т0 = Т + о 1 и наоборот: Т = Т0 - в1.
2. Оценка времени выполнения ТО. Формируется оценка сверху времени 1Ъса81 выполнения трансляционной передачи (МР1_ВсаБ^ из ветви 0 сообщения с показанием её часов. Как правило, показания часов представляются вещественным числом двойной точности.
3. Измерение времени выполнения коллективной операции. Процесс измерения времени выполнения коллективной операции разбивается на этапы (рис. 4).
3.1. На каждом этапе у = 0, 1, ... ветвь 0
запрашивает показание Т0 своих локальных часов и, используя трансляционный обмен (МР1_ВсаБ^, передает ветвям время ту первого запуска операции: ту = Т0 + .
3.2. По значению ту ветви формируют расписание к запусков операции на этапе у. Запуск I = 0, 1, ..., к - 1 осуществляется по глобальным часам в момент времени ту = ту + I Ъу. На каждый запуск отводится Ъ секунд, таким образом, запуск I должен завершиться до момента т//+1 = = ту + (I + 1) Ъ. Если ветвь осуществляет запуск I позднее момента ту или завершает выполнение операции после ту + (I + 1) Ъу, то результат выполнения операции считается некорректным. Такие ситуации могут возникать по причине динамического характера загрузки ресурсов распределенных ВС.
3.3. После окончания этапа осуществляется анализ результатов измерений. За время выполнения операции на запуске I принимается максимальное из времен выполнения ветвей. Если на этапе у количество некорректных запусков превышает g процентов, то выполняется кор-
ректировка длины интервала Ъу+1 = у(т';- -ту)/k, где т у - время завершения этапа у (максимальное из времен завершения выполнения ветвей на к-м запуске этапа у), у - масштабный коэффициент (1.1 < у < 2, подбирается эмпирически).
3.4. Проверяются условия окончания измерений. Если стандартная ошибка среднего времени выполнения коллективной операции достигла заданного уровня или количество запусков превысило максимально допустимое, то измерения прекращаются.
Инициализация операции осуществляется на этапе 0. Выполняется к’ её запусков при длине интервала Ъ0 = 0. Результаты этого этапа не учитываются при формировании итоговых результатов измерений. Время выполнения этапа 0 используется для формирования начального значения длины интервала Ъ1 = у(т0 -т0)/к'.
4. Статистическая обработка результатов измерений. После завершения измерений осуществляется обработка их результатов. Пусть Q - количество корректных запусков операции за время выполнения всех этапов, а ^ - время выполнения операции на запуске q е {1, 2, ..., Q}. Из последовательности значений ?, ... Р удаляется g' процентов минимальных и максимальных значений. За итоговое время t выполнения коллективной операции принимается статистическая оценка математического ожидания времени выполнения корректных запусков операции. Для измеренного времени t формируется доверительный интервал с заданной доверительной вероятностью.
4. Пакет МР1Рег1
Описанный метод реализован автором в пакете МР1Рег£ (тр1регГ.срсЬ.з1Ьзи-tis.ru). В текущей версии реализованы тесты для всех коллективных операций стандарта МР1 2.2.
Синхронизация локальных часов ветвей в пакете МР1Рег£ осуществляется по выбору пользователя линейным или кольцевым алгоритмом. Оба алгоритма основаны на процедуре синхронизации часов двух ветвей - корневой ветви 0 и ветви г. Смещение о, показаний своих локальных часов ветвь г рассчитывает следующим образом
0i = T0 -
T
где Т0 - показание часов ветви 0, Тг' и Т" - показания часов ветви г. Величина Т^т - это сум-
марное время передачи и последующего приема сообщения с показаниями часов (RTT - Round Trip Time). За значение Trtt принимается минимальное из измеренных. Причем измерения величины Trtt заканчиваются, если её текущее минимальное значение не изменялось на протяжении последних d итераций (по умолчанию d = 100).
Линейный алгоритм последовательно выполняет синхронизацию часов ветвей 1, 2, ..., n - 1 с часами ветви 0. В кольцевом алгоритме каждая ветвь i аналогично рассчитывает отклонение oi ,(г_1+п) mod n показаний своих часов от ветви (i - 1 + n) mod п. Итоговое смещение локальных часов ветви i рассчитывается ветвью 0 как
0i 010 + 021 + . + 0i ,(i-1+n) mod п .
Ниже приведены значения параметров предложенного метода, используемые по умолчанию в пакете MPIPerf (пользователю доступна регулировка этих значений): k = 4, k = 8,
Sj = 25% (от общего количества запусков на этапе j), у = 11, g' = 25% (от общего числа корректных измерений). Реализованы два альтернативных условия окончания измерений: вариант 1 - количество измерений больше 100 или корректных измерений больше 30; вариант 2 -относительная ошибка среднего значения времени выполнения операции не превосходит 0.05 и количество успешных измерений не менее 10.
По окончании работы пакет MPIPerf формирует отчет, включающий: значение варьируемого параметра (размер сообщения или количество ветвей в программе); общее количество nt запусков коллективной операции; количество пс корректных запусков; количество ns корректных запусков после статистической обработки; статистическую оценку T математического ожидания времени выполнения операции (формируется по ns значениям); стандартную ошибку SE измерения времени T; минимальное значение T, максимальное значение T, абсолютную ошибку E измерений времени T (E = а-SE, где а - коэффициент Стьюдента), доверительный интервал P(T- а-SE < T< T + а-SE) = p, гдеp е {0.9; 0.95;
0.99} - заданная пользователем надежность.
5. Экспериментальное исследование
Эксперименты с пакетом MPIPerf проводились на двух вычислительных кластерах:
- кластер А (Центр параллельных вычислительных технологий ФГОБУ ВПО «Сибирский государственный университет телекоммуникаций и информатики»): 10 вычислительных узлов, на каждом узле установлено 2 процессора Intel Xeon E5420, коммуникационная сеть -
Gigabit Ethernet, операционная система -CentOS 5.2 x86_64 (ядро linux 2.6.18-92.el5);
- кластер Б (Информационно-вычислительный центр, Новосибирский национальный исследовательский государственный университет): подсистема из 96 узлов HP BL2x220 G7, на каждом узле 2 процессора Intel Xeon X5670, коммуникационная сеть - InfiniBand 4x QDR, операционная система - SUSE Linux Enterprise Server 11 x86_64 (ядро linux 2.6.27.19-5).
5.1. Исследование точности синхронизации моментов запуска коллективной операции. Точность синхронизации моментов запуска операции в ветвях можно оценить при помощи специальных коллективных функций ожидания, время выполнения которых известно априори. В первой функции WaitPatternUp [4] каждая ветвь i ожидает (i + 1) • 10 6 секунд (выполняет пустой цикл). Если все ветви запустили эту функцию в один момент времени, то время её выполнения составит n-10-6 секунд, где n -количество ветвей в программе. Во второй функции WaitPatternNull каждая ветвь засекает время запуска операции и сразу завершает её выполнение. Время работы этой функции 0 секунд.
На рис. 5 показано время выполнения теста WaitPatternUp на кластере Б (использована библиотека OpenMPI 1.4.4) пакетами MPIPerf (кривая 7) и SKaMPI (кривая 2).
Рис. 5. Зависимость времени выполнения на кластере Б теста WaitPatternUp от количества ветвей в программе: 1 - MPIPerf, таймер MPI_Wtime;
2 - пакет SKaMPI, таймер MPI_Wtime; 3 - пакет MPIPerf, таймер TSC
Не все результаты измерений совпадают с реальным временем выполнения операции. Причина в том, что на узлах кластера Б операционная система в качестве источника времени (clock source) использует высокоточный таймер событий HPET - High Precision Event Timer, с которым она некорректно работает [8] и фор-
мирует неточные значения функции getti-meofday. В свою очередь, эта функция используется во многих библиотеках MPI для реализации подпрограммы MPI_Wtime, средствами которой осуществляются измерения времени в большинстве известных пакетов (Intel MPI Benchmarks, mpptest, Phloem, MPIBlib, OSU Micro-Benchmarks). Для решения этой проблемы в MPIPerf реализована возможность выбора таймера, который будет использован для измерения времени выполнения операций и синхронизации ветвей. Поддерживаются таймеры на основе функций gettimeofday, MPI_Wtime и значений регистра TSC - Time Stamp Counter современных процессоров. На рис. 5 (случай 3) видно, что пакет MPIPerf с таймером TSC корректно измеряет время выполнения операции.
Перед использованием пакета MPIPerf рекомендуется проверить корректность показаний системных таймеров путем измерения ими времени выполнения операции WaitPatternNull.
5.2. Сравнение с пакетом SKaMPI. На
рис. 6 приведены результаты измерения времени выполнения на кластере А функции MPI_Bcast (библиотека MPICH2 1.2.1) пакетами MPIPerf и SKaMPI. Результаты измерений пакетами различны. Это объясняется разными подходами к выделению памяти под буферы приёма и передачи сообщений, а также динамическим характером загрузки ресурсов кластера.
Рис. 6. Зависимость времени выполнения функции MPI_Bcast от размера передаваемого сообщения: 1 - пакет 8КаМР1; 2 - пакет MPIPerf
Важным вопросом при разработке средств измерения времени выполнения коллективных операций является воспроизводимость результатов. На рис. 7 показана относительная ошибка измерения среднего времени выполнения функции MPI_Barrier пакетами 8КаМР1 и МР!Ре^ (использован кластер Б и библиотека
Меі МРІ 4.0.0.028 с таймером MPI_Wtime на основе значения регистра Т8С). Оба пакета запускались по 10 раз. На каждом запуске измерялось время выполнения функции MPI_Bar-гієг при различном количестве п ветвей в программе. По результатам 10 запусков для каждого значения п рассчитывалось среднее значение М[ї ] времени ї выполнения функции, среднее квадратическое отклонение а[ї ] и относительная ошибка
КБЕ = —
М [ї ]7і0
среднего времени выполнения функции. Кривые 1 и 2 на рис. 7 свидетельствуют об удовлетворительной для практики воспроизводимости результатов измерений пакетом МРІРегТ
ЯБЕ
Рис. 7. Зависимость относительной ошибки Я8Б измерения среднего времени выполнения функции MPI_Barrier от количества п ветвей в программе: 1 - пакет БКаМР1; 2 - МР1Ре^
Заключение
Предложенный метод измерения времени выполнения коммуникационных функций основан на синхронизации моментов запуска операции в ветвях МР1-программы и учитывает известные систематические ошибки измерений, характерные для существующих пакетов. Разработанный подход применим и для измерения
времени выполнения коммуникационных функций в runtime-системах языков параллельного программирования (IBM X10, Cray Chapel, Unified Parallel C).
В будущих версиях MPIPerf планируется реализовать измерение времени выполнения неблокирующих коллективных операций (Nonblocking collective communications), появление которых ожидается в стандарте MPI 3.0.
Работа выполнена при поддержке РФФИ (грант № 11-07-00105), Совета по грантам Президента РФ для поддержки ведущих научных школ (грант НШ-2175.2012.9) и в рамках госконтракта № 07.514.11.4015 с Минобрнауки РФ.
Список литературы
1. Хорошевский В.Г. Распределенные вычислительные системы с программируемой структурой // Вестник СибГУТИ. 2010. №2 (10). С. 3-41.
2. Курносов М.Г. Алгоритмы трансляционноциклических информационных обменов в иерархических распределенных вычислительных системах // Вестник компьютерных и информационных технологий. 2011. №5. С. 27-34.
3. Иванников В.П., Аветисян А.И., Гайсарян С.С., Падарян В. А. Прогнозирование производительности MPI-программ на основе моделей // Автоматика и телемеханика. 2007. №5. С. 8-17.
4. Worsch T., Reussner R., Werner A. On Benchmarking Collective MPI Operations // Proceedings of the 9th EuroPVM/MPI Users' Group Meeting on Recent Advances in Parallel Virtual Machine and Message Passing Interface. 2002. P. 271-279.
5. Pjesivac-Grbovic J., Angskun T., Bosilca G. et al. Performance Analysis of MPI Collective Operations // Cluster Computing. 2007. Vol. 10, No 2. P. 127-143.
6. Thakur R., Rabenseifner R., and Gropp W. Optimization of collective communication operations in MPICH // Journal of High Performance Computing Applications. 2005. Vol. 19, No 1. P. 49-66.
7. Hoefler T., Mehlan T., Lumsdaine A. and Rehm W. Netgauge: A Network Performance Measurement Framework // Proceedings of High Performance Computing and Communications. 2007. P. 659-671.
8. https://bugzilla.novell.com/show_bug.cgi7id = 444496 (дата обращения: 21.02.2012).
MPIPerf: A TOOLKIT FOR BENCHMARKING MPI LIBRARIES M.G. Kurnosov
The methods for benchmarking collective communication operations between branches of MPI parallel programs are considered. The systematic measurement errors of collective operation execution time are described. An approach is proposed for benchmarking collective operations based on the synchronization of launching times of the communication functions in MPI program branches.
Keywords: collective communication, benchmarking, synchronization, MPI, computer systems.