Caratteristiche del processore Intel Xeon Phi Knights Landing

Save this PDF as:
 WORD  PNG  TXT  JPG

Dimensione: px
Iniziare la visualizzazioe della pagina:

Download "Caratteristiche del processore Intel Xeon Phi Knights Landing"

Transcript

1 Scuola Politecnica e delle Scienze di Base Corso di Laurea in Ingegneria Informatica Elaborato finale in Calcolatori elettronici I Caratteristiche del processore Intel Xeon Phi Knights Landing Anno Accademico 2016/2017 Candidato: Giuseppina Tuoro matr. N

2 A chi ha sempre creduto in me.

3 Indice Indice... III Introduzione... 4 Capitolo 1: La famiglia Intel Xeon Phi Il progetto Larrabee e la nascita dell'architettura Intel MIC Principali caratteristiche Transistor tri-gate Bus PCI Express Knights Corner: la prima generazione Composizione della scheda e microarchitettura Capitolo 2: I processori Xeon Phi Knights Landing Il sottosistema di calcolo Il core Hyper-threading e gestione delle risorse Instruction Set Architecture (ISA) Memorie cache La modalità all-to-all La modalità quadrante La modalità sub-numa (SNC-4/SNC-2) Il sottosistema di memoria La modalità cache La modalità flat La modalità ibrida Il sottosistema di I/O L'architettura Omni-Path (OPA) Capitolo 3: Introduzione alla programmazione Modalità di esecuzione OpenMP Esempi di codice Intel Xeon Phi vs GPGPU Nvidia Conclusioni Bibliografia e siti web... 39

4 Introduzione Negli ultimi trent' anni la tecnologia elettronica si è evoluta rapidamente nel campo dei microprocessori, aprendo la strada alla realizzazione di prodotti più avanzati e potenti. Se in passato le architetture con un'elevata frequenza di clock erano il principale interesse del mercato, oggi l'attenzione si è spostata sul multicore e manycore design. I progettisti hanno introdotto un numero sempre maggiore di core per singolo processore al fine di aumentare velocità e prestazioni, puntando tutto sul parallelismo. Innovativa, in questi ultimi anni, è stata l' architettura manycore, che integra al proprio interno un elevato numero di unità di elaborazione ed è espressamente rivolta a segmenti e applicazioni che eseguono elaborazioni altamente parallele, tra cui l' High Performance Computing (HPC) [38]. Questo ha permesso la comprensione e lo studio di fenomeni complessi, fornendo uno straordinario contributo in numerosi settori, tra cui [24] [32] : Climatologia: studio del clima globale; Farmacologia: sviluppo di nuovi farmaci; Medicina: studio delle proteine per la cura e la prevenzione delle malattie; Fisica: equazioni fluidodinamiche; Esplorazione petrolifera; Analisi finanziarie. 4

5 L' azienda Intel è stata una delle prime ad addentrarsi in questo campo e a rendere noto, durante l' International Supercomputing Conference del 2010, l intento di offrire dei prodotti basati sull architettura Many Integrated Core (MIC) in grado di eseguire trilioni di calcoli al secondo [33]. I primi prodotti basati su architettura Intel MIC sono stati i processori appartenenti alla famiglia Xeon Phi. Essi sono stati la prima concretizzazione commerciale del progetto Larrabee, che è stato abbandonato anni fa e che ha contribuito alla nascita dell'iniziativa MIC [34]. Questa tesi di laurea si pone l obiettivo di illustrare le caratteristiche delle architetture Intel Xeon Phi e, nello specifico, dei processori di seconda generazione Xeon Phi Knights Landing. In particolare, verranno analizzati dettagliatamente gli aspetti relativi al sistema di calcolo, di memoria e di input/output del processore con le rispettive componenti. 5

6 Capitolo 1: La famiglia Intel Xeon Phi In questo capitolo si esporrà brevemente l' origine dell'architettura Many Integrated Core di Intel su cui sono basati i processori Xeon Phi. Successivamente verrà fornita una panoramica delle caratteristiche fondamentali di tali processori e della prima generazione della gamma, gli Xeon Phi Knights Corner. 1.1 Il progetto Larrabee e la nascita dell'architettura Intel MIC [17] [18] Come accennato precedentemente, l' architettura Intel MIC prese vita dal progetto Larrabee. Esso nasceva dalla volontà di realizzare un processore per il calcolo parallelo, utilizzando un'unità di elaborazione grafica (GPU). Larrabee doveva essere basato su un' architettura x86 parallela, progettata per raggiungere una scalabilità di TeraFLOPS I. Poteva essere considerato un ibrido tra un processore multicore e una GPU: la gerarchia delle cache e la compatibilità con l'architettura x86 erano simili a quelle di una CPU, mentre le sue unità SIMD II lo rendevano simile ad una GPU [17]. Tuttavia il progetto fu sospeso nel maggio del 2010, in quanto non furono raggiunti gli obiettivi prefissati. Nel settore della grafica, l'architettura x86 non permise infatti di raggiungere le prestazioni della concorrenza (AMD e Nvidia) [21] [31]. I Il FLOPS (FLoating point Operation Per Second) rappresenta il numero di operazioni in virgola mobile eseguite in un secondo dal microprocessore. Esso è un parametro necessario per la valutazione della potenza di calcolo. II Single Instruction Multiple Data. Un' architettura SIMD è un' architettura in cui sono presenti unità che elaborano dati in parallelo. Si possono dunque ottenere più risultati attraverso un' unica istruzione. 6

7 In seguito l'azienda fornì i primi dettagli relativi all' architettura MIC, che aveva ereditato molti elementi dal progetto Larrabee. Il prodotto tuttavia non sarebbe stato una GPU, ma un coprocessore per l' High Performance Computing. Il primo prototipo fu chiamato Knights Ferry. Successivamente si passò al Knights Corner, il primo prodotto commerciale manycore della Intel e primo coprocessore della famiglia Xeon Phi. 1.2 Principali caratteristiche Gli Intel Xeon Phi sono stati specificamente progettati per soddisfare le esigenze delle applicazioni HPC più impegnative. Essi sono costituiti da un numero cospicuo di unità di elaborazione ed un numero ancora maggiore di thread (4 per singolo core) ed offrono notevoli prestazioni, in quanto la velocità più bassa di ogni nucleo è compensata da un elevato grado di parallelismo. Tra le principali caratteristiche degli Xeon Phi, abbiamo: L' architettura Intel Many Integrated Core (MIC), costituita da piccoli ed efficienti core con unità di elaborazione vettoriale a 512 bit (unità SIMD); Un modello di programmazione familiare all' architettura Intel, che consente un ampio riuso del codice esistente; L'esecuzione di applicazioni scritte in linguaggi di programmazione standard come Fortran, C e C ++; L' utilizzo di transistor tri-gate; La presenza di un connettore PCI Express (Peripheral Component Interconnect Express). In particolare analizziamo le ultime due caratteristiche relative all'innovativa tecnologia utilizzata, i transistor tri-gate e il connettore PCI Express. 7

8 1.2.1 Transistor tri-gate [16] Per la realizzazione degli Xeon Phi sono stati utilizzati transistor tri-gate o 3D. La nuova tecnologia fu annunciata da Intel nel 2002, tuttavia è stata commercializzata parecchi anni più tardi, abbinata al processo produttivo a 22 nanometri. In questi transistor un'aletta (o fin) di silicio tridimensionale, utilizzata in sostituzione del tradizionale gate planare, si innalza dal substrato di silicio. Rispetto ai transistori bidimensionali, in cui era presente un solo gate sulla parte superiore, vengono implementati altri due gate su ciascun lato dell'aletta. Figura 1 [3] Ciò ha permesso di ottenere numerosi vantaggi, tra cui: Aumento del flusso di corrente quando il transistor è in stato on; Riduzione del flusso di corrente quando il transistor è in stato off; Maggiore rapidità di commutazione dallo stato on a quello off (e viceversa); Riduzione della tensione necessaria per il funzionamento del transistor; Riduzione del problema "leakage" III, che può comportare errori e perdite di potenza. III Fenomeno per cui una piccola quantità di corrente riesce a scorrere attraverso il transistor in stato di interdizione. 8

9 Solitamente per applicazioni ad elevate prestazioni viene utilizzato un numero maggiore di alette parallele, al fine di massimizzare gli effetti del transistor tri-gate distribuendo tensioni e correnti. Figura 2 [3] [36] [40] Bus PCI Express I prodotti Xeon Phi possono connettersi al sistema con un processore Intel Xeon, noto anche come "host", tramite un bus PCI Express. Si tratta di un bus d'interconnessione basato su un trasferimento dei dati seriale e costituito da una serie di canali che, aggregati tra loro, consentono un aumento della banda passante disponibile [47]. Il PCIe è stato progettato per sostituire gli standard PCI, PCI-X e AGP ed offre slot x1 (18 pin), x4 (32 pin), x8 (49 pin) e x16 (82 pin). Numerose le versioni prodotte in questi anni: dal primo PCI Express 1.0a del 2003 con una banda passante di 250 MB/s per canale e un tasso di trasferimento di 2,5 GT/s (Giga Transfer al secondo), si è giunti al PCI Express 3.1 con una banda passante di 1 GB/s per canale e un tasso di trasferimento di 8 GT/s. Per il 2018 si attende il debutto del PCIe 4.0, che permetterà un raddoppio della banda massima complessiva rispetto al PCI Express Knights Corner: la prima generazione La prima generazione della gamma Xeon Phi è stata indicata con il nome in codice Knights Corner ed è in commercio a partire dal novembre del Essa integra dai 57 ai 61 core ed è stata realizzata con il processo di produzione a 22 nanometri, utilizzando strutture a transistor tri-gate di dimensioni pari a 22 miliardesimi di metro. In grado di raggiungere circa un TeraFLOPS di potenza di elaborazione a precisione doppia, gli Knights Corner possono essere utilizzati solamente come scheda PCIe a supporto dei processori Intel Xeon. Essi possono agire sotto il sistema operativo host o come un server indipendente eseguendo Red Hat Enterprise Linux o SuSE Linux [39]. 9

10 Di seguito è riportata la lista dei modelli prodotti [37] [48] : Xeon Phi x100 Numero di core (threads) 3120A 3120P 57 (228) S1P 5120D 60 (240) P 7120X Frequenza di clock di base (MHz) Frequenza di clock turbo IV (MHz) 7120P 7120A 7120D SE10P 61 (244) 61 (244) SE10X - Dimensione massima di memoria (Gb) 6 8 Oggi questi coprocessori sono indicati con il nome "Intel Xeon Phi x100" e sono già passati in secondo piano rispetto alla nuova generazione Xeon Phi Knights Landing Composizione della scheda e microarchitettura [2] [4] La scheda del coprocessore Knights Corner è composta dai seguenti sottosistemi: Coprocessore MIC con sistema di clock integrato e memoria GDDR5; System Management Controller V (SMC), sensori termici e una ventola (solamente per i modelli 3120A e 7120A); Connessioni PCI Express; Regolatori di tensione alimentati dalla scheda madre tramite il connettore PCI Express e due connettori ausiliari di alimentazione. IV Fa riferimento alla tecnologia Intel Turbo Boost, che accelera la frequenza del processore. V Controller capace di gestire il corretto funzionamento dell alimentazione e di alcune componenti hardware. 10

11 Figura 3 [2] Per quanto riguarda la microarchitettura, nel coprocessore Knights Corner sono presenti core di elaborazione, cache L2, controller di memoria e logica client PCIe. Tutti questi elementi sono collegati attraverso un'interconnessione bidirezionale ad anello. Vi è inoltre una tag directory distribuita, il cui compito è mantenere coerente il contenuto delle cache e mappare in modo univoco gli indirizzi fisici. Attraverso l'uso dei controller di memoria GDDR e della logica client PCIe viene fornita un'interfaccia diretta alla memoria GDDR5 rispettivamente sul coprocessore e sul bus PCIe. Di seguito è possibile osservare uno schema a blocchi semplificato del coprocessore: Figura 4 [4] 11

12 Il sistema coerente della cache sfrutta tre tipologie di anelli: il data block ring, che è il più costoso ed è in grado di trasportare un intero blocco di dati della cache; l'address ring, utilizzato per mandare indirizzi di memoria e comandi di lettura/scrittura e l' acknowledgement ring, che è il più piccolo ed è usato per inviare messaggi di controllo del flusso e di coerenza. Durante un accesso in memoria, se si verifica un cache miss VI, il core genera un' address request e la invia sull'address ring, interrogando le tag directiories per trovare il blocco di dati desiderato. Se i dati richiesti non si trovano in nessuna cache, il core genera un' ulteriore address request chiedendo l'intervento del controllore di memoria. Una volta recuperato il blocco di dati, esso verrà restituito all'unità di elaborazione attraverso il data block ring. VI Indica un fallimento della cache. I dati richiesti non possono essere letti o scritti in memoria. 12

13 Capitolo 2: I processori Xeon Phi Knights Landing "Knights Landing" è il nome in codice per la seconda generazione della famiglia Xeon Phi, in commercio a partire dal giugno del Indicati anche con il nome "Xeon Phi x200", i chip Knights Landing (KNL) hanno circa 8 miliardi di transistor tri-gate e sono prodotti a 14 nanometri. Si tratta di processori altamente scalabili, che possono raggiungere livelli elevati di prestazioni e parallelismo senza rinunciare alla programmabilità. Rispetto ai coprocessori Knights Corner, essi presentano un numero di core maggiore con una frequenza di clock leggermente più alta. Il loro prezzo si aggira attorno alle migliaia di dollari. Sono stati realizzati diversi modelli [14] : Xeon Phi x200 Numero di core (threads) Frequenza di clock di base (MHz) Frequenza di clock turbo (MHz) Potenza massima di calcolo in doppia precisione (GFLOPS) F F (256) 68 (272) F (288) F 13

14 Il KNL è attualmente disponibile in due configurazioni: Processore host autonomo. In questo modo non è più legato al bus PCIe e può essere inserito sulla scheda madre come CPU principale. Può dunque lanciare ed eseguire un sistema operativo a tutti gli effetti; Processore host autonomo con architettura Omni-Path integrata. Inizialmente era presente anche una versione di coprocessore, similmente agli Knights Corner. Tuttavia, nell'agosto del 2017, l' Intel ha informato del ritiro dal mercato dei coprocessori KNL tramite un post sul proprio blog [13]. La scelta sembrerebbe dovuta al successo dei processori, che avrebbe portato l'azienda a concentrarsi su di essi perché considerati più profittevoli [22]. Andremo ora ad analizzare l'architettura del processore Knights Landing, suddividendolo in tre sottosistemi principali [12] : Il sottosistema di calcolo, costituito da "tile" VII collegati attraverso un' interconnessione a rete; Il sottosistema di memoria, costituito da una memoria MCDRAM di 16 GB, a cui si può accedere attraverso 8 controllori, e una memoria DDR4, accessibile attraverso due controllori a tre canali; Il sottosistema di I/O, composto da 36 linee PCIe 3.0, 4 linee DMI (Direct Media Interface) e un controller Omni-Path opzionale. 2.1 Il sottosistema di calcolo Le unità di elaborazione del processore Knights Landing sono organizzate in tile. Un tile è costituito da [8] : 2 core, ciascuno con 2 VPU VIII AVX-512; Una memoria cache L2 di 1 MB; Un Cache/Home Agent (CHA). VII Tradotto: mattonella, piastrella. VIII Vector Processing Unit. Si tratta di un' unità che esegue operazioni su vettori di dati. 14

15 Figura 5 [5] Il KNL presenta una nuova interconnessione a rete 2D con collegamenti bidirezionali, che connette i tile, i controllori di memoria, i controllori di I/O e altri agenti sul chip [6]. Al suo interno, troveremo al massimo un totale di 36 tile attivi (72 core) e 36 MB di memoria cache L Il core [1] [6] Il core del processore Knights Landing è stato modificato notevolmente rispetto a quello del precedente Knights Corner per soddisfare al meglio le applicazioni HPC. Si tratta di una nuova unità di elaborazione two-wide IX e con pipeline out-of-order X, basata su una microarchitettura Silvermont. IX Può eseguire 2 istruzioni per ciclo. X Le istruzioni non devono necessariamente seguire l' ordine indicato dal programma. Esse vengono assemblate a seconda delle dipendenze, eseguite in parallelo e poi riordinate. 15

16 Nonostante il core sia two-wide dal punto di vista delle operazioni di decodifica, allocazione e retire; può arrivare ad eseguire sino a 6 operazioni per ciclo (2 operazioni di memoria, 2 di interi e 2 in virgola mobile). Esso inoltre dispone di un supporto buffer maggiore, utilizzato per migliorare il parallelismo a livello di istruzione. Di seguito è possibile osservare il diagramma di flusso dei dati del core e della VPU, che mostra i principali buffer e registri: Figura 6 [6] Esso è diviso, in modo approssimativo, in cinque unità: la front-end unit (FEU), l' allocation unit (AU), l' integer execution unit (IEU), la memory execution unit (MEU) e la VPU. La FEU (in marrone sulla figura) comprende un' instruction cache (IL1) di 32 KB e un instruction Translation Lookaside Buffer XI (i-tlb) di 48 entries. Essa ha il compito di effettuare il fetch, la decodifica delle operazioni e la branch prediction (predizione delle XI Si tratta di un buffer di supporto, utilizzato per incrementare la velocità di traduzione degli indirizzi virtuali. Nei sistemi più avanzati, è una vera e propria memoria cache. 16

17 diramazioni). Divide inoltre le operazioni in micro operazioni (µops) più semplici e le consegna all'allocation unit. La maggior parte delle operazioni viene codificata in una sola micro operazione. In ogni ciclo possono essere decodificate al massimo due istruzioni, che vengono poi inserite in un' Instruction Queue (IQ) di 32 entries. L' AU (corrispondente al blocco Allocate/Rename) ha il compito di preparare le µops per l'esecuzione out-of-order. Essa assegna le risorse della pipeline, come le 72 entries del reorder buffer XII (ROB) e del rename buffer XIII (RB), gli store data buffer, le entries della tabella gather/scatter XIV e della reservation station (RS o stazione di prenotazione). Essa inoltre rinomina i registri sorgente e destinazione delle µops nel rename buffer. Il RB conserva i risultati delle µops fin quando esse non terminano, successivamente questi vengono trasferiti nel Register File (RF). Dopo essere passate nell' AU, le µops sono mandate ad un' unità di esecuzione (IEU, MEU o VPU) in base al tipo. Alcune potrebbero essere inviate a più di un' unità. L' AU è 2-wide, nel senso che legge ed esegue 2 µops per ciclo. Le µops che non possono ottenere tutte le risorse richieste restano nell' AU finché quelle risorse non diventano disponibili. L' IEU (in blu sull' immagine) esegue le micro operazioni di interi. Ogni core possiede due IEU, ognuna delle quali contiene una Reservation Station di 12 entries in grado di eseguire una micro operazione per ciclo. La MEU (in verde chiaro) esegue micro operazioni di memoria e serve le richieste di fetch per gli i-cache miss e gli i-tlb miss. In un ciclo, essa può eseguire fino a due operazioni di memoria, come il caricamento o la memorizzazione. XII Il reorder buffer (buffer di riordino) è un buffer utilizzato per implementare l' esecuzione out of order. Esso memorizza l' ordine reale di esecuzione delle istruzioni del programma. XIII Il rename buffer (buffer di rinomina) è utilizzato per incrementare il parallelismo a livello di istruzione. In esso sono memorizzati i nomi temporanei di alcuni registri, che vengono rinominati per permettere l'esecuzione parallela delle istruzioni che necessitano di uno stesso registro di destinazione. XIV Il gather-scatter può essere considerato l'equivalente vettoriale dell'indirizzamento indiretto. 17

18 All'interno della MEU troviamo 2 TLB e una memoria data cache L1 (DL1) di 32 KB, che supporta due letture simultanee e una scrittura, entrambe a 512 bit. Le operazioni di memoria sono eseguite in-order dalla RS, ma possono essere eseguite anche out-of-order. Se le micro operazioni non sono completate con successo, vengono allocate nel recycle buffer e riportate nella pipeline MEU finché non sono risolti i loro conflitti. La MEU inoltre contiene logica specializzata per gestire le istruzioni di gather/scatter efficientemente. La VPU (in arancione) è l'unità di esecuzione vettoriale in virgola mobile del KNL. Essa può arrivare ad eseguire 32 operazioni a precisione singola o 16 operazioni a precisione doppia per ciclo. Ogni core possiede 2 VPU, che forniscono supporto per le divisioni di interi, per le istruzioni legacy XV e le nuove istruzioni AVX-512. Ciascuna di esse contiene una reservation station di 20 entries, in grado di eseguire una micro operazione out-of-order per ciclo Hyper-threading e gestione delle risorse Il core del Knights Landing supporta fino ad un massimo di 4 thread attraverso l'uso di tecniche di Simultaneous Multi-threading (STM). L' STM permette l'esecuzione di più thread contemporaneamente e mantiene le unità di elaborazione sempre operative utilizzando le istruzioni dei singoli thread [26], che fluiscono attraverso la pipeline simultaneamente. Con il nome "hyper-threading" si vuole indicare la tecnologia sviluppata da Intel, basata sull' STM. Tale tecnologia permette al sistema operativo di vedere più core, detti core logici, in presenza di un' unica unità di elaborazione [27]. XV Istruzioni presenti nelle precedenti versioni di Xeon Phi. 18

19 Ogni core fisico può dunque elaborare contemporaneamente fino a 4 thread, utilizzando in modo più efficiente le risorse del processore. Dal punto di vista logico, ogni core è equivalente ad un quad-core. Di seguito è possibile osservare lo schema di funzionamento dell' STM, in cui vengono eseguite in parallelo istruzioni di thread diversi. Figura 7 [7] Per quanto riguarda invece la gestione delle risorse tra thread, queste possono essere partizionate, condivise o replicate in modo dinamico. Le risorse partizionate dinamicamente sono i reorder buffer, i rename buffer, gli store data buffer, le reservation station, l' instruction queue e le entries della tabella gather-scatter. Le risorse condivise invece sono le cache, i TLB, la maggior parte delle strutture MEU, i branch predictors e le tabelle di prefetcher hardware. Infine abbiamo le strutture replicate, che sono limitate al minimo indispensabile e includono le tabelle di rename, gli architectural register (i register file) e i control register. Sono presenti inoltre dei thread selectors in alcuni punti delle pipeline dei core per aumentare il throughput e mantenere equità tra i thread. Essi considerano la disponibilità delle risorse e cercano di effettuare le giuste selezioni. L'obiettivo è massimizzare le risorse nei thread attivi, ovvero nei thread in esecuzione che non sono sospesi/terminati e non hanno eseguito un' operazione di wait su un monitor. A seconda del numero di thread attivi, sono definite le seguenti modalità: 19

20 Single-thread: quando è attivo un unico thread; Dual-thread: quando sono attivi 2 thread; Quad-thread: quando sono attivi 3 o 4 thread. Le risorse sono poi equamente distribuite tra i thread in base alla modalità di threading. [6] Instruction Set Architecture (ISA) [12] Il KNL, essendo compatibile con i prodotti Intel Xeon, supporta tutte le precedenti estensioni ISA (x86/mmx, SSE, AVX, AVX2 e BMI), eccetto TSX. Oltre a queste, introduce le istruzioni AVX-512, che forniscono un supporto SIMD a 512 bit e possono essere divise in 4 categorie: Le istruzioni di base AVX-512F, che rappresentano l'estensione a 512 bit dei precedenti AVX e AVX2 a 256 bit; Le istruzioni esponenziali e reciproche AVX-ER; Le istruzioni di rilevamento dei conflitti AVX-CD; Le istruzioni di prefetch AVX-PF. Sono stati introdotti inoltre notevoli miglioramenti relativi all' architettura, tra cui: 16 nuovi registri SIMD a 512 bit (per un totale di 32); 8 registri opmask (k0-k7) per l'esecuzione condizionale e il merge degli operandi; Supporto per il set di vettori e di registri SIMD; Supporto per gather/scatter; Un nuovo prefisso (EVEX) per supportare la codifica delle istruzioni fino a 512 bit Memorie cache [1] [6] [28] Le memorie cache sono suddivise in linee (cache line) contenenti un blocco di dati contiguo di 64 byte, che rappresenta i contenuti di un blocco di memoria DDR di uguale grandezza. Il processore KNL, come molti altri processori moderni, possiede diversi tipi di cache con velocità e dimensioni differenti. 20

21 All' interno di ogni core troviamo una memoria data cache L1 (DL1) e una memoria instruction cache L1 (IL1), entrambe writeback XVI, 8-way set associative XVII e di 32 KB. È possibile calcolare il numero di line contenuto in ogni cache attraverso la formula: Numero di cache line = dimensione della memoria/ dimensione del blocco dati. Ad esempio, nel caso della memoria cache L1 avremo: 32 Kbytes / 64 bytes = 512 cache line. Dunque la memoria cache L1 può contenere fino a 512 blocchi di dati. Se viene inserito un blocco oltre questo numero, un altro deve essere rimosso. La cache L2 è invece condivisa tra due core all'interno di ogni tile ed è una memoria 16- way set associative di 1 MB, in grado di eseguire la lettura di 1 cache line e la scrittura di 1/2 cache line per ciclo. Ogni cache L2 è mantenuta coerente dalla BIU (Bus Interface Unit) attraverso l'utilizzo del protocollo MESIF XVIII. La BIU rappresenta l'unità locale di gestione della cache comune e contiene un prefetcher hardware L2 (L2 HWP), che viene addestrato sulle richieste provenienti dai core attraverso un' interfaccia dedicata. Se si accede alla cache L1 e i dati o le istruzioni necessarie non si trovano lì, viene mandata una richiesta attraverso il prefetcher hardware L1 alla cache condivisa L2. Se il blocco è presente, la cache L2 risponde fornendo il blocco di dati di 64 byte necessario, riempiendo la linea di cache L1 con il suo contenuto. Se esso non è presente nella cache L2, la richiesta è inoltrata direttamente alla rete attraverso il Cache/Home Agent. In questo caso, il blocco di dati potrà essere fornito da una cache L2 presente in un altro tile, dalla memoria DDR oppure dalla MCDRAM, nel caso in cui essa sia utilizzata come memoria cache L3 XIX. XVI Politica che consente la scrittura dei dati in differita. Inizialmente le informazioni vengono scritte solo nella cache. Successivamente, quando il blocco deve essere eliminato per fare spazio ad altri dati, viene aggiornata la memoria principale. XVII Ciascun blocco di memoria ha a disposizione 8 locazioni di cache. XVIII Protocollo in cui qualsiasi blocco interno alla cache può trovarsi nello stato: Modified (il blocco è stato modificato e la sua copia in memoria principale non è aggiornata), Exclusive (il blocco non è stato modificato ed è unico), Shared (blocco condiviso con altre cache), Invalid (blocco invalido) o Forward (ultimo blocco letto). XIX Si fa riferimento alla modalità cache. Verrà trattata successivamente. 21

22 Figura 8 [6] Quindi il processore KNL possiede una memoria cache IL1 e DL1 per ogni core e una memoria cache L2 per ogni tile, connessa alle altre attraverso una rete a maglia. Come il coprocessore KNC, il KNL dispone di una tag directory distribuita per mantenere la coerenza delle cache. Essa è costituita da un insieme di tag directiories (TDs), che sono parte del CHA e il cui compito è identificare lo stato e la posizione delle cache line presenti nel processore. Per gestire la complessità e impostare il metodo di funzionamento ottimale per le varie applicazioni, il programmatore può utilizzare le modalità di clustering della cache [42]. Queste modalità forniscono diversi livelli di affinità di indirizzo per migliorare le prestazioni e possono essere selezionate all'avvio, entrando nel BIOS. Esse sono: La modalità all-to-all; La modalità quadrante; La modalità sub-numa La modalità all-to-all In questa modalità gli indirizzi sono distribuiti uniformemente in tutte le tag directories e su tutta la memoria. Ogni tile può richiedere dati presenti in una qualsiasi parte del chip. Si tratta della modalità più generale, con il modello di programmazione più semplice ma prestazioni inferiori rispetto alle altre. Non c'è alcuna affinità tra tile, directory e memoria. Nella figura 9 alla pagina seguente è possibile osservare una transazione relativa ad un cache miss di una cache L2. Essa porterà solitamente all'attraversamento di lunghe distanze all'interno del chip. 22

23 Figura 9 [8] 1. Si verifica un cache miss di una cache L2; 2. Il tile manda una richiesta alla directory distribuita per verificare se qualsiasi altro tile nel chip abbia l'indirizzo necessario nella sua cache; 3. Se i dati non sono presenti in nessun altro tile, viene mandata una richiesta alla memoria; 4.La memoria legge i dati e li invia al richiedente. Se la tag directory avesse trovato un tile con i dati richiesti nella propria cache, avrebbe mandato una richiesta a quel tile affinché inviasse i dati La modalità quadrante Questa modalità suddivide il chip in quattro quadranti virtuali, che stabiliscono un certo grado di affinità tra la directory e la memoria. Gli indirizzi sono distribuiti infatti in modo che la tag directory sia nello stesso quadrante della locazione di memoria in cui risiedono i dati. Non c'è invece alcuna affinità con il tile (ciò significa che una richiesta da un tile può arrivare in una qualsiasi directory). Questa modalità cluster richiede memoria simmetrica, ovvero la stessa capacità su entrambi i controller di memoria DDR. Essa è trasparente rispetto al supporto software e 23

24 fornisce una migliore latenza e una larghezza di banda più elevata per i core in esecuzione rispetto alla modalità all-to-all. La figura seguente mostra come un cache miss di una cache L2 fluisca nel chip KNL nella modalità quadrante: Figura 10 [8] 1. Cache miss di una cache L2; 2. Richiesta alla directory distribuita; 3. I dati non sono presenti in nessuna directory. Viene inoltrata la richiesta alla memoria; 4. Invio dei dati dalla memoria La modalità sub-numa (SNC-4/SNC-2) La modalità sub-numa può essere considerata un' estensione della modalità quadrante. Il sistema operativo vede tutti e quattro i quadranti come cluster virtuali (o domini) NUMA XX (SNC-4). In questa modalità è presente affinità tra tile, directory e memoria: ciò significa che una richiesta da un tile accederà ad una directory nel suo cluster e, a sua volta, la directory accederà ai controller di memoria all'interno di quel cluster. L' SNC-4 fornisce la latenza più bassa tra tutte le modalità, in quanto la maggior parte del traffico sarà contenuto all'interno del cluster locale. XX Non Uniform Memory Access. Architettura in cui i tempi di accesso dipendono dalla posizione della memoria. 24

25 Essa non è completamente trasparente rispetto al supporto software, che deve essere ottimizzato NUMA (ovvero deve allocare memoria nello stesso cluster in cui è in esecuzione) per beneficiare di questa modalità. È presente anche una versione SNC-2, che divide logicamente il KNL in due regioni (emisferi) invece che in quattro. Di seguito è possibile osservare le transazioni dovute a un cache miss di una cache L2 con la modalità SNC-4: Figura 11 [8] 1. Cache miss di una cache L2; 2. Richiesta alla directory distribuita; 3. I dati non sono presenti in nessuna directory. Viene inoltrata la richiesta alla memoria; 4. Invio dei dati dalla memoria. 2.2 Il sottosistema di memoria [1] [6] [12] Il processore Knights Landing possiede due tipi di memoria: una multi-channel DRAM (MCDRAM) e una memoria double data rate (DDR). 25

26 La MCDRAM è una memoria a banda larga di 16 GB, che comprende 8 device interagenti con la rete attraverso 8 EDC (Embedded DRAM Controller). Essa è costituita da una serie di DRAM impilate, collegate attraverso un'interconnessione verticale in silicio (through-silicon via). Ogni pila è composta da cinque livelli: quattro di archiviazione e uno logico che controlla il tutto. Ogni DRAM è suddivisa in partizioni. Partizioni corrispondenti di più DRAM formano un canale, ciascuno con un proprio set di dati e indirizzi. Tutti i canali possono essere acceduti in parallelo e forniscono una larghezza di banda elevata (fino a 450 GB/s) per le applicazioni HPC. La MCDRAM inoltre supporta la modalità di self-refresh XXI ed è considerata una variante della HBM (High Bandwidth Memory), che ha soppiantato le memorie GDDR5. La memoria DDR4 invece è una SDRAM accessibile attraverso sei canali (tre per ogni controller DDR MC) che, a seconda del modello di processore, possono lavorare a 2133 o 2400 MHz. La DDR4 fornisce una larghezza di banda aggregata di circa 90 GB/s e uno spazio di archiviazione massimo di 384 GB. I due tipi di memoria sono presentati agli utenti in tre modi diversi: La modalità cache, nella quale la MCDRAM funge da cache per la memoria DDR; La modalità flat, nella quale la MCDRAM è trattata come una memoria standard nello stesso spazio di indirizzamento della DDR; La modalità ibrida, in cui la MCDRAM in parte è memoria cache e in parte memoria standard. Queste modalità possono essere selezionate attraverso il BIOS all'avvio La modalità cache In questa modalità, la MCDRAM viene configurata come una memoria cache L3 direct mapped XXII affiancata alla DDR. Il vantaggio della modalità cache è l'elevata larghezza di banda, mentre lo svantaggio è l'aumento del tempo di latenza. Se infatti si verifica un cache miss della MCDRAM, le richieste "mancate" devono essere prima comunicate alla DRAM corrispondente e XXI Vengono utilizzati dei cicli di refresh per mantenere i dati in memoria. XXII Cache a indirizzamento diretto. A ciascun blocco di memoria corrisponde una locazione della cache. 26

27 successivamente viene mandata un'ulteriore richiesta alla memoria DDR. L'aumento del tempo di latenza è dovuto inoltre al fatto che i dati devono essere trasferiti dalla DDR alla MCDRAM e infine alla cache L2. La modalità cache non richiede alcuna abilitazione software, essa è completamente gestita in hardware. Per le applicazioni che non presentano una buona percentuale di cache hit, possono essere utilizzate le altre due modalità per avere un maggior controllo e sfruttare al meglio la MCDRAM [35]. Figura 12 [9] La modalità flat Nella modalità flat, MCDRAM e DDR sono mappate nello stesso spazio di indirizzamento. La MCDRAM ha dunque uno spazio fisico indirizzabile, che consente al programmatore di Figura 13 [9] spostare le strutture dati dentro e fuori di essa. Il sistema è visto come un dominio NUMA a due nodi. Questa modalità offre la larghezza di banda più elevata e la latenza più bassa rispetto alle altre e permette di incrementare la dimensione della memoria del sistema, in quanto si aggiungono allo spazio di indirizzamento i 16 GB della MCDRAM. Il principale svantaggio della modalità flat è che sono necessarie delle modifiche software per utilizzare sia la memoria DDR che la MCDRAM nella stessa applicazione. Per allocare esplicitamente dati nella MCDRAM si possono utilizzare: Le funzioni "fast malloc" della libreria Memkind; Gli attributi FASTMEM in Fortran. Nella figura 14 possiamo osservare dei semplici esempi di codice, che mostrano l' utilizzo della funzione hbw_malloc e degli attributi FASTMEM. 27

28 Figura 14 [8] Dalla modalità flat derivano la modalità MCDRAM-only e DDR-only. In questi casi, sarà presente un unico tipo di memoria all'interno del sistema e i programmi eseguiranno allocando tutta la loro memoria nella MCDRAM o nella DDR La modalità ibrida La terza modalità è chiamata "Modalità ibrida" e divide la MCDRAM in due: una parte di essa viene utilizzata in modalità cache e un'altra parte in modalità flat. Sono presenti 2 varianti della modalità ibrida: Hybrid25, in cui il 25% della MCDRAM è utilizzato come memoria cache, e Hybrid50, che utilizza invece il 50%. Nella modalità ibrida è necessaria l'abilitazione del software per accedere alla sezione di MCDRAM in modalità flat, mentre la sezione in modalità cache non richiede alcun supporto software. Figura 15 [9] 2.3 Il sottosistema di I/O Dal punto di vista dell' I/O, le varianti del Knights Landing si presentano in modo diverso. Il chip di base presenta tre porte PCIe 3.0 (due x16 e una x4) e una porta DMI x4, utilizzata per effettuare il collegamento ai PCH XXIII (Platform Controller Hub). La XXIII Chip Intel in grado di controllare alcuni data path e funzioni di supporto, utilizzato in combinazione con il processore. 28

29 versione di processore del KNL permette l'inserimento sulla scheda madre come un normale processore attraverso il socket LGA Per la versione di coprocessore, era invece necessario utilizzare una porta PCIe per collegarlo al sistema. Questa versione del chip aveva i canali di memoria DDR4 disattivati e si poteva accedere solamente ai 16 GB della MCDRAM, oltre che a quelli del processore host [25]. Probabilmente la versione del KNL più interessante da una prospettiva I/O [12] è quella che dispone di due porte Omni-Path, che consentono di raggiungere una velocità di trasferimento dati pari a 100 GB/s L'architettura Omni-Path (OPA) L' Omni-Path è un' architettura di comunicazione ad alte prestazioni della Intel, che permette l' esecuzione di una vasta gamma di applicazioni computazionali a nodi multipli. Essa offre una bassa latenza di comunicazione, un basso consumo energetico e un'elevata ampiezza di banda. L' Omni-Path è un componente chiave dello Scalable System Framework, un modello di progettazione dell'architettura che ottimizza le prestazioni di sistemi su qualunque scala [29]. È possibile identificare le versioni del KNL con Omni-Path attraverso le due porte integrate sul package del processore. Come abbiamo detto in precedenza, il chip può essere inserito all'interno del socket LGA 3647, che presenta un'apertura per il connettore Omni-Path [23]. Figura 16 [8] 29

30 I principali componenti dell' architettura OPA sono [10] : Gli Host Fabric Interface, che forniscono connettività tra i nodi; Gli Switch, che permettono di creare topologie per la connessione dei vari endpoint; Il Fabric Manager, che monitora e provvede alle risorse. Figura 17 [10] Il sistema è costituito inoltre da layers (livelli): Livello 1: si tratta del livello fisico, che sfrutta gli standard Ethernet e InfiniBand XXIV ; Livello 1.5: permette la consegna affidabile dei pacchetti al Livello 2; Livello 2: si tratta del livello Data Link, che si occupa dell'indirizzamento, dell'allocazione delle risorse, dello switching e del partizionamento; Livelli 4-7: si occupano del trasporto ai livelli applicativi. XXIV Protocollo di comunicazione con elevato throughput e bassa latenza, utilizzato per l'interconnessione tra processore e dispositivi di I/O. 30

31 Capitolo 3: Introduzione alla programmazione L'obiettivo di questo capitolo è mostrare l'impatto che l'architettura MIC ha sul software attraverso la programmazione. Ciò ci permetterà di conoscere e comprendere al meglio il comportamento degli Xeon Phi e il modo in cui essi eseguono le diverse applicazioni. 3.1 Modalità di esecuzione Il grande vantaggio degli Xeon Phi è quello di poter programmare utilizzando linguaggi semplici (C, C++, Fortran) e modelli standard per il calcolo parallelo (OpenMP, MPI). In generale, per i coprocessori possiamo distinguere diverse modalità di esecuzione del codice [30] : La modalità di esecuzione offload: il sistema host (il processore Intel Xeon) scarica tutto il lavoro o una parte di esso al coprocessore Xeon Phi; La modalità di esecuzione nativa: il coprocessore può essere visto come un ulteriore nodo di calcolo e l' intera applicazione viene eseguita su di esso; La modalità di esecuzione simmetrica: in questo caso l'applicazione esegue sia sull' host che sul coprocessore Xeon Phi; La modalità di esecuzione host: l'applicazione esegue solo sul sistema host. Il processore KNL supporta le stesse modalità di esecuzione [41], nonostante abbia un ruolo diverso. Esso lavora come un normale processore Intel, tuttavia bisogna tener conto dell'elevato numero di core e del parallelismo che lo caratterizzano. 31

32 3.2 OpenMP OpenMP (Open Multiprocessing) è un'api per il calcolo parallelo a memoria condivisa, supportata da vari sistemi operativi (Solaris, macos, Linux, Windows, ecc.). Essa permette la parallelizzazione del codice attraverso delle direttive, che vengono interpretate come commenti e dunque consentono la compilazione ed esecuzione in seriale senza alcuna modifica. Tali direttive in Fortran devono essere precedute dalla sentinella!$omp, mentre in C/C++ devono seguire le istruzioni #pragma omp [43] Esempi di codice Presentiamo ora un esempio di codice elementare scritto in C, che mostra l'inizializzazione di un array, utilizzando le direttive OpenMP: Figura 18 Inizialmente è presente un unico thread. Esso esegue il codice sequenzialmente fino alla direttiva #pragma omp parallel for e successivamente crea un pool di thread, diventandone il master. L'array definito viene poi inizializzato in parallelo, utilizzando ogni thread attivo per svolgere il lavoro. Il costrutto #pragma omp parallel for serve infatti a distribuire il loop for a tutti i thread del pool corrente. Sono inoltre presenti: La libreria omp.h, che fornisce gli strumenti necessari per la scrittura di codice multi-thread; 32

33 La funzione omp_get_thread_num(), che restituisce l' id del thread. Per creare l' eseguibile con compilatore GCC, viene usato il flag -fopenmp : gcc -fopenmp test.c -o test La variante in Fortran di questo esempio è la seguente: Figura 19 Per la creazione dell' eseguibile, in questo caso, dovrà essere utilizzata la sintassi: gfortran -fopenmp -o test test.f90 33

34 Di seguito è possibile osservare un ulteriore esempio, in cui la funzione domult realizza una moltiplicazione tra 2 matrici quadrate A e B e inserisce il risultato in una matrice C: Figura 20 [11] In questo caso abbiamo un'esecuzione in modalità offload: la direttiva #pragma offload target (mic:mic_dev) ci permette infatti di specificare il particolare dispositivo che dovrà eseguire il codice. Attraverso i termini in e out, possiamo inoltre controllare il trasferimento dei dati tra l'host e il coprocessore. In particolare, in indica i dati che fluiscono dall' host al coprocessore, mentre out quelli che fluiscono dal coprocessore all' host. Successivamente verrà inizializzata a zero la matrice C e verrà eseguita la moltiplicazione tra le matrici A e B. Entrambe queste operazioni verranno effettuate in parallelo da 2 pool di thread distinti. Come si può vedere dalla figura, è possibile definire la visibilità delle variabili e dei costrutti attraverso degli attributi di condivisione: default e shared. Solitamente la maggior parte delle variabili è visibile per default a tutti i thread (essendo OpenMP un modello di programmazione a memoria condivisa), talvolta invece occorrono delle variabili private (per evitare ad esempio fenomeni di Race Condition XXV ) [15]. XXV Condizione in cui più processi o thread operano su dati condivisi e il risultato ottenuto dipende dall'ordine di esecuzione delle istruzioni. 34

35 3.3 Intel Xeon Phi vs GPGPU Nvidia [44] [46] Per evidenziare e comprendere al meglio i livelli prestazionali ottenibili attraverso l' utilizzo dell' architettura Intel MIC, verrà effettuato ora un breve confronto tra gli Xeon Phi e le GPGPU XXVI Nvidia. La differenza principale tra i due è innanzitutto l'architettura hardware. Le GPGPU Nvidia infatti usufruiscono dell' architettura CUDA (Compute Unified Device Architecture) per il calcolo parallelo, che permette la programmazione in linguaggi semplici (come C, C++, Fortran, Python, MATLAB) con delle particolari estensioni. Esse utilizzano l' OpenACC XXVII (Open ACCelerators) per la semplificazione della programmazione parallela e le librerie OpenCL e DirectCompute. Nell' immagine seguente è possibile osservare un esempio di codice scritto in C di una funzione saxpy XXVIII ed il suo equivalente per il calcolo parallelo in CUDA C: Figura 21 [45] Uno svantaggio delle GPGPU è invece legato al ruolo subordinato che esse hanno rispetto alla CPU. Infatti, a differenza del processore KNL che può eseguire un vero e proprio sistema operativo, le GPGPU sono delle unità di elaborazione che agiscono a sostegno XXVI General-Purpose computing on Graphics Processing Units. Si tratta di una GPU utilizzata per scopi diversi, non legati alla computer grafica. XXVII Modello di programmazione basato sull' utilizzo di direttive utili per la parallelizzazione del codice. XXVIII Si tratta di una funzione che implementa una moltiplicazione e un' addizione vettoriale. 35

36 della CPU. Dunque esse devono essere necessariamente collegate al sistema attraverso un connettore PCIe (fatta eccezione per NVLink). Ciò comporterà dei costi di trasferimento dei dati dall' host alla scheda e viceversa. Per quanto concerne la programmazione, l' Intel sta puntando sul fatto che per gli Xeon Phi sia necessaria solamente la ricompilazione ed esecuzione del codice, in quanto essi utilizzano un modello di programmazione familiare all' architettura MIC. In realtà, queste operazioni rallentano l'applicazione in maniera notevole poiché bisogna affrontare diversi problemi tecnici, tra cui la legge di Amdahl XXIX per le porzioni seriali del codice. Il programmatore dovrebbe dunque ricompilare il codice ed impegnarsi per la sua ottimizzazione, oltre che per ottenere un buon grado di parallelismo. Nonostante le differenze, possiamo comunque considerare Xeon Phi e GPGPU Nvidia simili sotto certi aspetti. I programmatori infatti utilizzano tecniche di ottimizzazione e metodi per l'accelerazione del codice simili: librerie, direttive ed estensioni (come CUDA C per le GPGPU o le funzioni intrinseche vettoriali per gli Xeon Phi), che possiamo vedere nella seguente tabella: Figura 22 [46] Tuttavia l'accelerazione risulta superiore nelle GPGPU. Con il medesimo sforzo da parte del programmatore, è possibile infatti ottenere il doppio della performance. Ciò spiega perché si preferisce utilizzare le GPGPU Nvidia rispetto agli Xeon Phi per le applicazioni HPC altamente parallele (con una superiorità di 20 a 1). XXIX Legge dell' ingegnere ed informatico statunitense Gene Amdahl, utilizzata per stimare il massimo miglioramento possibile attraverso la modifica di una o più parti del sistema. Viene solitamente usata nell'ambito del calcolo parallelo per determinare la massima velocità raggiungibile, che dipende dalla quantità di codice sequenziale e parallelizzabile del programma. 36

37 Conclusioni L evoluzione tecnologica ha permesso di passare dal primo microprocessore monolitico, il 4004 del 1971, contenente 2300 transistor e prodotto con tecnologia a nanometri, all attuale Xeon Phi Knights Landing, costituito da circa 8 miliardi di transistor e realizzato con tecnologia a 14 nanometri. Si sta già lavorando alla terza generazione di processori della famiglia Xeon Phi, dal nome in codice "Knights Hill", che sarà probabilmente disponibile a partire dal 2018 e sarà realizzata con tecnologia a 10 nm [32]. Nel corso di questi anni, sono avvenuti dei cambiamenti radicali che hanno rivoluzionato il mondo dei transistor, dei chip e dei processori. Da un' iniziale ricerca di integrazione circuitale e aumento della frequenza di clock, si è passati alla ridefinizione della geometria del transistor e ad un elevato numero di core. Sino ad oggi, l' Intel ha continuato a sviluppare prodotti seguendo i dettami della "legge" di Gordon Moore, cofondatore dell'azienda, secondo cui: «La complessità di un microcircuito, misurata ad esempio tramite il numero di transistori per chip, raddoppia ogni 18 mesi (e quadruplica quindi ogni 3 anni).» [20] Tuttavia sarà necessaria una nuova strategia per il futuro. La legge di Moore, che si è dimostrata valida per molto tempo, dovrà scontrarsi con i limiti tecnologici. I transistori infatti hanno quasi raggiunto il loro limite dimensionale, oltre il quale i fenomeni fisici assumono un comportamento quantistico e probabilistico [19]. 37

38 L'unica soluzione per tenere in vita questa legge è l' utilizzo di nuovi materiali e strutture. Questo sarà il punto di partenza per nuove innovazioni tecnologiche, che porteranno l' Intel alla produzione di processori sempre più all' avanguardia e permetteranno di mantenere la legge di Moore ancora attuale. 38

39 Bibliografia e siti web [1] James Jeffers, James Reinders, Avinash Sodani, "Intel Xeon Phi Processor High Performance Programming: Knights Landing Edition", Morgan Kaufmann, [2] Intel Xeon Phi Coprocessor x100 Product Family - Datasheet [3] [4] [5] [6] [7] [8] [9] KNL_Memory.pdf/a5c820a8-5d4b e5c e846 [10] [11] [12] [13] [14] [15] 39

40 [16] [17] [18] [19] [20] [21] [22] [23] [24] [25] [26] [27] [28] [29] [30] [31] [32] [33] [34] [35] [36] [37] 40