Рубанов Л.И.
Институт проблем передачи информации им. А.А. Харкевича Российской академии наук (ИППИ РАН), ведущий научный сотрудник, rubanov @iitp . ru
Обработка больших данных в параллельных циклах
КЛЮЧЕВЫЕ СЛОВА:
Большие данные, высокопроизводительные вычисления, распараллеливание, распределенная память, неоднородный цикл. АННОТАЦИЯ:
Рассматривается задача распараллеливания циклической обработки больших данных на вычислительных системах с распределенной памятью. Требуется обеспечить эффективное использование вычислительной мощности при существенно разной трудоемкости итераций и/или производительности процессоров. Проанализированы существующие методы распараллеливания циклов и получены эмпирические оценки эффективности для различных моделей неоднородности итераций.
Многие алгоритмы обработки больших данных содержат многократно повторяемый цикл (или вложенные циклы), тело которого эквивалентно суперпозиции двух функций, M(W(pn)). Здесь W - функция без побочного эффекта, в которой сосредоточена основная вычислительная сложность итерации цикла (назовем ее «функция обработки»), а M -вычислительно простая функция с побочным эффектом, который даёт результат всего цикла вычислений («функция слияния»). Функция W может быть скалярной или векторной и в общем случае зависит от необязательного параметра (или вектора параметров) p„, где n - индекс цикла (номер итерации). Предполагается, что все необходимые входные данные для вычисления функции W доступны внутри нее, например, содержатся в статическом массиве или генерируются с помощью псевдослучайной последовательности. Таким образом, в данной постановке не предполагается хранить результаты каждой итерации цикла, а нужно получить лишь сводные данные (статистики) по большой выборке вычисленных значений. Рассматриваются только алгоритмы, в которых итерации цикла могут выполняться независимо друг от друга и в произвольном порядке. Ставится задача ускорения обработки за счет одновременного выполнения сразу нескольких итераций цикла на отдельных процессорах, т.е. распараллеливания цикла (РЦ).
Для вычислительных систем с общей памятью такая задача успешно решается средствами системы параллельного программирования OpenMP [1], однако число процессоров в них редко превышает 64, что сильно
ограничивает возможности РЦ. Мы будем рассматривать системы с распределенной памятью (кластеры), в которых межпроцессорный обмен данными осуществляется средствами стандартной библиотеки параллельного программирования MPI [2]. Важный аспект РЦ -сравнительная трудоёмкость отдельных итераций. Если цикл однородный, итерации можно выполнять синхронно, как это делается в систолических архитектурах. Нас интересует случай существенно неоднородных циклов, в которых длительность итерации меняется в широких пределах (аналогичная ситуация складывается и при вычислениях на кластере, включающем узлы с различной производительностью). Такая постановка отличается от рассматриваемой в проекте CENTAUR [3], где в теле цикла отсутствует побочный эффект, а функция обработки состоит в покоординатном преобразовании исходного вектора данных с размерностью, равной числу повторений цикла N. При этом неявно предполагается, что вычислительная сложность такого преобразования не зависит от n, а поиск наиболее эффективного решения сводится к выбору алгоритма распределения элементов данных по узлам гибридного кластера.
Для оценки эффективности РЦ при изменении числа процессоров в широком диапазоне использовалась методика, при которой время выполнения всего цикла в идеальном случае равно Nt независимо от числа процессоров (где т - средняя длительность итерации в однопроцессорном случае, увеличиваемая пропорционально числу процессоров). Измерения проводились на суперкомпьютере МВС-100К Межведомственного суперкомпьютерного центра РАН [4] с использованием до 2048 процессоров. Рассматривались 4 модели неоднородности цикла: U -длительность итерации есть случайная величина, распределенная равномерно на интервале (0, 2т); P - длительность итерации определяется временем между последовательными событиями пуассоновского процесса с интенсивностью т; L - итерация имеет линейную сложность по n, т.е. длительность равна Ci(n+1), где константа С « 2t/N выбирается так, чтобы средняя длительность итерации составляла т; Q - итерация имеет квадратичную сложность относительно n, т.е. длительность равна C2(n+1)2, где константа С2 « Зт/N2 выбирается так, чтобы средняя длительность составляла т. Применялись следующие три метода РЦ.
(1) Разделение области изменения индекса цикла. Весь интервал изменения индекса цикла [0, N) делится на m приблизительно одинаковых порций по числу процессоров так, что каждый процессор выполняет только итерации с номерами из одного класса вычетов по модулю m. Функцию слияния M внутри цикла реализует коллективная операция MPI_Gather с последующей содержательной обработкой в одной (корневой) ветви. Для тривиальных случаев обработки (сумма, произведение, максимум, минимум и т.п.) вместо этого используется одна из «готовых» коллективных операций MPI_Reduce. Такой метод широко применяется для
однородных циклов, но малопригоден для неоднородного случая. Так, при т=1024 время цикла значительно проигрывает идеальному РЦ; конкретно по моделям: U - 37.5%, P - 101.4%, L - 99.9%, Q - 200%. Причиной этого является синхронизирующий эффект коллективных операций MPI. Для улучшения картины следует выполнять функцию слияния локально (внутри каждого процесса), а коллективную функцию вызывать после конца цикла. В этом случае проигрыш составляет: U - 6.1%, P - 9.3%, L -0.1%, Q - 0.15%.
(2) Изменение порядка итераций. Заметим, что в моделях U и L интервал длительностей итерации одинаков, а эффективность РЦ для модели U значительно хуже. Причина в том, что в модели L итерации упорядочены по трудоёмкости, и это балансирует загруженность параллельных ветвей, а в модели U итерации распределяются случайно, что приводит к неравномерной загрузке. Поэтому в ситуациях, когда трудоемкость каждой итерации можно оценить априори (например, по фактической размерности обрабатываемых элементов больших данных), расположим их в цикле в порядке убывания сложности. Тогда даже при наличии коллективной операции в теле цикла эффективность РЦ для всех моделей уступает идеальному случаю менее 1%.
(3) Функциональное разделение ветвей. Этот метод РЦ основан на функциональной специализации ветвей параллельной программы и реализует архитектуру master/slave, в которой все процессоры разбиваются на две группы - рабочие и управляющие. Первая группа осуществляет непосредственное выполнение итераций цикла, а вторая, чаще всего состоящая из одного корневого процесса, служит для организации вычислений, т.е. раздачи заданий рабочим ветвям. Тот факт, что часть процессоров непосредственно не участвуют в полезной обработке данных, теряет свое значение с увеличением общего числа процессоров. Зато этот метод хорошо отвечает именно циклу из итераций с сильно различающейся трудоемкостью, поскольку новые задания раздаются по мере освобождения рабочих процессоров. При такой организации используется двухточечный обмен MPI-сообщениями, а в коллективных операциях нет необходимости. Уже при числе процессоров т=128 эффективность РЦ уступает идеальной менее 1% для всех рассмотренных моделей неоднородности цикла. При очень большом числе процессоров возможно снижение эффективности из-за перегрузки корневой ветви; в таких ситуациях следует увеличивать число процессоров в управляющей группе, разделяя между ними рабочие процессоры.
Описанные методы применялись при решении ряда задач обработки больших данных в составе оригинальных параллельных алгоритмов (подробности на сайте http://lab6.iitp.ru).
Литература:
1. The OpenMP API specification for parallel programming [http://openmp.org/wp/]
2. Message-passing interface forum. MPI Documents [http://www.mpi-forum.org/docs/docs.html]
3. CENTAUR software tools for hybrid supercomputing [http://centaur.botik.ru/home]
4. Межведомственный суперкомпьютерный центр РАН [http://www. jscc. ru]