Architetture per il calcolo parallelo Moreno Marzolla Dip. di Informatica—Scienza e Ingegneria (DISI) Università di Bologna http://www.moreno.marzolla.name/ Copyright © 2013, 2014, Moreno Marzolla, Università di Bologna, Italy (http://www.moreno.marzolla.name/teaching/AA2014/) This work is licensed under the Creative Commons Attribution-ShareAlike 3.0 License (CC-BY-SA). To view a copy of this license, visit http://creativecommons.org/licenses/bysa/3.0/ or send a letter to Creative Commons, 543 Howard Street, 5th Floor, San Francisco, California, 94105, USA. Algoritmi Avanzati--modulo 2 2 Una architettura parallela astratta CPU CPU CPU CPU Rete di interconnessione Memoria ● ● ● Memoria Memoria Come è gestito il parallelismo? Dove si trova fisicamente la memoria? Quale è la topologia della rete di comunicazione? Algoritmi Avanzati--modulo 2 3 Perché studiamo le architetture parallele? ● Non esiste il “calcolatore parallelo tipico”: diversi produttori adottano architetture diverse – ● ● ● Conseguentemente non esiste un singolo paradigma di programmazione parallela valido per tutte le architetture Il tipo di architettura parallela ha un enorme impatto sulle prestazioni dei programmi Sarebbe bello riuscire a descrivere algoritmi paralleli in modo generico e indipendente dall'architettura; questo faciliterebbe la portabilità La triste verità è che, In generale, è necessario utilizzare algoritmi ad-hoc in base all'architettura del sistema su cui verranno implementati Algoritmi Avanzati--modulo 2 4 Architettura di Von Neumann e sue estensioni Algoritmi Avanzati--modulo 2 5 Architettura di Von Neumann Processore (CPU) Memoria Sottosistema di interfaccia (I/O) Bus di sistema Algoritmi Avanzati--modulo 2 6 Un po' più in dettaglio Dati Indirizzi Controllo Bus R0 R1 ALU Memoria Memoria Rn PC IR PSW Controllo Algoritmi Avanzati--modulo 2 7 Ciclo Fetch-Decode-Execute ● ● Eseguito in continuazione dalla CPU Fetch – ● Decode – ● Preleva dalla memoria l'istruzione da eseguire; l'istruzione viene prelevato dall'indirizzo di memoria che si trova in PC; il contenuto di tale cella di memoria viene posto in IR Esamina l'istruzione che si trova memorizzata in IR per decidere cosa fare Execute – Esegue l'istruzione memorizzata in IR, incluso il recupero dalla memoria degli eventuali parametri necessari ad eseguirla, e deposito del risultato Algoritmi Avanzati--modulo 2 8 Limitare i colli di bottiglia dell'architettura di Von Neumann ● Ridurre la latenza degli accessi alla memoria – ● “Nascondere” la latenza degli accessi alla memoria – ● Sfruttare i registri della CPU e le cache Multithreading e context-switch durante gli accessi alla memoria Esecuzione di istruzioni in parallelo – – – – – Pipelining Multiple issue Branch prediction Speculative execution SIMD multimedia extensions Algoritmi Avanzati--modulo 2 9 Località e parallelismo ● ● Le memorie capienti sono lente, le memorie veloci hanno capienza limitata Le applicazioni dovrebbero fare il massimo uso di dati “locali” per ottenere le migliori prestazioni CPU L! Cache L2 Cache L3 Cache (possibile) bus di interconnessione Memoria Algoritmi Avanzati--modulo 2 10 Gerarchia di cache dell'architettura AMD Bulldozer Fonte: http://en.wikipedia.org/wiki/Bulldozer_%28microarchitecture%29 Algoritmi Avanzati--modulo 2 11 Gerarchia di memoria CUDA Block Block Shared Memory Registers Thread Local Memory Shared Memory Registers Registers Thread Local Memory Thread Local Memory Registers Thread Local Memory Global Memory Constant Memory Texture Memory Algoritmi Avanzati--modulo 2 12 Instruction Level Parallelism (ILP) ● Aumenta le prestazioni del processore mediante più unità funzionali che operano contemporaneamente – – Pipelining: le unità funzionali sono organizzate in “fasi”, come una catena di montaggio Multiple issue: le unità funzionali possono essere utilizzate in qualsiasi ordine ● ● Static multiple issue: l'uso delle unità funzionali è stabilito a tempo di compilazione (esempio: Intel IA64) Dynamic multiple issue (superscalar): l'uso delle unità funzionali è deciso dal processore durante l'esecuzione del programma Algoritmi Avanzati--modulo 2 13 Instruction Level Parallelism IF ID IF ID EX MEM WB EX Integer WB Pipelining Instruction Fetch Instruction Decode Execute Memory Access Write Back Instruction Fetch and Decode Unit Integer MEM Floating Point Commit Unit Multiple Issue In-order issue Floating Point In-order commit Algoritmi Avanzati--modulo 2 Load Store Out of order execute 14 Speculation ● ● Per usare la tecnica di multiple issue, il processore deve individuare quali istruzioni possono essere eseguite contemporaneamente Nella esecuzione speculativa il compilatore o il processore ipotizzano l'esito di certe operazioni in corso (tipicamente, confronti) e in base a tale ipotesi decidono quale istruzione successiva eseguire Algoritmi Avanzati--modulo 2 15 Speculation ● z = x + y; if ( z w } else w } > 0 ) { = x ; { = y ; ● Se il processore ritiene che il confronto “z > 0” darà come risultato true, inizierà ad eseguire “w = x” prima ancora che l'espressione “z > 0” sia stata valutata Se l'ipotesi si rivelasse sbagliata, dovrà interrompere l'esecuzione di “w = x” ed eseguire “w = y” Algoritmi Avanzati--modulo 2 16 Nel mondo reale... ● Dalla documentazione di GCC http://gcc.gnu.org/onlinedocs/gcc/Other-Builtins.html — Built-in Function: long __builtin_expect (long exp, long c) You may use __builtin_expect to provide the compiler with branch prediction information. In general, you should prefer to use actual profile feedback for this (-fprofile-arcs), as programmers are notoriously bad at predicting how their programs actually perform. However, there are applications in which this data is hard to collect. The return value is the value of exp, which should be an integral expression. The semantics of the built-in are that it is expected that exp == c. For example: if (__builtin_expect (x, 0)) foo (); Algoritmi Avanzati--modulo 2 17 Branch Hint: Esempio #include <stdlib.h> int main( void ) { int A[1000000]; size_t i; const size_t n = sizeof(A) / sizeof(A[0]); for ( i=0; __builtin_expect( i<n, 1 ); i++ ) { A[i] = i; } return 0; } Evitate accuratamente queste microottimizzazioni, a meno che non sappiate esattamente cosa state facendo. Algoritmi Avanzati--modulo 2 18 Hardware multithreading ● Consente al processore di eseguire istruzioni anche quando il task corrente è in stallo – ● Fine-grained: il context-switch tra thread ha costo pressoché nullo e puo' quindi avvenire istruzione per istruzione – ● ad esempio, perché sta aspettando dati dalla memoria Richiede CPU con supporto specifico,e.g., Cray XMT Coarse-grained: il context-switch avviene solo per i thread bloccati per periodi più lunghi (es., su I/O) – Context switch solitamente più oneroso, minore efficienza dell'utilizzo della CPU in presenza di stalli di breve durata Algoritmi Avanzati--modulo 2 19 Hardware multithreading ● ● Simultaneous multithreading (SMT) è una variazione di fine-grained multithreading basato sul fatto che diversi thread possono usare contemporaneamente unità funzionali diverse Nei sistemi SMT istruzioni di thread diversi possono contemporaneamente essere presenti in diverse unita' funzionali Instruction Fetch and Decode Unit Integer Floating Point Integer Algoritmi Avanzati--modulo 2 Commit Unit Floating Point Load Store 20 HyperThreading ● ● ● Implementazione recente della tecnologia SMT da parte di Intel Ogni core fisico presente sul processore viene visto e gestito dal Sistema Operativo come due core logici distinti HT sfrutta l'architettura superscalare del processore (cioè il fatto che alcune unità—ad esclusione dell'unità principale di esecuzione—sono duplicate e possono operare in parallelo) Algoritmi Avanzati--modulo 2 21 Architetture Parallele Algoritmi Avanzati--modulo 2 22 Architettura di Von Neumann Tassonomia di Flynn Single Multiple Instruction Streams Data Streams Single Multiple SISD SIMD Single Instruction Stream Single Data Stream Single Instruction Stream Multiple Data Streams MISD MIMD Multiple Instruction Streams Single Data Stream Multiple Instruction Streams Multiple Data Streams Algoritmi Avanzati--modulo 2 Poco diffusi 23 SIMD ● I sistemi SIMD consentono di applicare la stessa istruzione (tipicamente aritmetica/logica, e.g., somma, prodotto, …) a più dati contemporaneamente (tipicamente, 4 oppure 8) Questo implica che la ALU debba essere replicata 4/8/... volte Tempo ● LOAD A[0] LOAD A[1] LOAD A[2] LOAD A[3] LOAD B[0] LOAD B[1] LOAD B[2] LOAD B[3] C[0] = A[0] + B[0] C[1] = A[1] + B[1] C[2] = A[2] + B[2] C[3] = A[3] + B[3] STORE C[0] STORE C[1] STORE C[2] STORE C[3] Algoritmi Avanzati--modulo 2 24 SSE (Streaming SIMD Extensions) ● ● ● Estensione al set di istruzioni x86 70 nuove istruzioni in grado di operare prevalentemente su numeri floating point in precisione singola 8 nuovi registri a 128 bit (XMM0—XMM7) – ● rappresentano 4 float a 32 bit in precisione singola SSE2 consente di rappresentare – – – – – 2 double a 64 bit, oppure 2 interi a 64 bit, oppure 4 interi a 32 bit, oppure 8 short int a 16 bit, oppure 16 caratteri a 8 bit 32 32 128 32 32 XMM0 XMM1 Algoritmi Avanzati--modulo XMM72 25 SSE (Streaming SIMD Extensions) 32 32 32 32 X3 X2 X1 X0 Y3 Y2 Y1 Y0 op op op op X3 op Y3 X2 op Y2 X1 op Y1 X0 op Y0 Algoritmi Avanzati--modulo 2 26 Esempio __m128 a = _mm_set_ps( 1.0, 2.0, 3.0, 4.0 ); __m128 b = _mm_set_ps( 2.0, 4.0, 6.0, 8.0 ); __m128 ab = _mm_mul_ps( a, b ); 32 32 32 32 a 1.0 2.0 3.0 4.0 b 2.0 4.0 6.0 8.0 18.0 32.0 _mm_mul_ps( a, b ) ab 2.0 8.0 Algoritmi Avanzati--modulo 2 27 GPU ● Le moderne GPU (Graphics Processing Units) includono un elevato numero di “core” che esibiscono caratteristiche simili a sistemi SIMD Chip GPU Fermi (fonte: 28 http://www.legitreviews.com/article/1100/1/) Algoritmi Avanzati--modulo 2 CPU vs GPU ● Le differenze sono evidenti se consideriamo come vengono utilizzati i transistor presenti sul chip ALU ALU ALU ALU Control Cache DRAM DRAM CPU GPU Algoritmi Avanzati--modulo 2 29 GPU core ● Un singolo core contiene una unità fetch/decode condivisa tra più ALU – ● ALU ALU ALU ALU ALU ALU ALU ALU Ctx Ctx Ctx Ctx Ctx Ctx Ctx Ctx Ctx Ctx Ctx Ctx 8 ALU = ciascuna istruzione può operare su 8 dati simultaneamente Ogni core mantiene più contesti di esecuzione ed è in grado di passare dall'uno all'altro a costo ~zero – Fetch / Decode Fine-grained parallelism Algoritmi Avanzati--modulo 2 30 GPU ● 12 stream di istruzioni x 8 ALU = 96 operazioni in parallelo Algoritmi Avanzati--modulo 2 31 MIMD ● Nelle architetture MIMD sono presenti più unità di esecuzione che eseguono sequenze di istruzioni indipendenti – Ogni unità di esecuzione può operare su dati differenti dalle altre – Tempo ● Multiple Instruction Streams Multiple Data Streams LOAD A[0] CALL F() a = 18 w=7 LOAD B[0] z=8 b=9 t = 13 C[0] = A[0] + B[0] y = 1.7 if ( a>b ) c = 7 k = G(w,t) STORE C[0] z=x+y a=a-1 k=k+1 Algoritmi Avanzati--modulo 2 32 Architetture MIMD ● Shared Memory – – ● CPU Un insieme di processori che condividono una memoria comune Ogni processore puo' accedere direttamente ad una qualsiasi locazione della memoria CPU CPU CPU Interconnect Memoria Distributed Memory – – – Un insieme di sistemi autonomi connessi tramite una rete di comunicazione Nodi diversi devono comunicare tramite la rete per condividere dati Esempio più comune: cluster di PC connessi tramite ethernet, programmati usando MPI CPU CPU CPU CPU Mem Mem Mem Mem Algoritmi Avanzati--modulo 2 Interconnect 33 Architetture ibride ● In pratica, i principali sistemi HPC presenti sul mercato sono basati su architetture ibride, in cui ogni nodo di calcolo è un sistema multiprocessore a memoria condivisa, e più nodi sono collegati da una rete di interconnessione GPU GPU GPU GPU GPU GPU GPU GPU CPU CPU CPU CPU CPU CPU CPU CPU CPU CPU CPU CPU CPU CPU CPU CPU Mem Mem Mem Mem Interconnect Algoritmi Avanzati--modulo 2 34 Esempio shared memory Intel core i7 AMD “Istanbul” Algoritmi Avanzati--modulo 2 35 Esempio distributed memory IBM BlueGene / Q @ CINECA Architecture 10 BGQ Frame Model IBM-BG/Q Processor Type IBM PowerA2, 1.6 GHz Computing Cores 163840 Computing Nodes 10240 RAM 1GByte / core Internal Network 5D Torus Disk Space 2PByte scratch space Peak Performance 2PFlop/s Algoritmi Avanzati--modulo 2 36 Algoritmi Avanzati--modulo 2 37 Algoritmi Avanzati--modulo 2 38 www.top500.org Algoritmi Avanzati--modulo 2 39 www.top500.org Algoritmi Avanzati--modulo 2 40 SANDIA ASCI RED Data: 1996 Prestazioni di picco: 1.8Teraflops Ingombro: 150m2 Consumo energetico: 800.000 Watt Algoritmi Avanzati--modulo 2 41 SANDIA ASCI RED Data: 1996 Prestazioni di picco: 1.8Teraflops Ingombro: 150m2 Consumo energetico: 800.000 Watt Sony PLAYSTATION 3 Data: 2006 Prestazioni di picco: >1.8Teraflops Ingombro: 0.08m2 Consumo energetico: <200 Watt Algoritmi Avanzati--modulo 2 42 Dentro la PS3 Cell Broadband Engine Algoritmi Avanzati--modulo 2 43 Conclusioni ● ● Memoria condivisa Vantaggi: – – ● ● ● In generale, più “facile” da programmare Vantaggioso per applicazioni che prevedono un accesso “irregolare” ai dati (esempio, algoritmi di esplorazione di grafi) Svantaggi: – – – – ● Problemi di concorrenza/mutua esclusione Banda di memoria limitata Memoria distribuita Vantaggi: Accesso a potenze di calcolo molto elevate Vantaggioso per applicazioni che esibiscono forte località di accesso ai dati, con elevato rapporto computazione / comunicazione Svantaggi: – – Latenza della rete di comunicazione In generale, più complesso da programmare Algoritmi Avanzati--modulo 2 44