W ostatnich latach pojawiło się kilka projektów bibliotek / oprogramowania, które oferują jakąś formę równoległego zarządzania pamięcią współużytkowaną opartą na danych ogólnych.
Główną ideą jest to, że zamiast pisać kod z jawnym wątkiem, programiści implementują swoje algorytmy jako zadania współzależne, które są następnie dynamicznie planowane przez oprogramowanie pośredniczące ogólnego przeznaczenia na maszynie z pamięcią współużytkowaną.
Przykładami takich bibliotek są:
QUARK : Pierwotnie zaprojektowany dla biblioteki algebry liniowej równoległej MAGMA , wydaje się być również używany do równoległej szybkiej metody wielobiegunowej .
Cilk : Pierwotnie projekt oparty na MIT, teraz obsługiwany przez Intel, wdrożony jako rozszerzenia języka / kompilatora do C, używany w oprogramowaniu komputerowym szachów Cilkchess i eksperymentalnie w FFTW .
Superskalarny SMP : Opracowany w Barcelona Supercomputing Center, pod wieloma względami podobny do Cilk, w oparciu o
#pragma
rozszerzenia.StarPU : Podobne oparte na bibliotece „kodeki”, które można kompilować i planować na kilku różnych architekturach, w tym na GPU.
Zadania OpenMP: Od wersji 3.0 OpenMP wprowadził „zadania”, które można planować asynchronicznie (patrz rozdział 2.7 specyfikacji).
Elementy składowe wątków Intela : Używa klas C ++ do tworzenia i uruchamiania zadań asynchronicznych, patrz sekcja 11 samouczka.
OpenCL : obsługuje równoległość zadaniową na wielu rdzeniach.
Chociaż istnieje wiele literatury opisującej wewnętrzne działanie tych bibliotek / rozszerzeń języka i ich zastosowania do konkretnych problemów, natknąłem się na bardzo niewiele przykładów ich zastosowania w praktyce w naukowych aplikacjach komputerowych.
Oto pytanie: czy ktoś wie o naukowych kodach obliczeniowych wykorzystujących którąkolwiek z tych bibliotek / rozszerzeń językowych lub podobnych, do równoległości pamięci wspólnej?
Odpowiedzi:
deal.II korzysta z wątków w całej bibliotece i ogólnie jesteśmy z tego całkiem zadowoleni. Przyjrzeliśmy się kilku alternatywom, w szczególności OpenMP, ponieważ wydaje się, że wszyscy używają go do prostszych kodów, ale ich brakuje. W szczególności OpenMP ma tę ogromną wadę, że jego model zadań nie pozwala uzyskać uchwytu dla uruchomionego zadania, w związku z czym trudno jest uzyskać dostęp do stanu zadania (np. Czekać na jego zakończenie) lub zwrócić wartości funkcje uruchamiane na osobnym zadaniu. OpenMP jest przede wszystkim dobry do zrównoleglania najbardziej wewnętrznych pętli, ale wydajność równoległą zyskuje się przez równoległe równoległe, najbardziej złożone pętle, a OpenMP nie jest do tego narzędziem, podczas gdy TBB są do tego całkiem dobre.
źródło
Moim zdaniem systemy te okazały się względnie nieudane głównie z następujących powodów.
MPI_Comm
który umożliwia różnym bibliotekom wykonywanie bogatych operacji bez kolizji, a także przekazywanie kontekstu między bibliotekami i odzyskiwanie niezbędnych atrybutów. Abstrakcja zapewniana przez „komunikator” jest ważna dla kompozycji biblioteki, niezależnie od tego, czy używana jest pamięć współdzielona czy rozproszona.źródło