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