# Architetture di sistemi multiprocessore

Un sistema informatico multiprocessore è un sistema che ha una struttura con più di un processore, ossia è composto da più unità di processo centrale (CPU) collegate tra loro.
Esistono varie architetture di sistemi multiprocessore, che sono classificabili in base alle seguenti caratteristiche:
* grado di accoppiamento: forte o debole;
* grado di diversificazione: omogeneo o eterogeneo;
* accesso alle risorse: uniforme, non uniforme, ibrido.

## Sistema ad accompiamento debole

In un sistema multiprocessore, ciascun processore ha una sua memoria locale, i suoi canali di I/O (input-output) e un Sistema operativo indipendente. I processori possono scambiare dati attraverso una rete di connessione veloce tramite invio di messaggi (message passing).

### Caratteristiche del sistema

* Questi sistemi sono in grado di eseguire istruzioni multiple su dati multipli (MIMD - Multiple Instruction Multiple Data);
* Questo tipo di architettura permette il calcolo parallelo (parallel processing).;La memoria distribuita permette un'elevata scalabilità.

## Sistema ad accoppiamento forte

Sistema multiprocessore con memoria condivisa strettamente connessa ai processori.
Un sistema multiprocessore simmetrico è un sistema con una memoria centralizzata condivisa, chiamata memoria principale (Main Memory - MM), operante sotto il controllo di un singolo sistema operativo con uno o più sistemi multiprocessore.
Ci sono due tipi di sistemi:
* Sistema UMA;
* Sistema NUMA.

### Sistema UMA

Sistema UMA (acronimo di Uniform Memory Access, lett. "accesso della memoria uniforme" in italiano)
* Sistema eterogeneo;
* Sistema multiprocessore simmetrico (SMP).

#### Sistema eterogeneo

Un sistema eterogeneo si riferisce ad un sistema che contiene unità di calcolo non omogenee (CPU - Central Processor Unit), processori grafici (GPU - Graphic Processor Unit), processori di segnali digitali, o ogni tipo di ASIC (application-specific integrated circuits). Questa tipo di architettura permette a qualsiasi processore dedicato, come un GPU, di operare allo stesso livello delle CPU.

#### Sistema simmetrico (SMP)

Sistema operante sotto un singolo sistema operativo con una memoria (MM) centralizzata condivisa.
Il Sistema multiprocessore simmetrico (SMP-Symmetric Multiprocessor System) è un sistema formato da un insieme di processori omogenei che lavorano indipendentemente. Ciascun processore, eseguendo programmi diversi su dati diversi, ha capacità di condividere risorse comuni (memoria, periferiche di I/O, sistema di interruzione ecc.) connessi tramite un Bus di sistema (system bus) o un crossbar (connessioni incrociate) o un mix dei questi due approcci, bus per gli indirizzi e crossbar per i dati (data crossbar).
Ciascun processore ha una sua memoria cache che agisce come ponte tra i processori e la memoria principale (MM). La funzione della memoria cache è di velocizzare gli accessi dei dati della MM (aumento di prestazioni): nei sistemi multiprocessore a memoria condivisa è molto importante ridurre il traffico nel bus di sistema e di memoria, che è uno dei maggiori colli di bottiglia di questi sistemi. In questi sistemi la cache risulta perciò un elemento essenziale.
La condivisione della memoria garantisce un accesso uniforme alla MM (UMA - Uniform Memory Access time).

### Sistema cc-NUMA

Sistema cc-NUMA (cache coherency - Non Uniform Memory Access, lett. "coerenza della cache - accesso alla memoria non uniforme" in italiano)
È noto che i sistemi SMP sono limitati in scalabilità (espansioni incrementali). Per superare questo limite, viene normalmente usata l'architettura chiamata "cc-NUMA".
Il sistema cc-NUMA è un gruppo di sistemi SMP chiamati "nodi" connessi a una rete di connessione veloce che può essere un link (collegamento) che può essere un anello singolo o un anello doppio bidirezionale oppure un multi-anello, connessione punto-punto oppure infine un mix di questi (ad esempio IBM Power Systems), bus (es. NUMAq), crossbar, bus segmentato (segmented bus) (NUMA Bull HN ISI ex Honeywell), Mesh router, ecc.
La caratteristica principale di questi sistemi è di avere un'unica memoria condivisa distribuita in ciascun nodo a cui possono accedere tutti i processori di tutti i nodi.
In un sistema cc-NUMA, l'accesso di un processore a una memoria remota di un nodo remoto è più lento rispetto ad un accesso alla sua memoria locale. Per questa ragione questo sistema è chiamato NUMA (Non Uniform Memory Access - accesso alla memoria non uniforme).
Il sistema cc-NUMA è anche chiamato Distributed Shared Memory (DSM) - memoria condivisa distribuita.
Ciascun nodo normalmente è un sistema SMP, dove un processore può essere un singolo processore o un processore multi-core o un mix dei due o qualsiasi altro tipo di architettura.
La differenza di tempo di accesso tra locale e remoto può essere anche di un ordine di grandezza, dipendente dal tipo della rete di connessione usata (più veloce nel bus segmentato, crossbar o interconnessione punto-punto, più lenta nella connessione ad anelli seriali).

#### Esempi di interconnessione

Per superare questo limite normalmente viene usata usata una grande cache remota (vedi Cache remota). Con questa soluzione il sistema cc-NUMA diventa simile ad un esteso sistema SMP.

## Gradi di accoppiamento a confronto

Entrambe le architetture hanno dei vantaggi e il compromesso tra i due può essere riassunto qui di seguito:
* Le architetture ad accoppiamento largo (loosely coupled) permettono alte prestazioni per ciascun singolo processore ma non sono in grado di ottenere in tempo reale un facile bilanciamento del carico tra processori.
* Le architetture ad accoppiamento stretto (tightly coupled) per contro sono in grado di fornire un facile bilanciamento ma soffrono di "colli di bottiglia" dovuti alla condivisione risorse comuni tramite uno o più bus (che sono anch'essi risorse comuni).

## Sistema con duplicazione dei dati globali

Questo sistema è un approccio intermedio fra le due architetture precedenti: ha sia risorse comuni a tutti i processori, che risorse e memoria locali (LM) in ogni processore. Le risorse comuni sono accessibili da tutti i processori tramite il bus di sistema, mentre le risorse locali sono accessibili solo al relativo processore locale. Le memorie cache, in questa prospettiva sono viste come memorie locali.
Questo sistema (patented F. Zulian) usato nei sistemi Unix DPX/2 300 (Bull Hn Information Systems Italia (ex Honeywell)) è un mix tra sistemi tightly coupled e loosely coupled la cui caratteristica è quella di offrire tutti i vantaggi di queste due architetture.
La memoria locale è divisa in due sezioni, dati globali (Global Data - GD) e dati locali (Local Data - LD).
Il concetto base di questa architettura è di avere dati globali, che sono informazioni modificabili da tutti, che possono essere accedute da tutti i processori localmente, essendo queste informazioni duplicate in ciascuna memoria locale di ciascun processore.
Ogni volta che questi dati sono modificati in una memoria locale, un'operazione di scrittura globale viene inviata sul bus di sistema a tutte le altre memorie locali (write-broadcasting) per mantenere la coerenza dei dati globali. Perciò i dati globali possono essere letti localmente da ciascun processore senza dover accedere al bus di sistema. Il bus di sistema è acceduto solo quando i dati globali di una memoria locale sono modificati, per aggiornare la copia di questi dati memorizzati nelle altre memorie locali.
I dati locali invece possono essere scambiati in modo simile al sistema loosely coupled via message passing (invio di messaggi).