Многие специалисты определяют параллельное программирование как технику программирования, при которой используются все преимущества многоядерных или многопроцессорных систем. При этом параллельное программирование является одним из методов параллелизма, наравне с распределенным программированием. В настоящее время по определенным техническим причинам стало невозможным увеличивать тактовую частоту процессора. Однако есть другой способ увеличения производительности – размещение нескольких ядер в процессоре, но это требует другого подхода в программировании.
Камерон Х., Трейси Х. написали книгу «Параллельное и распределенное программирование на С++», в которой рассмотрели принципы параллельного программирования, его преимущества и недостатки, а также реализацию на языке программирования C++ [1]. Понятие алгоритма, а также теоретические сведения о параллельных вычислениях были даны в книге авторов Бурова И.Г., Демьянович Ю.К. [2]. Корнеев В.В. дал представление о MPP-компьютерах и аспектах применения этих систем [3]. Воеводин В.В., Воеводин Вл.В. посвятили себя обсуждению ключевых проблем современных параллельных вычислений [4]. Давлеткалиев Р. в своей статье рассказал об основах параллельных вычислений и рассмотрел архитектуру современных вычислительных систем [5]. На сайте компании NVIDIA представлена информация о технологии CUDA [6]. Облачный сервис Playkey предоставляет возможность играть в компьютерные игры с использованием современных технологий распределенного программирования [7]. Плахотная Л.А. разработала методы организации самостоятельной работы студентов по курсу «Основы технологий параллельного программирования», в рамках которого было проведено данное исследование [8]. Очень часто технологии параллельного программирования применяются в организации систем баз данных [9].
Для того, чтобы создавать программное обеспечение, отвечающее современным требованиям, необходимо обладать практическими знаниями параллельного и распределенного программирования. Пользователь должен быть всегда уверен в надежности и мгновенности работы программы, поэтому к ней предъявляются очень жесткие требования по производительности. Современные компьютеры оснащены многоядерными процессорами, но ввиду отсутствия подходящего программного обеспечения это не имеет никакого смысла. Люди хотят использовать больше функций при работе за компьютером, притом одновременно. Например, писать доклад, слушать музыку и параллельно что-либо устанавливать. Для удовлетворения всех требований создаваемые программы должны быть более производительными и интеллектуальными, а программное обеспечение следует проектировать с тем учётом, чтобы можно было воспользоваться всеми преимуществами многопроцессорных систем.
Если несколько задач выполняются в течение одного и того же интервала времени, то они выполняются параллельно. Но это вовсе не значит, что задачи обязательно должны выполняться в один момент времени. Например, две задачи могут выполняться в течение одной секунды, но каждая из них будет выполняться в определенные доли секунды. Первая задача будет выполняться в первую десятую часть секунды, вторая во вторую десятую, затем снова первая в третью десятую секунды и так далее. Другими словами, здесь мы видим последовательное поочередное выполнение задач, но обе завершаются к концу секунды и так как для нас доли секунды не заметны и не играют роли, то нам кажется, что они выполняются параллельно. Именно таким способом выполняются задачи в однопроцессорной среде. В многопроцессорной среде при наличии свободных процессоров задачи выполняются параллельно в один и тот же момент времени. Цель параллелизма – обеспечить компьютеру все возможности для совершения большого объема работы за тот же интервал времени. Поэтому программное обеспечение должно создаваться, ориентируясь не на выполнение одной задачи, а на выполнение нескольких задач за некоторый промежуток времени. Также распараллеливание процессов позволяет достичь более простой и удобной структуры программы, организовав её в виде ряда небольших параллельно выполняемых операций.
Программное обеспечение, которое качественно спроектировано с учётом всех требований параллелизма, зачастую выполняется в разы быстрее, чем та же программа, но с последовательной архитектурой. Решение некоторых важных задач представляются в естественном виде коллекции параллельных задач. Данная особенность характерна для многих научных областей таких, как математическое и научное программирование, проектирование искусственного интеллекта. Для разработчика это значит снижение трудозатрат, так как технологии параллельного программирования позволяют напрямую реализовывать алгоритмы и структуры данных, созданных ранее учёными. Часто используют специальное оборудование, напичканное сотнями и даже тысячами процессорами, каждый из которых выполняет свою конкретную задачу, что позволяет достигнуть невероятной производительности вычислений.
В качестве примера можно привести видеокарты от компании NVIDIA, которые имеют продвинутую технологию параллельных вычислений CUDA. Данные видеокарты содержат в себе несколько тысяч ядер CUDA, каждое из которых производит параллельное вычисление. Платформа параллельных вычислений CUDA обеспечивает набор расширений для языков C и C++, которые позволяют работать как с параллелизмом данных, так и с параллелизмом задач. На сегодняшний день CUDA очень широко используется программистами, учёными и исследователями во многих областях, включая обработку видео и изображений, биологию и химию, симуляцию различных субстанций, таких, как вода, сейсмический анализ, трассировку лучей и многое другое.
Такие устройства называются MPP-компьютерами (Massively Parallel Processors) и с их помощью также можно моделировать экологическую систему, проводить исследования космического пространства, моделировать геном человека.
Применение подобных технологий параллельного программирования приводит к новым архитектурам программного обеспечения, которое специально разрабатывается для параллельных сред.
Существует ещё другой метод параллелизма – распределённое программирование. Этот метод позволяет воспользоваться компьютерными и программными ресурсами, размещенных в Интернете. Другими словами, можно сказать, что какая-то программа выполняется на удалённом компьютере и на компьютере пользователя, а затем сервер передаёт данные на компьютер, где они объединяются с локальными данными. Распределенное программирование в той или иной степени включает в себя сетевое программирование и подразумевает общение посредством сетевого соединения между программами клиента и сервера. Таким образом основным преимуществом данного метода является доступ к компьютерным ресурсам, которые могут находиться даже на другом континенте. При этом всё, что нужно обычному пользователю – иметь домашний компьютер или смартфон с необходимым программным обеспечением.
В этой сфере сейчас очень бурно развиваются облачные технологии. Их существует огромное множество, но в качестве примера приведем одну из них. Playkey – очень интересная облачная технология для потокового передачи видео, которая дарит возможность играть в самые технологичные компьютерные игры с любого устройства. Игра запускается на удалённом сервере, а пользователю транслируется видеопоток на его устройство. Таким образом игра использует ресурсы компьютера не пользователя, а удалённого сервера. Всё что нужно для работы – это стабильное Интернет-соединение. Также существуют множество облачных сервисов для хранения и получения доступа к данным: Google Drive, Dropbox, OneDrive и другие.
В базовой модели программирования все инструкции выполняются поочередно, то есть у каждой задачи есть порядок и каждая из них должна ожидать своей очереди. Такая линейная структура программы очень твердо закрепилась в умах многих разработчиков, что они даже не могут допустить другого положения вещей. Отсюда происходят различные проблемы при создании программного продукта ещё на стадии проектирования. Это один из главных недостатков на сегодняшний день и для того, чтобы исправить ситуацию, необходимо изменить парадигму мышления программиста. Ведь в мире параллельного программирования всё обстоит по-другому. Но даже в этом случае не исключаются проблемы при кодировании: параллельное программирование имеет ряд особенностей и трудностей и не всякий процесс можно распараллелить ввиду разного рода ограничений и требований. Вот основные проблемы, с которыми возможно придётся столкнуться при параллельном программировании:
- Гонка данных. Когда два процесса пытаются одновременно изменить общую область данных, создаётся некая неопределенность, и конечный результат будет зависеть от того, какая задача обратится к этой области данных первой.
- Бесконечная отсрочка. Одна или несколько задач ожидают связи от другой задачи до своего выполнения. Если такая связь между задачами не налажена, то задачи будут бесконечно ожидать завершения друг от друга.
- Взаимоблокировка. Может произойти при параллельно выполняемых задачах, имеющих общий доступ к данным. Возможно ситуация, при которой каждая из задач будет ожидать пока другая не освободит доступ к данным.
- Организация связи. Порой бывает очень трудно наладить связь между задачами, если они выполняются на компьютерах различных типов (разные операционные системы, технологии и языки программирования), что делает поиск и обработку ошибок ещё сложнее.
- Отказ оборудования. Если какие-то процессоры дадут сбой, то возникает проблема, при которой необходимо решить, как будут вести себя другие процессоры, чтобы не прекращать работу программы.
- Излишний параллелизм. Выражение «чем больше процессоров, тем лучше» не соответствует действительности. Организация синхронизации всех процессоров при их большом количестве может показаться затруднительной. Поэтому в каждом конкретном случае необходимо выявить оптимальное количество процессоров, чтобы не навредить быстродействию работы.
Таким образом в подведение итогов еще раз кратко рассмотрим основные преимущества и недостатки параллельного программирования.
Преимущества:
- возможность выполнения нескольких задач в один момент времени;
- более высокая скорость работы приложений;
- простая и удобная структура программы.
Недостатки:
- трудности для новичков, связанные с иным типом мышления при программировании;
- неопределенность приоритета задач;
- трудности взаимосвязи между задачами;
- взаимоблокировка задач;
- проблемы при отказе оборудования;
- необходимость подбора оптимального количества процессоров.
Несомненно, параллельное программирование является интенсивно развивающейся областью компьютерных наук и позволяет с большей эффективностью создавать высокопроизводительные системы, разрабатывать качественно новые архитектуры аппаратных средств и структурировать программный код при проектировании. Однако существует ряд минусов, касающихся технической стороны, которые могут отпугнуть начинающих программистов. Поэтому важно на сегодняшний день изменить парадигму мышления программиста в сторону параллелизма, чтобы избежать разного рода недоразумений при создании программного обеспечения. Для этого следует создавать современные и эффективные методики обучения по дисциплинам связанными с параллельным программированием.
Библиографический список
- Камерон Х., Трейси Х. Параллельное и распределенное программирование на С++. М.: Вильямс, 2004. 672 с.
- Бурова И.Г., Демьянович Ю.К. Алгоритмы параллельных вычислений и программирование. СПб.: СПбГУ, 2007. 208 с.
- Корнеев В.В. Параллельные вычислительные системы. М.: Нолидж, 1999. 320 с.
- Воеводин В.В., Воеводин Вл.В. Параллельные вычисления. СПб.: ВХВ-Петербург, 2002. 608 с.
- Введение в параллельные вычисления // Habrahabr URL: https://habrahabr.ru/post/126930/ (дата обращения: 24.04.2016).
- Параллельные вычисления CUDA | Что такое CUDA? | NVIDIA // NVIDIA URL: http://www.nvidia.ru/object/cuda-parallel-computing-ru.html (дата обращения: 01.05.2016).
- Playkey | игры онлайн // PLAYKEY URL: http://playkey.net/ (дата обращения: 01.05.2016).
- Плахотная Л. А. Организация самостоятельной работы студентов специальности «Информатика» в рамках курса по выбору «Основы технологии параллельного программирования» // Актуальные вопросы методики преподавания математики и информатики: сборник научных трудов третьей Международной научно-практической конференции, 16 апреля 2008 г. Биробиджан: Изд-во ДВГСГА, 2008. С. 113-116.
- Плахотная Л.А., Бондаренко В.В. О технологиях организации интерфейса к базе данных // Современная техника и технологии. 2015. № 6