В вычислительной технике модель параллельного программирования — это абстракция параллельной компьютерной архитектуры, с помощью которой удобно выражать алгоритмы и их композицию в программах . Ценность модели программирования можно оценить по ее общности : насколько хорошо ряд различных проблем может быть выражен для множества различных архитектур, и по ее производительности : насколько эффективно могут выполняться скомпилированные программы. [1] Реализация модели параллельного программирования может иметь форму библиотеки, вызываемой из языка программирования , как расширение для существующих языков.
Консенсус вокруг конкретной модели программирования важен, поскольку он приводит к созданию различных параллельных компьютеров с поддержкой этой модели, тем самым облегчая переносимость программного обеспечения. В этом смысле модели программирования называются мостами между оборудованием и программным обеспечением. [2]
Классификации моделей параллельного программирования можно разделить на две основные области: взаимодействие процессов и декомпозиция проблем. [3] [4] [5]
Взаимодействие процессов относится к механизмам, с помощью которых параллельные процессы могут общаться друг с другом. Наиболее распространенными формами взаимодействия являются общая память и передача сообщений, но взаимодействие может быть также неявным (невидимым для программиста).
Общая память — это эффективное средство передачи данных между процессами. В модели общей памяти параллельные процессы совместно используют глобальное адресное пространство, в которое они асинхронно читают и записывают. Асинхронный параллельный доступ может привести к условиям гонки , и для их избежания можно использовать такие механизмы, как блокировки , семафоры и мониторы . Обычные многоядерные процессоры напрямую поддерживают общую память, которую многие параллельные языки программирования и библиотеки, такие как Cilk , OpenMP и Threading Building Blocks , предназначены для использования.
В модели передачи сообщений параллельные процессы обмениваются данными посредством передачи сообщений друг другу. Эти коммуникации могут быть асинхронными, когда сообщение может быть отправлено до того, как получатель будет готов, или синхронными, когда получатель должен быть готов. Формализация передачи сообщений Communicating Sequential Processes (CSP) использует синхронные каналы связи для соединения процессов и привела к появлению таких важных языков, как Occam , Limbo и Go . Напротив, модель актора использует асинхронную передачу сообщений и применялась при разработке таких языков, как D , Scala и SALSA.
Модели Partitioned Global Address Space (PGAS) обеспечивают золотую середину между общей памятью и передачей сообщений. PGAS обеспечивает абстракцию адресного пространства глобальной памяти, которая логически разделена, где часть является локальной для каждого процесса. Параллельные процессы взаимодействуют путем асинхронного выполнения операций (например, чтения и записи) в глобальном адресном пространстве, способом, напоминающим модели общей памяти. Однако, семантически разделяя глобальное адресное пространство на части с привязкой к определенному процессу, они позволяют программистам использовать локальность ссылок и обеспечивают эффективную реализацию на параллельных компьютерах с распределенной памятью . PGAS предлагается многими языками и библиотеками параллельного программирования, такими как Fortran 2008 , Chapel , UPC++ и SHMEM .
В неявной модели программисту не видно никакого взаимодействия процессов, и вместо этого за его выполнение отвечает компилятор и/или среда выполнения. Два примера неявного параллелизма — это предметно-ориентированные языки , где предписан параллелизм в высокоуровневых операциях, и функциональные языки программирования , поскольку отсутствие побочных эффектов позволяет выполнять независимые функции параллельно. [6] Однако этот вид параллелизма трудно контролировать [7], и функциональные языки, такие как Concurrent Haskell и Concurrent ML, предоставляют возможности для явного и правильного управления параллелизмом.
Параллельная программа состоит из одновременно выполняющихся процессов. Декомпозиция проблемы относится к способу, которым формулируются составляющие ее процессы. [8] [5]
Модель параллельной задачи фокусируется на процессах или потоках выполнения. Эти процессы часто будут поведенчески различны, что подчеркивает необходимость коммуникации. Параллелизм задач — это естественный способ выражения коммуникации посредством передачи сообщений. В таксономии Флинна параллелизм задач обычно классифицируется как MIMD / MPMD или MISD .
Параллельная модель данных фокусируется на выполнении операций над набором данных, обычно регулярно структурированным массивом. Набор задач будет работать с этими данными, но независимо на непересекающихся разделах. В таксономии Флинна параллелизм данных обычно классифицируется как MIMD / SPMD или SIMD .
Потоковый параллелизм, также известный как конвейерный параллелизм, фокусируется на разделении вычислений на последовательность этапов, где каждый этап обрабатывает часть входных данных. Каждый этап работает независимо и параллельно, а выход одного этапа служит входом для следующего этапа. Потоковый параллелизм особенно подходит для приложений с непрерывными потоками данных или конвейерными вычислениями.
Как и в случае неявного взаимодействия процессов, неявная модель параллелизма ничего не раскрывает программисту, поскольку за это отвечает компилятор, среда выполнения или оборудование. Например, в компиляторах автоматическое параллелизация — это процесс преобразования последовательного кода в параллельный, а в компьютерной архитектуре суперскалярное выполнение — это механизм, посредством которого параллелизм на уровне инструкций используется для параллельного выполнения операций.
Модели параллельного программирования тесно связаны с моделями вычислений . Модель параллельных вычислений — это абстракция, используемая для анализа стоимости вычислительных процессов, но она не обязательно должна быть практичной, поскольку может быть эффективно реализована в аппаратном и/или программном обеспечении. Модель программирования, напротив, специально подразумевает практические соображения по реализации аппаратного и программного обеспечения. [9]
Параллельный язык программирования может быть основан на одной или комбинации моделей программирования. Например, High Performance Fortran основан на взаимодействии с разделяемой памятью и декомпозиции проблемы параллельной обработки данных, а Go предоставляет механизм для взаимодействия с разделяемой памятью и передачи сообщений.
{{cite book}}
: |journal=
проигнорировано ( помощь )