Технология фрагментированного программирования

ТЕХНОЛОГИЯ ФРАГМЕНТИРОВАННОГО ПРОГРАММИРОВАНИЯ1

В.Э. Малышкин

Кратко представлена технология фрагментированного программирования и реализующие ее язык и система фрагментированного программирования LuNA, разрабатываемые в ИВМиМГ СО РАН. Технология ориентирована на поддержку разработки параллельных программ, реализующих большие численные модели, и их исполнения на суперкомпьютерах. Система LuNA автоматически обеспечивает такие динамические свойства параллельных программ как динамическая настройка на все доступные ресурсы, динамическая балансировка нагрузки, учет динамики поведения моделируемого явления и т.п.

Ключевые слова: фрагментированное программирование, численные алгоритмы, большие численные модели, параллельное программирование

Введение

В течение последних 15 лет в ИВМиМГ СО РАН велись работы по созданию методов и средств параллельной реализации больших численных моделей на суперкомпьютерах, а также параллельной реализации таких моделей. Накопленный опыт позволил сформировать идеи технологии фрагментированного программирования. Основная проблема параллельной реализации больших численных моделей состоит в том, что необходимая сложность программирования заметно превосходит квалификацию программистов, работающих обычно в численном моделировании, так как в программе моделирования понадобилось реализовывать динамические системные функции.

Чтобы преодолеть эту проблему, нужна поддержка процесса параллельного программирования таких моделей. Необходимая технология — технология фрагментированного программирования и реализующие ее язык и система программирования LuNA — разработаны в ИВМиМГ СО РАН.

Поддерживая технику разработки программ численного моделирования также хотелось бы обеспечивать:

• должную степень непроцедурности [1] представления алгоритма в параллельной программе (не знать MPI, свойства вычислителя и его коммуникационной сети, методы и средства параллельного программирования и т.д.),

• неизменность алгоритма, его независимость от оборудования (раздельное описание алгоритма и реализующей его программы), автоматическая генерация фрагментированной программы, что требуется для обеспечения ее переносимости,

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

1 Статья рекомендована к публикации программным комитетом международной научной конференции «Параллельные вычислительные технологии 2012»

Теоретическую базу проекта ЬиКЛ составляет теория синтеза параллельных программ на вычислительных моделях [2]. В проекте системы LuNA учтен опыт разработки как больших численных моделей [3, 4, 13, 14], так и различных систем сборочного программирования в мире [5-8]. Текущие технологические результаты представлены в настоящей статье. Теоретические аспекты проекта не рассматриваются. Более ранние результаты опубликованы в [9-11].

1. Идеология системы фрагментированного программирования LuNA

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

1.1. Основные проектные решения

1. Технология фрагментированного программирования поддерживает процесс сборки целой программы из фрагментов вычислений (модулей, процедур, их входных/выходных фрагментов данных и т.п.) и ее исполнение.

2. Каждый фрагмент вычислений - независимая единица программы (рис. 1), содержит описание входных/выходных переменных и кода (модуля, процедуры) фрагмента.

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

4. В отличие от технологии модульного программирования, в ходе исполнения фрагментированная структура программы сохраняется. Каждый фрагмент вычислений определит в ходе исполнения независимо исполняющийся процесс программы, взаимодействующий с другими процессами.

5. Следуя С. Клини [12], в качестве базового представления алгоритма взято рекурсивно перечислимое множество функциональных термов. Фрагментированный алгоритм при необходимости извлекается алгоритмом вывода из множества фрагментов вычислений.

Рис. 1. Фрагмент вычислений

1.2. Исполнение фрагментированной программы

Базовый алгоритм:

• Фрагмент вычислений исполняется, если все его входные переменные получили значения.

• После выполнения фрагмента вычислений получают значения его выходные переменные.

• Алгоритм может реализоваться либо управлением в сгенерированной программе, либо run-time системой. В системе LuNA для обеспечения необходимой степени асинхронности выбрано исполнение фрагментированной программы run-time системой.

Эти правила определяют асинхронное исполнение фрагментированной программы, в которой порядок исполнения фрагментов вычислений определяется лишь информационными зависимостями между ними. При исполнении фрагментированной программы run-time система ищет лучшие способы исполнения фрагментированного алгоритма.

2. Шаги разработки ФП

Фрагментированная программа разрабатывается в несколько последовательных этапов.

• Разработка исходного алгоритма решения задачи.

• Фрагментация исходного алгоритма. Фрагментация рассматривается здесь как универсальный способ распараллеливания алгоритмов, что позволяет поддержать его реализацию системой программирования (примеры фрагментации приведены в разделе 3). Фрагментация нередко является очень сложной работой. Например, фрагментация алгоритма прогонки [15] заняла 2 года и завершилась защитой кандидатской диссертации. На тестах получено ускорение исполнения алгоритма прогонки в 6000 раз на 8000 процессоров [15].

• Описание фрагментированной программы на языке LuNA. Входной язык системы LuNA устроен просто, в него в основном включены средства для определения множеств фрагментов данных и вычислений, синтаксис языка не очень интересен. Пример фрагментированной программы на языке LuNA можно видеть в разделе 3.1.

• Компиляция и анализ фрагментированного алгоритма. Генерация платформоориентированной фрагментированной программы.

• Исполнение фрагментированной программы.

3. Примеры фрагментированных алгоритмов

Несколько примеров поясняют технологию фрагментированного программирования и проблемы разработки системы LuNA.

3.1. Исходный алгоритм умножения квадратных матриц

На рис. 2 представлен исходный алгоритм умножения квадратных матриц. Вычисления проводятся по формулам:

N

сг,з = ^ х Ьл, 1

1=1

Так как множество функциональных термов хранить нехорошо, то в языке Ь^Л вместо множества функциональных термов определяются множества фрагментов вычислений и фрагментов данных, а нужные термы конструируются из них по мере необходимости алгоритмом вывода.

Рис. 2. Множество функциональных термов, представляющих исходный алгоритм

3.2. Фрагментированный алгоритм умножения квадратных матриц

В системе LuNA исходный алгоритм может быть запрограммирован как фрагмен-

N

тированный, т.е. каждая операция Qj = d\j объявлена фрагментом вычислений

1=1

(и будет реализоваться как независимый процесс программы), переменные ai, i, bij, ci j, dli j объявлены фрагментами данных. Но такая фрагментированная программа будет исполняться с большим замедлением, примерно с 1000 кратным, по сравнению с программой с использованием MPI из-за больших расходов на реализацию управления. Поэтому для численных алгоритмов, отличающихся высоко регулярностью, в процессе фрагментации проводится агрегация и переменных и операций. На рис. 3 представлена схема фрагментации алгоритма умножения матриц, которая показывает способ агрегации данных и вычислений, а на рис. 4 — фрагментированный алгоритм. Здесь:

к

Cu = Y, Ai,l х BL j , I,J = 1,2

L=1

Даже в таком простом примере, как алгоритм умножения матриц, информационные зависимости не определяют хорошего исполнения фрагментированной программы. Например, если для всех I и J выполнить сначала все, кроме K-го, фрагменты вычислений DL J = Ail Bl. j , а потом исполнить все K-ые фрагменты, то память вычислителя должна будет хранить все выработанные, но своевременно не потребленные,

ABC

1,1

Си

1Д 1,2 1,3

Ли.

1,1

2,1 Bl,j

ЗД

Рис. 3. Агрегация данных и фрагментов вычислений исходного алгоритма

Рис. 4. Фрагментированный алгоритм

промежуточные данные. Объем хранимых промежуточных данных в K раз большие, чем может понадобиться при хорошей организации вычислений. В результате будет ограничен размер решаемой задачи и замедлится исполнение программы. Поэтому основными задачами, решаемыми run-time системой, являются распределение ресурсов и выбор наиболее подходящего очередного фрагмента вычислений на исполнение.

В качестве переменных фрагментированной программы используются агрегаты переменных исходного алгоритма, составляющих подматрицы исходной матрицы. Аналогично, код фрагмента вычислений является агрегатом кодов операций исходного алгоритма. В системе LuNA конструируются программы, в которых размер фрагментов данных является входным параметром. Ниже в качестве примера приведена часть фрагментированной программы умножения матриц, записанная в языке LuNA: Множество фрагментов данных:

df a[i,k] := block(4*M*M) | i=0..K-1, k=0..K-1;

df b[k,j] := block(4*M*M) | k=0..K-1, j=0..K-1;

df c[i,j] := block(4*M*M) | i=0..K-1, j=0..K-1;

df d[i,j,k] := block(4*M*M) | i=0..K-1, j=0..K-1, k=0..K-1;

Множество фрагментов вычислений:

cf initc[i,j] := proc_zero<M,M>

| i=0..K-1, j=0..K-1, k=0..K-1;

Рис. 5. Фрагментация вычислений алгоритма ЬИ-разложения

3.3. ЬИ-разложение

ЬИ-разложение преобразует квадратную матрицу А по формулам ¡^

j-1 if i- \

^-i,kuk,j, ui,j = -j— I ai,j — E -i,kUkj] к виду A = LU, где:

k=i ^ V k=i /

ai,j —

L

/ i-1

I ai,j —

\ k=1

(-1,1 0

-2,1 -2,2

-3,1 -3,2

V"

0

0

-3,3

U

i 0 0

V

Ul,2 Ui,3

1 u2,3 0i

V

Матрица делится на фрагменты данных (рис. 5а), каждый фрагмент данных - подматрица матрицы А, для обработки каждого фрагмента данных формируется фрагмент вычислений. Фрагменты вычислений должны выполняться в следующем порядке (таковы информационные зависимости): вначале исполняется фрагмент (1,1), затем могут выполняться все фрагменты первого столбца и первой строки, затем может исполняться фрагмент (2, 2) и т.д. Информационные зависимости между фрагментами вычислений показаны на рис. 5Ь.

Этот порядок нехорош тем, что создает неравномерную нагрузку на вычислитель: есть моменты времени, когда только один фрагмент вычислений готов к исполнению, и есть моменты времени, когда много более одного фрагмента готовы исполняться. Лучше было бы организовать исполнение фрагментов вычислений по гиперплоскостями (рис. 6), при котором формируется более равномерная нагрузка процессоров вычислителя.

3.4. Неравномерность загрузки процессоров в модели эволюции облака пыли

Параллельная реализация модели эволюции протопланетного диска описана в [13, 14]. На рис. 7 показана неравномерность распределения нагрузки на узлы мультикомпьютера в процессе моделирования. Каждый прямоугольник изображает фрагмент вычислений и потребляемые им ресурсы. Динамическая балансировка нагрузки узлов вычислителя планируется run-time системой и реализуется миграцией фраг-

Рис. 6. Исполнение фрагментов вычислений гиперплоскостями

ментов вычислений с перегруженного узла на соседние, менее загруженные. На этом основана автоматическая реализация динамических свойств фрагментированной программы.

Рис. 7. Неравномерная нагрузка узлов вычислителя

Планирование, точный расчет балансировки нагрузки не делается, а моделируется физический процесс диффузии в жидких и/или газообразных средах. Средой здесь является множество фрагментов вычислений. Точный расчет балансировки нагрузки в условиях динамически меняющегося состояния системы взаимодействующих процессов фрагментированной программы не имеет смысла, и, как минимум, не технологичен.

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

Рис. 8. Качественный график времени исполнения фрагментированной программы

Фрагментированная программа исполнялась в одном узле, сравнение производилось с последовательной программой. На рисунке Т8ед - это время исполнения фрагментированной программы, состоящей из одного фрагмента, т.е. это время исполнения последовательной программы. Затем число фрагментов данных увеличивалось (соответственно, размер фрагментов данных уменьшался), при этом наблюдалось уменьшение времени исполнения программы. Минимальное время исполнения программы получалось, когда фрагмент вычислений со всеми обрабатывае-мыми им фрагментами данных попадал целиком в кэш-память. Увеличение времени исполнения программы начиналось с ростом числа фрагментов данных и вычислений, что приводило к увеличению накладных расходов на реализацию управления и динамического распределения ресурсов.

4. Язык и система фрагментированного программирования LuNA

Входной язык LuNA - теоретико-множественный, единственного присваивания и единственного исполнения фрагментов вычислений. Фрагменты данных и вычислений задаются рекурсивно перечислимыми множествами с использованием индексных выражений. Управление в LuNA-программе задается отношением частичного порядка на множестве фрагментов вычислений.

Отношение соседства на множестве фрагментов данных определяет, какие фрагменты данных должны размещаться в одном либо в соседних узлах. Дополнительно имеются операторы-рекомендации по распределению ресурсов вычислителя, по определению требуемого порядка исполнения фрагментов вычислений. Средства задания приоритетов исполнения фрагментов вычислений используются run-time системой для выбора наиболее подходящего фрагмента на исполнение.

Рис. 9. Компоненты системы LuNA

Функциональная структура системы фрагментированного программирования LuNA представлена на рис. 9. Язык, некоторые теоретические и технологические аспекты системы программирования LuNA описаны в ряде публикаций [10, 11].

LuNA имеет три уровня преобразования фрагментированного алгоритма в программу: Компиляция, Генерация и Исполнение:

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

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

• Run-time система принимает те решения, которые могут быть сделаны только динамически, в ходе вычислений. В их числе выбор фрагмента вычислений на исполнение, динамическая балансировка нагрузки узлов вычислителя, динамическое распределение ресурсов, включая назначение процессора для исполнения фрагмента вычислений и многое другое.

В системе LuNA есть еще один компонент — профилировщик, который собирает реальную информацию о ходе исполнения фрагментированной программы. Эта информация используется затем для улучшения последующих исполнений программы.

5. Родственные работы

Общее представление о работах, посвященных сборке программ из готовых фрагментов, дают проекты [5-8]. Проект Charm [5] за долгое время развития стал хорошо известной системой программирования. Ее основным недостатком является отсутствие глобальной оптимизации исполнения и не соответствующие входной язык и технология программирования, не позволяющие использовать в полной мере достоинства системы программирования, что свойственно и другим проектам.

Работа выполнена при частичной поддержке РФФИ, грант 10-07-00454-а. Литература

1. Вальковский, В.А. К уточнению понятия непроцедурности языков программирования / В.А. Вальковский, В.Э. Малышкин. // Кибернетика. - 1981. - №3. -

C. 55.

2. Вальковский, В.А. Синтез параллельных программ и систем на вычислительных моделях / В.А. Вальковский, В.Э. Малышкин. - Новосибирск: Наука. Сиб. отд-ние, 1988.

3. Kraeva, M.A. Assembly Technology for Parallel Realization of Numerical Models on MIMD-Multicomputers / M.A. Kraeva, V.E. Malyshkin. // International Journal on Future Generation Computer Systems. - 2001. - V. 17, № 6. - P. 755-765.

4. Malyshkin, V.E. Assembling of Parallel Programs for Large Scale Numerical Modeling. In Handbook of Research on Scalable Computing Technologies, ed. Kuan-Ching Li, Ching-Hsien Hsu, Laurence Tianruo Yang, Jack Dongarra and Hans Zima / V.E. Malyshkin. - IGI Global, 2010. - P. 295-311.

5. Charm++. URL: http://charm.cs.uiuc.edu/papers

6. ProActive Parallel Suite. URL: http://proactive.inria.fr

7. S-Net home page. URL: http://www.snet-home.org

8. Berzins, M. DAG-Based Software Frameworks for PDEs / M. Berzins, Q. Meng, J. Schmidt, J.C. Sutherland // Lecture Notes in Computer Science. - 2012. - V. 7155.

- P. 324-333.

9. Kireev, S. Fragmentation of numerical algorithms for parallel subroutines library / S. Kireev, V. Malyshkin // The Journal of Supercomputing. - 2011. - V. 57, № 2. -P. 161-171.

10. Kireev, S. The LuNA Library of Parallel Numerical Fragmented Subroutines /

S. Kireev, V. Malyshkin, H. Fujita // Lecture Notes in Computer Science. - 2011.

- V. 6873. - P. 290-301.

11. Malyshkin, V. Optimization Methods of Parallel Execution of Numerical Programs in the LuNA Fragmented Programming System / V. Malyshkin, V. Perepelkin // The Journal of Supercomputing. DOI: 10.1007/s11227-011-0649-6. - P. 1-14.

12. Клини, С. Введение в математику / С. Клини. - М.: Иностранная литература, 1957.

13. Киреев, С.Е. Параллельная реализация метода частиц в ячейках для моделирования задач гравитационной космодинамики / С.Е. Киреев // Автометрия. - 2006.

- №3. - C. 32-39.

14. Kireev, S.E. A Parallel 3D Code for Simulation of Self-gravitating Gas-Dust Systems / S.E. Kireev // Lecture Notes in Computer Science. - 2009. - V. 5698. - P. 406-413.

15. Terekhov, A.V. Parallel Dichotomy Algorithm for solving tridiagonal system of linear equations with multiple right-hand sides / A.V. Terekhov // Parallel Computing. -2010. - V. 36, № 8. - P. 423-438.

Виктор Эммануилович Малышкин, доктор технических наук, профессор, кафедра параллельных вычислений, Новосибирский национальный исследовательский государственный университет, кафедра параллельных вычислительных технологий, Новосибирский государственный технический университет, зав. лаб. синтеза параллельных программ, Институт вычислительной математики и математической геофизики СО РАН, malysh@ssd.sscc.ru.

FRAGMENTED PROGRAMMING TECHNOLOGY

V.E. Malyshkin, Novosibirsk State University

Shortly the technology of fragmented programming is presented. This technology is now under development in the Institute of Computational Mathematics and Mathematical Geophysics. Also the LuNA language and system of fragmented programming are presented. The technology is oriented to support the parallel implementation of the large scale numerical models in physics. The LuNA system provides automatically such dynamic properties of parallel programs as dynamic tuning of the program to all the available resources of a supercomputer, dynamic balancing of a workload, the computation organization to the new details of the model behavior.

Keywords: fragmented programming, numerical algorithms, large scale numerical models, parallel programming.

References

1. Valkovsky V.A., Malyshkin V.E. K utochneniju ponjatija neprocedurnosti jazykov programmirovanija [Clarifying the Term of Non-Procedural Languages]. Kibernetika [Cybernetics], 1981. No 3. P. 55.

2. Valkovsky V.A., Malyshkin V.E. Sintez parallel’nyh programm i sistem na vychislitel’nyh modeljah [Synthesis of Parallel Programs and Systems on the Basis of Computational Models]. Nauka, Novosibirsk, 1988.

3. Kraeva M.A., Malyshkin V.E. Assembly Technology for Parallel Realization of Numerical Models on MIMD-Multicomputers. International Journal on Future Generation Computer Systems. 2001. V. 17, No 6. P. 755-765.

4. Malyshkin V.E. Assembling of Parallel Programs for Large Scale Numerical Modeling. In Handbook of Research on Scalable Computing Technologies, ed. Kuan-Ching Li, Ching-Hsien Hsu, Laurence Tianruo Yang, Jack Dongarra and Hans Zima. IGI Global, 2010. P. 295-311.

5. Charm++. URL: http://charm.cs.uiuc.edu/papers

6. ProActive Parallel Suite. URL: http://proactive.inria.fr

7. S-Net home page. URL: http://www.snet-home.org

8. Berzins M., Meng Q., Schmidt J., Sutherland J.C. DAG-Based Software Frameworks for PDEs. Lecture Notes in Computer Science. 2012. V. 7155. P. 324-333.

9. Kireev S., Malyshkin V. Fragmentation of Numerical Algorithms for parallel subroutines library. The Journal of Supercomputing. 2011. V. 57, No 2. P. 161-171.

10. Kireev S., Malyshkin V., Fujita H. The LuNA Library of Parallel Numerical Fragmented Subroutines. Lecture Notes in Computer Science. 2011. V. 6873. P. 290301.

11. Malyshkin V., Perepelkin V. Optimization Methods of Parallel Execution of Numerical Programs in the LuNA Fragmented Programming System. The Journal of Supercomputing. DOI: 10.1007/s11227-011-0649-6. P. 1-14.

12. Kleene S.C. Introduction to Mathematics New York, D. Van Nostrand Company, Inc., 1952.

13. Kireev S.E. Parallel Implementation of the Particle-in-Cell Method for Gravitational Cosmodynamics Problem Modeling. Avtometriya, 2006. No 3. P. 32-39.

14. Kireev S.E. A Parallel 3D Code for Simulation of Self-gravitating Gas-Dust Systems. Lecture Notes in Computer Science. 2009. V. 5698. P. 406-413.

15. Terekhov A.V. Parallel Dichotomy Algorithm for solving tridiagonal system of linear equations with multiple right-hand sides. Parallel Computing. 2010. V. 36, № 8. P. 423438.

Поступила в редакцию 26 марта 2012 г.