15 minute read
Прядко С. А., Трошин А. Ю., Козлов В. Д., Иванов А. Е
from radioprom032020
by bortnikova
ISSN 2413–9599 (Print) ISSN 2541–870Х (Online)
DOI: 10.21778/2413-9599-2020-30-3-28-33 УДК 004.272+004.41
Advertisement
www.radioprom.org
1 ФГАОУ ВО «РГУ нефти и газа (НИУ) имени И. М. Губкина», Москва, Россия 2 ФГБОУ ВО «МИРЭА – Российский технологический университет», Москва, Россия 3 АО «Научно-исследовательский институт вычислительных комплексов им. М. А. Карцева», Москва, Россия
В статье описываются различные возможности ускорения расчетов на вычислительных комплексах. Эти возможности тесно связаны с архитектурой таких комплексов. Целью работы является предоставление информации, необходимой при выборе возможности ускорения процесса решения вычислительной задачи. Приводится описание основных возможностей, реализуемых с помощью следующих моделей: программирование в системах с общей памятью, программирование в системах с распределенной памятью и программирование на графических ускорителях (видеокартах). Излагается основная концепция, принципы, достоинства и недостатки каждой из рассматриваемых моделей программирования. Все стандарты написания программ, описанные в статье, возможно использовать в операционных системах как семейства Linux, так и Windows. Необходимые библиотеки доступны и совместимы с языком программирования C/C++. В заключении статьи даются рекомендации по использованию той или иной технологии в зависимости от типа задачи, которую необходимо решить.
Ключевые слова: параллельные вычисления, поток, OpenMP, MPI, CUDA, OpenCL
Для цитирования: Параллельные технологии программирования на вычислительных комплексах / С. А. Прядко, А. Ю. Трошин, В. Д. Козлов, А. Е. Иванов // Радиопромышленность. 2020. Т. 30, № 3. С. 28–33. DOI: 10.21778/2413-9599-2020-30-3-28-33
© Прядко С. А., Трошин А. Ю., Козлов В. Д., Иванов А. Е., 2020
S.A. Pryadko 1 , A. Yu. Troshin 2 , V.D. Kozlov 2 , A.E. Ivanov 3
1 National University of Oil and Gas «Gubkin University», Moscow, Russia 2 MIREA – Russian Technological University, Moscow, Russia 3 M. A. Kartsev Scientific and Research Institute of Computing Systems, Moscow, Russia
The article describes various options for speeding up calculations on computer systems. These features are closely related to the architecture of these complexes. The objective of this paper is to provide necessary information when selecting the capability for the speeding process of solving the computation problem. The main features implemented using the following models are described: programming in systems with shared memory, programming in systems with distributed memory, and programming on graphics accelerators (video cards). The basic concept, principles, advantages, and disadvantages of each of the considered programming models are described. All standards for writing programs described in the article can be used both on Linux and Windows operating systems. The required libraries are available and compatible with the C/C++ programming language. The article concludes with recommendations on the use of a particular technology, depending on the type of task to be solved.
Keywords: parallel computing, thread, OpenMP, MPI, CUDA, OpenCL
For citation: Pryadko S. A., Troshin A. Y., Kozlov V. D., Ivanov A. E. Parallel programming technologies on computer complexes. Radio industry (Russia), 2020, vol. 30, no. 3, pp. 28–33. (In Russian). DOI: 10.21778/2413-9599-2019-30-3-28-33
Введение
Ежегодно общемировой объем данных увеличивается на тысячи эксабайт. Согласно прогнозам компаний Seagate Technology и International Data Corporation, к 2025 году глобальный объем информации составит 163 зеттабайт [1]. Около трети всех данных уже сейчас нуждаются в обработке в режиме реального времени, а в ближайшем будущем порядка 60% данных будет производиться и обрабатываться коммерческими предприятиями. В условиях новой реальности для работы с постоянно увеличивающимся объемом данных необходимо использовать современные технологии программирования. Особое место среди них занимают технологии параллельного программирования, развитие которых тесно сопряжено с развитием техники. Технологии предназначены для организации взаимодействия между связанными процессами, объединенными в группу и протекающими одновременно. Это взаимодействие включает в себя как обмен данными (прием-передача), так и синхронизацию взаимодействующих процессов во времени, а также мониторинг текущего состояния и длительности процессов.
Параллельное программирование позволяет эффективно повысить производительность реализуемого программного обеспечения. При этом важно выбрать наиболее подходящий из имеющихся способ распараллелить программу для обеспечения максимального быстродействия. Значимый прирост быстродействия и более рациональное использование ресурсов вычислительной машины особенно важны при сложных вычислениях в области космических исследований, расшифровки генома человека, прогнозирования погоды, криптографии и других областях.
Программирование на системах с общей памятью
В настоящее время одной из наиболее широко применяемых технологий для организации параллельных вычислений является программирование на системах с общей памятью. Системы с общей памятью в общем виде представляют собой модель параллельной машины, с произвольным доступом к памяти – PRAM-модель (Parallel Random Access Machine) [2]. Такая модель вычислений может быть организована с использованием стандартных средств операционной системы, таких как процесс и поток, или высокоуровневых средств параллельного программирования, использующих многопоточность или популярную технологию OpenMP. Понятие общей памяти подразумевает наличие ресурса памяти, совместно используемого и распределяемого всеми процессорами, которые присутствуют в системе.
Для параллельного программирования используется механизм создания множества потоков, для
которых не выделено отдельное адресное пространство, но которые также распределяются по процессорам. Это одно из основных преимуществ при вычислениях на данных системах, поскольку в виду того, что данные расположены в общей памяти, нет необходимости в операциях передачи сообщений, дублировании пользовательских массивов, системных и пользовательских буферов и, как следствие, достигается большая эффективность. При использовании технологии OpenMP весь текст программы разбивается на параллельные и последовательные секции. Параллелизм поддерживается благодаря модели fork-join (ветвления и объединения). Потоки запускаются одновременно, но выход из параллельной секции возможен только при завершении всех потоков, кроме главного (master-потока). Такой подход называется параллелизмом «пульсирующего» или «вилочного» типа. Однако следует помнить, что операции синхронизации и инициализации потоков весьма трудоемки и по сложности выполнения сопоставимы с выполнением тысяч арифметических операций. При создании параллельных секций необходимо учитывать трудоемкость порождения потоков и использовать их только при существенном преобладании временного выигрыша над затратами. Распределение и стабилизация вычислительной мощности принципиально важны для получения максимально эффективного выполнения параллельной программы и ее ускорения.
Одно из немаловажных достоинств технологии OpenMP – это возможность реализации поэтапного (инкрементального) распараллеливания программ при этом без переработки их структуры [3]. Таким образом, эффективное использование потенциала систем с общей памятью возможно без осуществления каких-либо трудоемких процессов передачи сообщений, а также возможен перенос программы между различными компьютерными системами. Переносимость связана прежде всего с моделью программирования OpenMP, которая предоставляет независимый кроссплатформенный набор директив для компилятора (в меру кроссплатформенности языков C/C++/Fortran), библиотеки функций и переменных среды, которые в явном виде указывают компилятору, как организовать параллелизм в приложении. Распараллеливание требует минимальных изменений существующего кода. Программист при этом не обременен возможными дополнительными трудностями, связанными с созданием, синхронизацией, компенсацией нагрузки и прерыванием потоков. Немаловажен тот факт, что технологию OpenMP активно поддерживают ведущие игроки отрасли (AMD, IBM, Intel, HP, Nvidia, Oracle), что открывает хорошие перспективы для развития.
Однако у OpenMP имеется и ряд недостатков. Главный из них – OpenMP рассчитан прежде всего на мультипроцессоры и DSM-компьютеры, вследствие чего значительно ограничена область его применения. Также недостатками являются и сложность поиска и исправления ошибок, сложность выражения многоуровневого параллелизма программы, синхронизации вычислений и гонки потоков, плохо развитые средства отладки и обработки штатных ошибок.
Программирование на системах с распределенной памятью
Первоначально разработка систем с распределенной памятью решала задачу преодоления лимитов и ограничений, свойственных системам с общей памятью. Для систем с распределенной памятью характерна независимость работы процессоров друг от друга, вычислительная нагрузка распределена, и организован обмен данными между ними. Наилучшим решением для работы в вычислительных системах с распределенной памятью является MPI – message passing interface (интерфейс передачи сообщений). MPI – это наиболее распространенная технология программирования для объединенных вычислительных систем (кластерных) и систем с распределенной памятью [4]. Данный интерфейс основан на идеологии обмена сообщениями между параллельным процессами и имеет большое количество независимых реализаций. Сообщение – это некий набор атрибутов, среди которых, в частности, есть идентификатор процесса-отправителя, тег сообщения, идентификатор процесса-получателя. Все процессы могут выполняться на разных процессорах, каждый процесс имеет свое адресное пространство, а количество процессов определяется в момент запуска (в MPI-2 реализована возможность динамического добавления). Процессы объединяются в группы, внутри группы все процессы пронумерованы. С каждой группой ассоциирован свой коммуникатор. При передаче сообщения необходимо указать коммуникатор, для которого производится эта пересылка. Группы процессов можно создавать произвольно, допустимо полное или частичное совпадение, пересечение или его отсутствие, а также при необходимости возможно создание глобального коммуникатора для передачи данных между процессами разных групп. Сообщения, переданные через разные коммуникаторы, не сталкиваются друг с другом и не мешают выполнению программы.
Существует два режима выполнения – MPMD (Multiple Program Multiple Data) и SPMD (Single Program Multiple Data) [5]. MPMD характеризуется возможностью использования различных исходных кодов для процессов параллельного приложения, SPMD, в свою очередь, предполагает единый исходный код для каждого процесса. Данный стандарт
представлен набором спецификаций на языках, таких как C, C++ и Fortran. В MPI существует два вида взаимодействия процессов – это «точка-точка» («point-to-point») и коллективное взаимодействие. При использовании функции «point-to-point» в передаче сообщений участвует пара процессов, обмен производится между отправителем и получателем сообщений одного коммуникатора. Данный вид передачи гарантирует сохранение порядка сообщений от каждого процесса-отправителя, однако имеет продолжительное ожидание приема и отправки сообщений. Поскольку никаких общих данных или переменных нет, это – единственный способ взаимодействия. В свою очередь коллективное взаимодействие предполагает участие одновременно всех процессов коммуникатора, значения параметров должны быть одинаковы во всех процессах, исключением являются адреса буферов.
Несомненно, MPI предоставляет огромный функционал для разработчика, библиотека содержит более 120 функций и процедур, реализован удобный, переносимый и эффективный стандарт передачи сообщений [6]. Несмотря на большое количество преимуществ, стандарт имеет значительное число недостатков. Во-первых, это трудоемкость программирования: использование MPI значительно усложняет внутреннюю структуру приложения, возникает необходимость контроля обмена сообщений, распределения массивов и витков циклов. Программисты часто сравнивают такое детальное управление процессами с низкоуровневым написанием машинного кода. Также отсутствует поддержка объектно-ориентированного подхода, отладка крайне затруднительна, отсутствуют механизмы установки первоначального позиционирования процессов по процессорам.
Программирование на видеокартах
Технология программирования на видеокартах была разработана ввиду замедления роста скорости выпускаемых процессоров, а также нерешенной проблемы обеспечения оптимальной рабочей температуры процессоров. Далеко не каждую задачу можно распараллелить на кластерной вычислительной системе, поэтому вычисление на видеокартах считается весьма неплохой альтернативой для повышения производительности вычислительных операций, которые нужно выполнить. Производство видеокарт идет по принципиально иному пути, отличному от производства процессоров: наращивается не мощность процессоров, а их количество. Графический процессор (graphics processing unit, GPU) состоит из тысячи однородных ядер с общей памятью работающих на небольшой частоте [7]. Работа GPU по умолчанию параллельна, он максимизирует производительность группы потоков, которые, в свою очередь, имеют общий кэш и быструю разделяемую память, переключение между потоками происходит молниеносно. То, на что центральный процессор тратит сотню тактов, графический процессор способен выполнить за один такт ввиду большого количества ядер. Также основным отличием от центрального процессора (central processing unit – CPU) является небольшая кэш-память и оперативная память с высокой пропускной способностью и высокой латентностью. На GPU хорошо распараллеливаются: задачи, которые имеют параллелизм по данным, то есть имеют одну и ту же последовательность одинаково сложных вычислений, применяемую к разным данным; задачи, которые не имеют потребности глобальной синхронизации; задачи, в которых число арифметических операций соизмеримо выше необходимости постоянного доступа к памяти.
С развитием технологии вычислений на GPU, были разработаны и анонсированы платформы CUDA (Compute Unified Device Architecture) от NVIDIA, а затем и OpenCL (Open Computing Language) от Apple. Благодаря CUDA вычислительные задачи в области медицины, астрофизики, криптографии, искусственного интеллекта, молекулярной динамики и многих других важных областях человеческой жизни стали решаться быстрее в десятки и сотни раз. Технология CUDA [8] основана на программно-аппаратной архитектуре параллельных вычислений, включающей описание вычислительного параллелизма и иерархичной структуры памяти. CUDA-SDK представляет собой кроссплатформенную систему компиляции программ, написанных на C, C++ и Fortran, что обеспечивает оптимизированное выполнение определенной программной части на GPU, а другой программной части – на CPU. Данная технология организует доступ к набору инструкций видеокарты и управляет ее памятью при организации параллельных вычислений. Программирование CUDA подобно OpenMPпрограммированию: оно требует хорошего понимания организации памяти, но сложность разработки и переноса вычислений на CUDA сильно зависит от реализуемого приложения. В последнее время с выходом новых версий CUDA наблюдается тенденция постепенного превращения GPU в самостоятельное автономное устройство, которое способно заменить обычный CPU за счет внедрения CPUядра в сам GPU (обладающего хорошей энергоэффективностью и высокой производительностью). По сравнению с традиционным подходом к параллельным вычислениям, CUDA имеет ряд значительных преимуществ, например аппаратную поддержку целочисленных и битовых операций, более эффективный обмен данных между CPU и GPU, линейную адресацию памяти и возможность записи
по произвольным адресам памяти, и, конечно же, доступ к «shared memory». «Shared memory» – память, разделяемая между потоками, которая позволяет организовать кэш с более широкой полосой пропускания, чем при выборке из обычных текстур. Из основных ограничений и слабых мест CUDA стоит отметить отсутствие поддержки рекурсии во всех функциях, закрытую архитектуру и минимальную ширину блока в 32 потока. Тем не менее, CUDA занимает достойное место среди технологий программирования на видеокартах и особенно пришлась по вкусу ученым в исследовательской деятельности – алгоритмическая оптимизация и четкое следование правилам параллельного программирования на CUDA позволило им получить 100-кратный прирост в вычислениях. OpenCL – аналог CUDA, но от другого разработчика. Принципы работы остаются такими же [9, 10]. Из преимуществ технологии OpenCL стоит отметить: поддержку широкого класса вычислительных устройств; переносимость вычислительных программ и программного кода на широком классе устройств и платформ. К слабым сторонам данной технологии можно отнести отсутствие указателей на функции, отсутствие поддержки рекурсии во всех функциях и отсутствие поддержки битовых полей.
Выводы
В современном мире наблюдается следующая тенденция: количество данных, которое нужно обработать, растет и растет, а время на обработку уменьшается. Именно эта тенденция стимулирует развитие техники и возможностей ее использования. Некоторые из таких возможностей (параллельные технологии) были описаны в данной работе. Эти технологии находят свое применение во многих областях, а их использование уже показало неплохие результаты. В областях, где необходимо обработать массив независимых данных, удобно использовать все описанные технологии распараллеливания, и выбор обуславливается технической возможностью и временными рамками. Если количество информации, которое необходимо пересылать при использовании MPI, велико, то от данного способа распараллеливания стоит отказаться, так как слишком большие временные затраты уйдут на пересылку сообщений. Использовать графические ускорители необходимо при описанных ограничениях, что является неудобным в программах со сложной структурой, в которой много блоков малой трудоемкости. В задачах со множеством однотипных операций и большим объемом обрабатываемой информации GPU принесут большую выгоду.
В АО «НИИВК им. М. А. Карцева» ведется разработка и проектирование вычислительных комплексов для ряда задач обработки информации. Созданные вычислительные комплексы помимо основных задач используются для обучения студентов современным компьютерным технологиям. Эти комплексы могут содержать как графические ускорители (некоторые модели GPU могут использоваться только для вычислений и не предназначены для работы с графикой, несмотря на высокую мощность) наряду с мощными процессорами, так и комплексы из вычислительных модулей высокой производительности.
Параллельные технологии программирования могут использоваться и параллельно (например, часть расчетов отправляется на GPU, в то время как параллельно CPU решает другие задачи, или синхронизацию данных между модулями обеспечивает MPI, а обработку – OpenMP), что увеличивает возможности программирования, вычислительные мощности и спектр решаемых задач. Несмотря на обширный инструментарий для распараллеливания, задача созданий новых методов распараллеливания, архитектур вычислительных комплексов и библиотек для программирования является актуальной на сегодняшний день и будет оставаться такой и в будущем.
СПИСОК ИСПОЛЬЗОВАННЫХ ИСТОЧНИКОВ
1. Reinsel D., Gantz J., Rydning J. The Digitization of the World [Электронный ресурс]. URL: https://www.seagate.com/files/ www-content/our-story/trends/files/idc-seagate-dataage-whitepaper.pdf (дата обращения: 06.07.2020). 2. Ежова Н. А., Соколинский Л. Б. Обзор моделей параллельных вычислений // Вестник ЮУрГУ. 2019. № 3. С. 58–91. 3. Антонов А. С. Параллельное программирование с использованием технологии OpenMP. М.: МГУ, 2009. 77 c. 4. Антонов А. С. Параллельное программирование с использованием технологии MPI. М.: Национальный Открытый
Университет «ИНТУИТ», 2016. 84 с. 5. Копысов С. П., Новиков А. К. Промежуточное программное обеспечение параллельных вычислений. Ижевск: Удмуртский университет. 2012. 140 с. 6. Малявко А. А. Параллельное программирование на основе технологий OpenMP, MPI, CUDA. М.: Юрайт, 2018. 115 с. 7. Боресков А. В., Харламов А. А., Марковский Н. Д. Параллельные вычисления на GPU. Архитектура и программная модель CUDА. М.: МГУ, 2012. 336 с. 8. Сандерс Дж., Кэндрот Э. Технология CUDA в примерах: введение в программирование графических процессоров.
М.: ДМК Пресс, 2013. 232 с. 9. Антонюк В. А. OpenCL. Открытый язык для параллельных программ. М.: МГУ, 2017. 88 с. 10. Бастраков С. И. Программирование на OpenCL. [Электронный ресурс]. URL: https://docplayer.ru/37490743-
Programmirovanie-na-opencl.html (дата обращения: 06.07.2020).
1. Reinsel D., Gantz J., Rydning J. The Digitization of the World. Available at: https://www.seagate.com/files/www-content/ourstory/trends/files/idc-seagate-dataage-whitepaper.pdf (accessed 06.07.2020). 2. Ezhova N. A., Sokolinsky L. B. Survey of Parallel Computation Models. Vestnik JuUrGU. 2019, no. 3, pp. 58–91 (in Russian). 3. Antonov A. S. Parallelnoe programmirovanie s ispolzovaniem tehnologii OpenMP [Parallel programming using OpenMP technology]. Moscow, MGU Publ., 2009, 77 p. (In Russian). 4. Antonov A. S. Parallelnoe programmirovanie s ispolzovaniem tehnologii MPI [Parallel programming using MPI technology].
Moscow, Natsionalnyj Otkrytyj Universitet «INTUIT» Publ., 2016, 84 p. (In Russian). 5. Kopysov S. P., Novikov A. K. Promezhutochnoe programmnoe obespechenie parallel’nyh vychislenij [Parallel computing of middleware]. Izhevsk, Udmurtskii universitet Publ., 2012, 140 p. (In Russian). 6. Malyavko A. A. Parallelnoe programmirovanie na osnove tekhnologii OpenMP, MPI, CUDA [Parallel programming based on
OpenMP, MPI, CUDA technology]. Moscow, Yurait Publ., 2018, 115 p. (In Russian). 7. Boreskov А. V., Kharlamov А. А., Markovskij N. D. Parallelnye vychisleniya na GPU. Аrkhitektura i programmnaya model
CUDA [Parallel computing on GPU. Architecture and program model CUDA]. Moscow, MGU Publ., 2012, 336 p. (In Russian). 8. Sanders Dzh., Kendrot E. Tekhnologiya CUDA vprimerakh: vvedenie vprogrammirovanie graficheskikh protsessorov [CUDA
Technology in examples: introduction in GPU programming]. Moscow, DMK Press Publ., 2013, 232 p. (In Russian). 9. Аntonyuk V. А. OpenCL. Otkrytyjyazykdlya parallelnykh programm [OpenCL. Open language for parallel programs]. Moscow,
MGU Publ., 2017, 88 p. (In Russian). 10. Bastrakov S. I. OpenCL programming (In Russian). Available at: https://docplayer.ru/37490743-Programmirovanie-na-opencl. html (accessed 06.07.2020).
ИНФОРМАЦИЯ ОБ АВТОРАХ
Прядко Сергей Александрович, к.т.н., доцент, ФГАОУ ВО «Российский государственный университет нефти и газа (НИУ) имени И.М. Губкина», 119991, Москва, Ленинский пр-т, д.65, к. 1, тел.: +7 (903) 590-27-71, e-mail: sergeypryadko@gmail.com, ORCID: 0000-0002-7780-1442. Трошин Алексей Юрьевич, студент, ФГБОУ ВО «МИРЭА – Российский технологический университет», 119454, Москва, пр-т Вернадского, д. 78, тел.: +7 (925) 332-11 -93, e-mail: dubintrosh@gmail.com. Козлов Вадим Дмитриевич, студент, ФГБОУ ВО «МИРЭА – Российский технологический университет», 119454, Москва, пр-т Вернадского, д. 78, тел.: 8 (977) 267-16-36, e-mail: brus.96@yandex.ru. Иванов Александр Евгеньевич, инженер-программист, АО «Научно-исследовательский институт вычислительных комплексов им. М. А. Карцева», 117437, Москва, ул. Профсоюзная, д. 108, тел.: +7 (916) 098-15-66, e-mail: al2ivanov@yandex.ru.
AUTHORS
Sergey A. Pryadko, Ph.D. (Engineering), assistant professor, National University of Oil and Gas «Gubkin University», 65, Leninsky prospekt, 119991, Moscow, Russia, tel.: +7 (903) 590-27-71, email: sergeypryadko@gmail.com, ORCID: 0000-0002-7780-1442. Aleksey Yu. Troshin, student, MIREA – Russian Technological University, 78, Prospekt Vernadskogo, Moscow, 119454, Russia, tel.: +7 (925) 332-11 -93, e-mail: dubintrosh@gmail.com. Vadim D. Kozlov, student, MIREA – Russian Technological University, 78, Prospekt Vernadskogo, Moscow, 119454, Russia, tel.: +7 (977) 267-16-36, e-mail: brus.96@yandex.ru. Aleksandr E. Ivanov, software development engineer, M. A. Kartsev Scientific and Research Institute of Computing Systems, 108, Profsoyuznaya ulitsa, Moscow, 117437, Russia, tel.: +7 (916) 098-15-66, email: al2ivanov@yandex.ru.
Поступила 18.03.2020; принята к публикации 06.04.2020; опубликована онлайн 07.09.2020. Submitted 18.03.2020; revised 06.04.2020; published online 07.09.2020.