Заранее извиняюсь за формат блога моего ответа. Я не мог не сделать небольшой обзор мира параллельных вычислений.
Вы можете классифицировать модели параллельного программирования примерно на две категории: модели потока управления и потока данных.
Модели потока управления пытаются заставить параллелизм работать в контексте программы с явным управлением, в основном на каждом программируемом компьютере сегодня. Основная проблема, которая решается, заключается в том, что такая «архитектура фон Неймана» была разработана не для параллельного выполнения, а для эффективных последовательных вычислений. Параллелизм в таком контексте получается путем дублирования частей основных модулей (память, управление, арифметика).
Дублирование только арифметики дает вам инструкции SIMD, все ALU совместно используют один и тот же программный счетчик (ПК) и, таким образом, всегда выполняют одну и ту же операцию параллельно, хотя и с разными данными.
Дублирование ALU и ПК, но хранение секвенсора команд внутри блока управления дает вам выполнение вне очереди (OoO), которое приводит к некоторому конвейерному параллелизму. В этой категории у вас также есть техника очень длинных инструкций (VLWI) и методы прогнозирования ветвлений. Вы редко видите эту категорию на уровне программного обеспечения.
Пройдя немного дальше, вы продублируете все «ядро», но сохраняете общую память, это текущие многоядерные процессоры, которые обеспечивают параллелизм задач (или потоков). Совместное использование памяти в этом контексте дает вам очень, очень сложные и тонкие проблемы параллелизма . Параллельные вычисления на текущем многоядерном процессоре, таким образом, полностью вращаются вокруг проблем синхронизации / параллелизма, тщательного баланса производительности (без синхронизации) и желаемой семантики (полностью синхронизированная, семантика последовательного выполнения). Примером этого является PRAM или более популярный в наши дни Cilk ofshoots, такой как fork / join ( IntelTBB , Java.Utils.Concurrency). Модели CSP и Actor являются моделями параллелизма, но, как упоминалось выше, параллелизм и параллелизм размываются в среде с общей памятью. nb параллелизм для производительности, параллелизма для поддержания правильной семантики.
Дублирование памяти также дает вам либо сетевые компьютеры, которые запрограммированы на MPI и тому подобное, либо просто странные архитектуры, отличные от фон Неймана, такие как процессоры «сеть на кристалле» (облачный процессор, Transputer, Tilera). Модели памяти, такие как UMA или NUMA, пытаются поддерживать иллюзию совместной памяти и могут существовать как на программном, так и на аппаратном уровне. MPI поддерживает параллелизм на уровне программы и обменивается данными только через передачу сообщений. Передача сообщений также используется на аппаратном уровне для связи и параллелизма (Transputer).
Вторая категория - это модели потоков данных . Они были разработаны на заре компьютерной эры как способ записывать и выполнять параллельные вычисления, избегая дизайна фон Неймана. Они вышли из моды (для параллельных вычислений) к 80-м годам после того, как последовательная производительность выросла в геометрической прогрессии. Однако многие системы параллельного программирования, такие как Google MapReduce, Microsoft Dryad или Intel Concurrent Collections, на самом деле являются вычислительными моделями потоков данных. В какой-то момент они представляют вычисления в виде графика и используют его для руководства выполнением.
Указывая части моделей, вы получаете разные категории и семантику для модели потока данных. Что вы ограничиваете форму графика: DAG (CnC, Dryad), дерево (mapreduce), орграф? Есть ли строгая семантика синхронизации ( Luster, реактивное программирование]? Запрещаете ли вы рекурсию иметь статическое расписание (StreaMIT) или вы предоставляете более выразительные возможности, имея динамический планировщик (Intel CnC)? Есть ли ограничение на количество входящих или исходящих ребер? Позволяет ли семантика обжига запустить узел, когда доступно подмножество входящих данных? Являются ли ребра потоками данных (обработка потоков) или единичными токенами данных (статическое / динамическое одиночное назначение). Для связанной работы вы могли бы начать с изучения работы по исследованию потоков данных таких людей, как Арвинд, К. Кави, j. Шарп, В. Аккерман, Р. Джаганнатан и др.
Редактировать: ради полноты. Следует отметить, что существуют также параллельные модели, основанные на сокращении и модели. Для стратегий сокращения у вас обычно есть сокращение графов и сокращение строк. Haskell в основном использует сокращение графов, что является очень эффективной стратегией в последовательной системе с разделяемой памятью. Сокращение строк дублирует работу, но имеет свойство частной памяти, которое делает его более подходящим для неявного распараллеливания. Модели на основе шаблонов - это языки параллельной логики, такие как параллельный пролог. Модель Actor также является моделью на основе шаблонов, но с частными характеристиками памяти.
PS. Я широко использую термин «модель», охватывающий абстрактные машины как для формальных, так и для программных целей.