La progettazione di bus I/O rappresenta le arterie del computer e determina in modo significativo quanto e quanto velocemente i dati possono essere scambiati tra i singoli componenti elencati sopra elencati. La categoria principale è guidata dai componenti utilizzati nel campo di alte computing (HPC). A partire dalla metà del 2020, tra i rappresentanti contemporanei di HPC ci sono Nvidia Tesla e DGX, Radeon Instinct e prodotti acceleratori basati su GPU Intel Xeon Phi (vedi [1,2] per i confronti dei prodotti).
Comprensione di NUMA
L'accesso alla memoria non uniforme (NUMA) descrive un'architettura di memoria condivisa utilizzata nei sistemi multiprocessing contemporanei. NUMA è un sistema di calcolo composto da diversi singoli nodi in modo tale che la memoria aggregata sia condivisa tra tutti i nodi: "A ogni CPU viene assegnata la propria memoria locale e può accedere alla memoria da altre CPU nel sistema" [12,7].
NUMA è un sistema intelligente utilizzato per il collegamento di più unità di elaborazione centrali (CPU) a qualsiasi quantità di memoria del computer disponibile sul computer. I singoli nodi NUMA sono collegati su una rete scalabile (bus I/O) in modo tale che una CPU possa accedere sistematicamente alla memoria associata ad altri nodi NUMA.
La memoria locale è la memoria che la CPU utilizza in un particolare nodo NUMA. La memoria estera o remota è la memoria che una CPU sta prendendo da un altro nodo NUMA. Il termine rapporto NUMA descrive il rapporto tra il costo dell'accesso alla memoria estera e il costo dell'accesso alla memoria locale. Maggiore è il rapporto, maggiore è il costo e quindi più tempo impiega per accedere alla memoria.
Tuttavia, ci vuole più tempo di quando quella CPU sta accedendo alla propria memoria locale. L'accesso alla memoria locale è un grande vantaggio, in quanto combina bassa latenza con elevata larghezza di banda. Al contrario, l'accesso alla memoria appartenente a qualsiasi altra CPU ha una latenza più elevata e prestazioni di larghezza di banda inferiori.
Guardando indietro: evoluzione dei multiprocessori di memoria condivisa
Frank Dennemann [8] afferma che le moderne architetture di sistema non consentono l'accesso alla memoria veramente uniforme (UMA), anche se questi sistemi sono specificamente progettati a tale scopo. Semplicemente parlando, l'idea del calcolo parallelo era quella di avere un gruppo di processori che cooperano per calcolare un determinato compito, accelerando così un calcolo sequenziale altrimenti classico.
Come spiegato da Frank Dennemann [8], nei primi anni '70, "la necessità di sistemi che potessero servire più operazioni di utenti simultanei e la generazione di dati eccessiva è diventata mainstream" con l'introduzione di sistemi di database relazionali. “Nonostante l'impressionante tasso di prestazioni uniprocessore, i sistemi multiprocessore erano meglio equipaggiati per gestire questo carico di lavoro. Per fornire un sistema economico, lo spazio degli indirizzi di memoria condivisa è diventato al centro della ricerca. All'inizio, sono stati sostenuti sistemi che utilizzano un interruttore a traversa, tuttavia con questa complessità di progettazione in scala insieme all'aumento dei processori, il che ha reso il sistema basato su autobus più attraente. I processori in un sistema bus [possono] accedere all'intero spazio di memoria inviando richieste sul bus, un modo molto economico per utilizzare la memoria disponibile nel modo più ottimale possibile."
Tuttavia, i sistemi informatici basati su autobus sono dotati di un collo di bottiglia - la quantità limitata di larghezza di banda che porta a problemi di scalabilità. Più CPU vengono aggiunte al sistema, minore larghezza di banda per nodo disponibile. Inoltre, più CPU vengono aggiunti, più a lungo è il bus e maggiore è la latenza di conseguenza.
La maggior parte delle CPU sono state costruite su un piano bidimensionale. Le CPU dovevano anche avere i controller di memoria integrati aggiunti. La semplice soluzione di avere quattro bus di memoria (in alto, in basso, a sinistra, a destra) a ciascun core della CPU consentiva la larghezza di banda disponibile completa, ma questo va solo finora. Le CPU stagnano con quattro core per un tempo considerevole. L'aggiunta di tracce sopra e sotto consentiva gli autobus diretti attraverso le CPU contrastate in diagonale quando i chip sono diventati 3D. Posizionare una CPU a quattro codi su una carta, che poi collegata a un bus, è stato il prossimo passo logico.
Oggi, ogni processore contiene molti core con una cache su chip condivisa e una memoria off-chip e ha costi di accesso alla memoria variabile in diverse parti della memoria all'interno di un server.
Migliorare l'efficienza dell'accesso ai dati è uno dei principali obiettivi della progettazione della CPU contemporanea. Ogni core della CPU è stato dotato di una cache di livello uno piccolo (32 kb) e una cache di livello 2 più grande (256 kb). I vari core avrebbero successivamente condiviso una cache di livello 3 di diversi MB, la cui dimensione è cresciuta considerevolmente nel tempo.
Per evitare i manchi della cache - richiedere dati che non si trovano nella cache - viene impiegato un sacco di tempo di ricerca per trovare il giusto numero di cache della CPU, strutture di memorizzazione nella cache e algoritmi corrispondenti. Vedi [8] per una spiegazione più dettagliata del protocollo per la memorizzazione nella cache di snoop [4] e la coerenza della cache [3,5], nonché le idee di design dietro NUMA.
Supporto software per NUMA
Esistono due misure di ottimizzazione del software che possono migliorare le prestazioni di un sistema a supporto dell'architettura NUMA: affinità e posizionamento dei dati. Come spiegato in [19], “Affinità del processore […] consente l'associazione e l'indennità di un processo o un thread a una singola CPU, o una gamma di CPU in modo che il processo o il thread eseguiranno piuttosto solo sulla CPU designata o le CPU di qualsiasi CPU."Il termine" posizionamento dei dati "si riferisce alle modifiche del software in cui il codice e i dati sono mantenuti il più vicino possibile nella memoria.
I diversi sistemi operativi UNIX e UNIX supportano NUMA nei modi seguenti (l'elenco seguente è tratto da [14]):
Nel libro "Informatica e tecnologia, Atti della Conferenza internazionale (CST2016)" Ning CAI suggerisce che lo studio dell'architettura NUMA si è concentrato principalmente sull'ambiente di calcolo di fascia alta e ha proposto il partizionamento RADIX NUMA-AWARE (NARP), che ottimizza Le prestazioni delle cache condivise nei nodi NUMA per accelerare le applicazioni di business intelligence. Pertanto, NUMA rappresenta una via di mezzo tra i sistemi di memoria condivisa (SMP) con alcuni processori [6].
NUMA e Linux
Come indicato sopra, il kernel Linux ha supportato NUMA dalla versione 2.5. Sia Debian GNU/Linux che Ubuntu offrono supporto NUMA per l'ottimizzazione del processo con i due pacchetti software NUMACTL [16] e NUMAD [17]. Con l'aiuto del comando NUMACTL, è possibile elencare l'inventario dei nodi NUMA disponibili nel sistema [18]:
# NUMACTL -H -HARDWARE
Disponibile: 2 nodi (0-1)
Nodo 0 CPU: 0 1 2 3 4 5 6 7 16 17 18 19 20 21 22 23
Nodo 0 Dimensioni: 8157 MB
nodo 0 gratuito: 88 MB
Nodo 1 CPU: 8 9 10 11 12 13 14 15 24 25 26 27 28 29 30 31
Nodo 1 Dimensione: 8191 MB
nodo 1 gratuito: 5176 MB
distanze di nodo:
nodo 0 1
0: 10 20
1: 20 10
Nimatop è uno strumento utile sviluppato da Intel per il monitoraggio della località di memoria di runtime e dell'analisi dei processi nei sistemi NUMA [10,11]. Lo strumento può identificare potenziali colli di bottiglia per le prestazioni relativi a NUMA e quindi aiutare a riattivare le allocazioni di memoria/CPU per massimizzare il potenziale di un sistema NUMA. Vedere [9] per una descrizione più dettagliata.
Scenari di utilizzo
I computer che supportano la tecnologia NUMA consentono a tutte le CPU di accedere direttamente all'intera memoria: le CPU vedono questo come un unico spazio di indirizzi lineari. Ciò porta a un uso più efficiente dello schema di indirizzamento a 64 bit, con conseguente movimento più rapido dei dati, meno replica dei dati e una programmazione più semplice.
I sistemi NUMA sono piuttosto interessanti per le applicazioni sul lato server, come i sistemi di data mining e supporto decisionale. Inoltre, la scrittura di applicazioni per i giochi di gioco e ad alte prestazioni diventa molto più semplice con questa architettura.
Conclusione
In conclusione, l'architettura NUMA affronta la scalabilità, che è uno dei suoi vantaggi principali. In una CPU NUMA, un nodo avrà una larghezza di banda superiore o una latenza inferiore per accedere alla memoria su quello stesso nodo (E.G., La CPU locale richiede l'accesso alla memoria contemporaneamente all'accesso remoto; La priorità è sulla CPU locale). Ciò migliorerà drasticamente la trasmissione della memoria se i dati sono localizzati in processi specifici (e quindi processori). Gli svantaggi sono i costi più elevati di spostamento dei dati da un processore a un altro. Finché questo caso non si verifica troppo spesso, un sistema NUMA supererà i sistemi con un'architettura più tradizionale.
Collegamenti e riferimenti
Grazie
Gli autori desiderano ringraziare Gerold Rupprecht per il suo supporto mentre preparano questo articolo.
Riguardo agli Autori
Plaxedes Nehanda è una persona versatile multiskillata e autonoma che indossa molti cappelli, tra questi, un pianificatore di eventi, un assistente virtuale, un trascrittore e un appassionato ricercatore, con sede a Johannesburg, in Sudafrica.
Prince k. Nehanda è un ingegnere di strumentazione e controllo (metrologia) presso la misurazione di Paeflow a Harare, Zimbabwe.
Frank Hofmann lavora sulla strada - preferibilmente da Berlino (Germania), Ginevra (Svizzera) e Cape Town (Sudafrica) - come sviluppatore, allenatore e autore per riviste come Linux -User e Linux Magazine. È anche coautore del libro di gestione dei pacchetti Debian (http: // www.dpmb.org).