Z góry przepraszam za format bloga mojej odpowiedzi. Nie mogłem się powstrzymać od zrobienia krótkiego przeglądu świata obliczeń równoległych.
Modele programowania równoległego można podzielić na mniej więcej dwie kategorie: modele sterowania przepływem i modele przepływu danych.
Modele sterowania przepływem próbują sprawić, by równoległość działała w kontekście programu jawnej kontroli, w zasadzie każdego dzisiejszego programowalnego komputera. Podstawowym problemem, z którym należy się zmierzyć, jest to, że taka „architektura von Neumanna” nie została zaprojektowana do równoległego wykonywania, ale wydajne obliczenia sekwencyjne. Równoległość w takim kontekście uzyskuje się przez powielanie części podstawowych modułów (pamięć, sterowanie, arytmetyka).
Duplikowanie tylko arytmetyki daje instrukcje SIMD, wszystkie ALU współużytkują ten sam licznik programów (PC), a zatem zawsze wykonują tę samą operację równolegle, choć na różnych danych.
Duplikowanie ALU i komputera PC, ale utrzymanie sekwencera instrukcji wewnątrz jednostki sterującej, zapewnia wykonanie poza kolejnością (OoO), które zapewnia pewną równoległość potoku. W tej kategorii masz również bardzo długie słowo instrukcji (VLWI) i techniki przewidywania rozgałęzień. Rzadko jednak widzisz tę kategorię na poziomie oprogramowania.
Nieco dalej jest duplikowanie całego „rdzenia”, ale przy zachowaniu wspólnej pamięci, są to obecnie procesory wielordzeniowe, które zapewniają równoległość zadań (lub wątków). Udostępnianie pamięci w tym kontekście daje bardzo, bardzo trudne i subtelne problemy z współbieżnością . Obliczenia równoległe w bieżącym trybie wielordzeniowym dotyczą zatem całkowicie problemów z synchronizacją / współbieżnością, starannej równowagi wydajności (bez synchronizacji) i pożądanej semantyki (całkowicie zsynchronizowana, semantyka sekwencyjnego wykonywania). Przykładem tego jest PRAM lub bardziej popularny obecnie Cilk ofshoots, taki jak fork / join ( IntelTBB , Java.Utils.Concurrency). Modele CSP i Actor są modelami współbieżności, ale jak wspomniano powyżej, współbieżność i równoległość stają się rozmyte w środowisku pamięci wspólnej. Równoległość nb służy wydajności, a współbieżność pozwala zachować poprawną semantykę.
Powielanie pamięci daje ci albo komputery w sieci, które są zaprogramowane z MPI i jego podobnymi, albo po prostu dziwne architektury inne niż Von Neumann, takie jak procesory sieciowe na chipie (procesor w chmurze, Transputer, Tilera). Modele pamięci, takie jak UMA lub NUMA, starają się zachować iluzję pamięci współdzielonej i mogą istnieć na poziomie oprogramowania lub sprzętu. MPI utrzymuje równoległość na poziomie programu i komunikuje się tylko poprzez przekazywanie komunikatów. Przekazywanie wiadomości jest również używane na poziomie sprzętowym do komunikacji i współbieżności (Transputer).
Druga kategoria to modele przepływu danych . Zostały one zaprojektowane na początku ery komputerów jako sposób na zapisywanie i wykonywanie równoległych obliczeń, unikając projektu von Neumanna. Te przestały być modne (w przypadku przetwarzania równoległego) w latach 80. po tym, jak wydajność sekwencyjna wzrosła wykładniczo. Jednak wiele równoległych systemów programowania, takich jak Google MapReduce, Driada Microsoftu lub Współbieżne kolekcje Intela, są w rzeczywistości modelami obliczeniowymi przepływu danych. W pewnym momencie reprezentują obliczenia jako wykres i wykorzystują je do kierowania wykonaniem.
Określając części modeli, otrzymujesz różne kategorie i semantykę dla modelu przepływu danych. Co ograniczasz kształt wykresu do: DAG (CnC, Driada), drzewa (mapreduce), digraph? Czy istnieje ścisła semantyka synchronizacji ( Luster, programowanie reaktywne]? Czy nie zezwalasz na rekurencję, aby móc mieć harmonogram statyczny (StreaMIT), czy zapewniasz bardziej ekspresyjną moc dzięki dynamicznemu harmonogramowi (Intel CnC)? Czy istnieje ograniczenie liczby krawędzi przychodzących lub wychodzących? Czy semantyka wyzwalania umożliwia odpalenie węzła, gdy dostępny jest podzbiór danych przychodzących? Są krawędziami strumieni danych (przetwarzanie strumieniowe) lub pojedynczymi tokenami danych (statyczne / dynamiczne pojedyncze przypisanie). W przypadku powiązanych prac można rozpocząć od pracy badawczej nad przepływem danych osób takich jak Arvind, K. Kavi, j. Sharp, W. Ackerman, R. Jagannathan itp.
Edycja: Ze względu na kompletność. Powinienem zauważyć, że istnieją również modele napędzane równolegle do redukcji i wzorców . W przypadku strategii redukcji zasadniczo stosuje się redukcję wykresów i ciągów znaków. Haskell w zasadzie stosuje redukcję wykresów, co jest bardzo wydajną strategią w systemie sekwencyjnym pamięci wspólnej. Duplikaty redukcji ciągów działają, ale mają właściwość pamięci prywatnej, dzięki czemu lepiej nadają się do niejawnego zrównoleglenia. Modelami opartymi na wzorach są równoległe języki logiczne, takie jak współbieżne prologowanie. Model aktora jest również modelem opartym na wzorcach, ale z cechami pamięci prywatnej.
PS. Używam terminu „model” szeroko, obejmując abstrakcyjne maszyny zarówno do celów formalnych, jak i programistycznych.