====== Architektura cc-NUMA ======

===== Wstęp =====

**CC-NUMA** (//ang. Cache Coherent Non-Uniform Memory Access//) - maszyny o takiej architekturze są maszynami o "niejednorodnym dostępie do pamięci, ze spójną pamięcią podręczną"

NUMA jest typem architektury wieloprocesora charakteryzująca się tym, że udostępnia użytkownikowi spójną logicznie przestrzeń adresową, pomimo tego, że pamięć jest fizycznie podzielona. Komputery zbudowane w tej architekturze posiadają wiele procesorów. 

Niejednorodność w dostępie do pamięci polega na tym, że procesor uzyskuje szybciej dostęp do pamięci swojej niż do innych.

W wieloprocesorach typu NUMA istnieje pojedyncza wirtualna przestrzeń adresowa widoczna przez wszystkie procesory. Wartość zapisana, przez dowolny procesor jest natychmiastowo widoczna dla wszystkich pozostałych, dlatego też następna operacja odczytu z tej komórki pamięci przez dowolny procesor poda właśnie tą wartość.

Architektura CC-NUMA jest "rozszerzeniem" NUMA. Różnica pomiędzy NUMA a CC-NUMA leży w spójności pamięci podręcznych procesorów. W CC-NUMA pamięci podręczne musza być spójne. Spójność ta jest zrealizowana za pomocą dodatkowego sprzętu oraz protokołu (wykorzystywany jest **//katalog//** czyli dodatkowa pamięć).

**//katalog//** - czyli dodatkowa pamięć, służy do zapamiętywania faktu pobrania danych z pamięci i przesłania ich do wezła lub w bardziej skomplikowanych przypadkach miejsce pobytu wszystkich kopii danych.

Schemat obrazujący architekturę CC-NUMA:


{{:wspolczesne_systemy_komputerowe:ccnuma.jpg|:wspolczesne_systemy_komputerowe:ccnuma.jpg}}


Możemy powiedzieć, że CC-NUMA jest komputerem złożonym z różnych [[SMP]] połączonych na poziomie pamięci w celu dostarczenia wszystkim procesorom jednolitej spójnej pamięci (ze wsparciem ze strony pamięci podręcznych). Pamięć ta jest jednak podzielona na części, po jednej dla każdego SMP. Dostęp do części zdalnej trwa 2-3 razy dłużej niż dostęp do części lokalnej. 


===== Miejsce w klasyfikacji =====

Klasyfikacja komputerów równoległych, w której kryterium podziału jest dostęp do pamięci:

  * **//UMA//**: Uniform Memory Access. Każdy procesor ma taki sam dostęp, przy użyciu standardowych operacji load i store do całej pamięci. Tak właśnie wygląda pamięć w standardowym modelu programowania SMP.

  * **//NUMA//**: Non-Uniform Memory Access. Każdy procesor ma dostęp, przy użyciu standardowych operacji load i store do całej pamięci. Jednak dostęp do różnych części tej pamięci może być obciążony istotnie różnym opóźnieniem.

  * **//NORMA//**: NO Remote Memory Access. Procesory nie mogą sięgać do pamięci innych procesów przy użyciu standardowych operacji load i store, muszą się komunikować w inny sposób.

Co prawda, w powyższej klasyfikacji, nie ma wyszczególnionej architektury CC-NUMA, ponieważ powstała ona jeszcze przed rozpowszechnieniem pamięci notatnikowej w systemach wieloprocesorowych.

Wyróżniamy 2 rodzaje NUMA:
  * NC-NUMA (//ang. Non-Coherent NUMA//)
  * CC-NUMA (//ang. Cache Coherence NUMA//)

===== Jak działa CC-NUMA? =====

Zarówno CC-NUMA, jak i NC-NUMA tworzy się łącząc kompletne komputery, często SMP, na poziomie szyn pamięci:

{{:wspolczesne_systemy_komputerowe:numa.jpg|:wspolczesne_systemy_komputerowe:numa.jpg}}

Różnica między CC-NUMA i NC-NUMA leży w pudełku oznaczonym D (//ang. directory//), które służy do przekierowywania żądań dostępu do pamięci poprzez połączenie do innych węzłów. Oczywiście tak połączonych komputerów oraz połączeń między nimi może być dużo więcej.

Pamięci we wszystkich węzłach stanowią łącznie wspólną przestrzeń adresową (wyższe bity adresu wskazują węzeł). 

Pobranie zdalnej wartości:

{{:wspolczesne_systemy_komputerowe:numa1.jpg|:wspolczesne_systemy_komputerowe:numa1.jpg}}

{{:wspolczesne_systemy_komputerowe:numa2.jpg|:wspolczesne_systemy_komputerowe:numa2.jpg}}


W systemie CC-NUMA pamięć jest traktowana całkowicie standardowo. W kroku 6 (por. rysunek 51) zapisano w katalogu fakt pobrania danych z pamięci 0 i przesłania ich do drugiego węzła. Katalog D zadziała jak procesor, który ma poszukiwane dane w swojej pamięci notatnikowej.

Bardziej skomplikowane przypadki przedstawiają się następująco:


{{:wspolczesne_systemy_komputerowe:numa3.jpg|:wspolczesne_systemy_komputerowe:numa3.jpg}}


W katalogu trzeba pamiętać miejsce pobytu wszystkich kopii danych. Jeśli jeden z procesorów chce modyfikować te dane, to trzeba unieważnić wszystkie kopie oprócz tej należącej do niego. Niestety konieczność pamiętania w katalogu wielu informacji powoduje kłopoty ze skalowalnością. Problem skalowalności rozwiązuje się bądź w stylu DASH, bądź w stylu SCI.

**DASH** (//ang. Directory Architecture for Shared Memory//) powstało w ramach projektu badawczego na Uniwersytecie w Stanford. Katalog implementuje się jako dużą macierz bitową. Można stosować rozgłaszanie.


{{:wspolczesne_systemy_komputerowe:dash.jpg|:wspolczesne_systemy_komputerowe:dash.jpg}}


**SCI** (//ang. Scalable Coherent Interconnect//) to standard opracowany przez międzynarodowy komitet standaryzacyjny IEEE. Katalog implementuje się jako powiązaną listę rozproszoną po węzłach. Dwukierunkowa lista łączy wszystkie kopie bloku danych przechowywane w różnych pamięciach notatnikowych i pamięci głównej. Nie można stosować rozgłaszania, lecz trzeba przechodzić od węzła do węzła wzdłuż listy.


{{:wspolczesne_systemy_komputerowe:sci.jpg|:wspolczesne_systemy_komputerowe:sci.jpg}}


===== Wady/Zalety =====

  * model SMP - logicznie wspólna pamięć (łatwość programowania), fizycznie pamięc rozproszona. Zatem aplikacja uzyskuje dostęp do pamięci za pomocą standardowych operacji ''load()'' i ''store()''.
  * duża skalowalność (do kilkuset procesorów)
  * dobra efektywność dla aplikacji z przewagą odczytów
  * średnia niezawodność (tak jak SMP, systemy CC-NUMA nie zapewniają w ogóle wysokiej dostępności - awaria choćby jednego dowolnego procesora, powoduje krach całego systemu. Powody są zarówno sprzętowe, jak i programowe. Skoro istnieje pojedyncza kopia danych systemowych, to przy awarii dowolnego węzła tracimy część tych danych)

===== Maszyny o architekturze cc-NUMA w Polsce =====

  * http://www.kdm.wcss.wroc.pl/wiki/index.php/Leo