В вычислении, параллельная модель программирования является абстракцией из параллельной компьютерной архитектуры, с которой удобно выразить алгоритмы и их состав в программах. О ценности модели программирования можно судить по ее общности: насколько хорошо может быть выражен ряд различных проблем для множества различных архитектур, и по ее производительности: насколько эффективно могут выполняться скомпилированные программы. Реализация модели параллельного программирования может принимать форму библиотеки, вызываемой из последовательного языка, как расширение существующего языка или как совершенно новый язык.
Консенсус по поводу конкретной модели программирования важен, потому что он приводит к созданию различных параллельных компьютеров с поддержкой этой модели, тем самым облегчая переносимость программного обеспечения. В этом смысле модели программирования называют мостом между аппаратным и программным обеспечением.
Классификации моделей параллельного программирования можно условно разделить на две области: взаимодействие процессов и декомпозиция проблемы.
Взаимодействие процессов относится к механизмам, с помощью которых параллельные процессы могут взаимодействовать друг с другом. Наиболее распространенными формами взаимодействия являются разделяемая память и передача сообщений, но взаимодействие также может быть неявным (невидимым для программиста).
Общая память - эффективное средство передачи данных между процессами. В модели с общей памятью параллельные процессы совместно используют глобальное адресное пространство, которое они читают и записывают в асинхронном режиме. Асинхронный параллельный доступ может привести к состояниям гонки, и для их предотвращения можно использовать такие механизмы, как блокировки, семафоры и мониторы. Обычные многоядерные процессоры напрямую поддерживают разделяемую память, для использования которой предназначены многие языки и библиотеки параллельного программирования, такие как Cilk, OpenMP и Threading Building Blocks.
В модели передачи сообщений параллельные процессы обмениваются данными, передавая сообщения друг другу. Эти коммуникации могут быть асинхронными, когда сообщение может быть отправлено до того, как получатель будет готов, или синхронным, когда получатель должен быть готов. Формализация передачи сообщений « Последовательные процессы связи» (CSP) использует синхронные каналы связи для соединения процессов и привела к появлению таких важных языков, как Occam, Limbo и Go. Напротив, модель акторов использует асинхронную передачу сообщений и использовалась при разработке таких языков, как D, Scala и SALSA.
В неявной модели программисту не видно взаимодействия с процессами, и вместо этого компилятор и / или среда выполнения несут ответственность за его выполнение. Два примера неявного параллелизма относятся к предметно-ориентированным языкам, где предписывается параллелизм в рамках высокоуровневых операций, и к функциональным языкам программирования, поскольку отсутствие побочных эффектов позволяет независимым функциям выполняться параллельно. Однако этим типом параллелизма сложно управлять, и такие функциональные языки, как Concurrent Haskell и Concurrent ML, предоставляют функции для явного и правильного управления параллелизмом.
Параллельная программа состоит из одновременно выполняющихся процессов. Декомпозиция проблемы связана со способом формулирования составляющих процессов.
Модель с параллельными задачами фокусируется на процессах или потоках выполнения. Эти процессы часто отличаются поведенческими особенностями, что подчеркивает необходимость общения. Параллелизм задач - естественный способ выразить коммуникацию с передачей сообщений. В таксономии Флинна параллелизм задач обычно классифицируется как MIMD / MPMD или MISD.
Модель с параллельными данными фокусируется на выполнении операций с набором данных, обычно с регулярно структурированным массивом. Набор задач будет работать с этими данными, но независимо от непересекающихся разделов. В таксономии Флинна параллелизм данных обычно классифицируется как MIMD / SPMD или SIMD.
Как и в случае неявного взаимодействия процессов, неявная модель параллелизма ничего не раскрывает программисту, поскольку за это несут ответственность компилятор, среда выполнения или оборудование. Например, в компиляторах автоматическое распараллеливание - это процесс преобразования последовательного кода в параллельный, а в компьютерной архитектуре суперскалярное выполнение - это механизм, посредством которого параллелизм на уровне команд используется для параллельного выполнения операций.
Модели параллельного программирования тесно связаны с моделями вычислений. Модель параллельных вычислений - это абстракция, используемая для анализа стоимости вычислительных процессов, но она не обязательно должна быть практичной, поскольку ее можно эффективно реализовать в аппаратном и / или программном обеспечении. Модель программирования, напротив, конкретно подразумевает практические аспекты аппаратной и программной реализации.
Язык параллельного программирования может быть основан на одной или на комбинации моделей программирования. Например, высокопроизводительный Fortran основан на взаимодействии с разделяемой памятью и декомпозиции проблемы параллельных данных, а Go обеспечивает механизм взаимодействия с разделяемой памятью и передачей сообщений.
Имя | Класс взаимодействия | Класс разложения | Примеры реализации |
---|---|---|---|
Актерская модель | Асинхронная передача сообщений | Задача | D, Erlang, Scala, SALSA |
Массовая синхронная параллель | Общая память | Задача | Apache Giraph, Apache Hama, BSPlib |
Связь последовательных процессов | Синхронная передача сообщений | Задача | Ада, Оккам, VerilogCSP, Go |
Схемы | Передача сообщений | Задача | Verilog, VHDL |
Поток данных | Передача сообщений | Задача | Lustre, TensorFlow, Apache Flink |
Функциональный | Передача сообщений | Задача | Параллельный Haskell, Параллельный ML |
Машина LogP | Синхронная передача сообщений | Не указано | Никто |
Параллельная машина с произвольным доступом | Общая память | Данные | Cilk, CUDA, OpenMP, стандартные блоки потоков, XMTC |