Введение

Абстракция параллельной компьютерной архитектуры

В вычислительной технике модель параллельного программирования является абстракцией параллельной компьютерной архитектуры, позволяющей удобно выражать алгоритмы и их композицию в программах. Ценность модели программирования оценивается по ее универсальности – насколько хорошо широкий спектр различных задач может быть представлен для различных архитектур, и по ее эффективности – насколько эффективно могут выполняться скомпилированные программы. Реализация модели параллельного программирования может быть представлена в виде библиотеки, вызываемой из языка программирования, или в качестве расширения существующего языка. Достижение консенсуса в отношении конкретной модели программирования важно, поскольку это приводит к созданию различных параллельных компьютеров с поддержкой этой модели, что облегчает переносимость программного обеспечения. В этом смысле модели программирования выступают в качестве связующего звена между аппаратным и программным обеспечением.

Классификация моделей параллельного программирования

Классификации моделей параллельного программирования можно разделить на две основные области: взаимодействие процессов и декомпозиция задач.

Взаимодействие процессов

Взаимодействие процессов относится к механизмам, посредством которых параллельные процессы могут взаимодействовать друг с другом. Наиболее распространенные формы взаимодействия — разделяемая память и передача сообщений, однако взаимодействие может быть также неявным (невидимым для программиста).

Общая память

Общая память — эффективный способ передачи данных между процессами. В модели разделяемой памяти параллельные процессы используют общее глобальное адресное пространство, в которое они асинхронно читают и записывают данные. Асинхронный конкурентный доступ может приводить к гонкам данных, и для их предотвращения используются механизмы, такие как блокировки, семафоры и мониторы. Современные многоядерные процессоры напрямую поддерживают разделяемую память, что активно используется многими параллельными языками программирования и библиотеками, например, Cilk, OpenMP и Threading Building Blocks.

Передача сообщения

В модели обмена сообщениями параллельные процессы обмениваются данными посредством передачи сообщений друг другу. Эти коммуникации могут быть асинхронными, когда сообщение может быть отправлено до того, как получатель готов его принять, или синхронными, когда получатель должен быть готов. Формализация обмена сообщениями в виде последовательных процессов взаимодействия (CSP) использует синхронные каналы связи для соединения процессов и привела к созданию таких важных языков, как Occam, Limbo и Go. В отличие от этого, модель акторов использует асинхронный обмен сообщениями и была применена при разработке языков, таких как D, Scala и SALSA.

Глобальное адресное пространство

Модели разделенного глобального адресного пространства (PGAS) представляют собой компромисс между общей памятью и передачей сообщений. PGAS предоставляет абстракцию глобального адресного пространства памяти, которое логически разделено, при этом часть пространства локальна для каждого процесса. Параллельные процессы взаимодействуют, асинхронно выполняя операции (например, чтение и запись) над глобальным адресным пространством, что напоминает модели с общей памятью. Однако, семантически разделяя глобальное адресное пространство на части, связанные с конкретными процессами, они позволяют программистам использовать преимущества локальности данных и обеспечивают эффективную реализацию на параллельных компьютерах с распределенной памятью. PGAS поддерживается многими параллельными языками программирования и библиотеками, такими как Fortran 2008, Chapel, UPC++ и SHMEM.

Неявная взаимосвязь

В неявной модели взаимодействие процессов не видно программисту, и вместо этого компилятор и/или среда выполнения отвечают за его реализацию. Два примера неявного параллелизма – это языки, ориентированные на конкретную область, где параллельность внутри операций высокого уровня задана изначально, и языки функционального программирования, поскольку отсутствие побочных эффектов позволяет выполнять независимые функции параллельно. Однако управлять таким видом параллелизма сложно, и функциональные языки, такие как Concurrent Haskell и Concurrent ML, предоставляют средства для явного и корректного управления параллелизмом.

Расщепление проблемы

Параллельная программа состоит из одновременно выполняющихся процессов. Разложение задачи относится к способу формулировки составляющих процессов. Параллельный язык программирования может быть основан на одной или комбинации моделей программирования. Например, High Performance Fortran основан на взаимодействии через общую память и декомпозиции задачи, ориентированной на параллелизм данных, а Go предоставляет механизмы для взаимодействия через общую память и передачу сообщений.