Introduzione al Calcolo Parallelo

Slides:



Advertisements
Presentazioni simili
Scheduling (Schedulazione) Susanna Pelagatti – Università di Pisa
Advertisements

Meccanismi di IPC Problemi classici di IPC
1 MeDeC - Centro Demoscopico Metropolitano Provincia di Bologna - per Valutazione su alcuni servizi erogati nel.
Classe III A A.s – 2011 Sistemi di Elaborazione e Trasmissione dell’Informazione 4 ore settimanali (2 laboratorio) Docenti Prof. Alberto Ferrari.
Il Sistema Operativo.
Massa Laura Mela Enrica
Gestione del processore
Architettura di un sistema informatico Hardware
Frontespizio Economia Monetaria Anno Accademico
Implementazione dell algortimo di Viterbi attraverso la soluzione del problema di cammino mi- nimo tramite software specifico. Università degli studi di.
Introduzione al calcolo parallelo SISTEMI INFORMATIVI AZIENDALI Pierpaolo Guerra Anno accademico 2009/2010.
GPU: processori manycore Annalisa Massini Calcolo Intensivo a.a. 2010/2011.
GPU: processori manycore
Algoritmi Paralleli e Distribuiti a.a. 2008/09
2 Sistema composto da un numero elevato di componenti, in cui ogni componente svolge una sua funzione elaborazione dati memorizzazione dati trasferimento.
Introduzione allinformatica. Cosè linformatica ? Scienza della rappresentazione e dellelaborazione dellinformazione ovvero Studio degli algoritmi che.
Informatica di base A.A. 2003/2004 Algoritmi e programmi
Algoritmo di Ford-Fulkerson
Canale A. Prof.Ciapetti AA2003/04
1 Corso di Informatica (Programmazione) Lezione 4 (24 ottobre 2008) Architettura del calcolatore: la macchina di Von Neumann.
Processi e Thread.
1 2. Analisi degli Algoritmi. 2 Algoritmi e strutture dati - Definizioni Struttura dati: organizzazione sistematica dei dati e del loro accesso Algoritmo:
Disco magnetico (2) Ciascuna traccia è divisa in settori
Criticità sui dati (1° esempio)
I Thread.
Linguaggi di programmazione
3. Architettura Vengono descritte le principali componenti hardware di un calcolatore.
Cos’è un problema?.
Sistemi Operativi SCHEDULING DELLA CPU.
Estensioni allarchitettura di Von Neumann Vito Perrone Corso di Informatica A per Gestionali.
Strutture di controllo in C -- Flow Chart --
Fondamenti di Informatica1 Software di base Tra il linguaggio macchina (basso livello) e i linguaggi evoluti (alto livello) esiste uno strato di software.
Espressioni condizionali
La macchina di von Neumann
Architettura di un calcolatore
CHARGE PUMP Principio di Funzionamento
Settimana: 3-7 marzo Orariolunedimartedi Mercoledi 5 Giovedi 6 Venerdi lezione intro alla fis mod DR lezione intro alla fis mod DR.
Università degli studi di Modena e Reggio Emilia
Elementi di Informatica di base
ORDINE DI CHIAMATA a 1minuto e 2 minuti PRINCIPALI TEMPI DELLA COMPETIZIONE ORDINE DI CHIAMATA a 1minuto e 2 minuti PRINCIPALI TEMPI DELLA COMPETIZIONE.
Appunti di Informatica
Architettura di Calcolo
I blocchi fondamentali dell’elaborazione Componenti e funzionamento del calcolatore I blocchi fondamentali dell’elaborazione.
ISTITUTO COMPRENSIVO “G. BATTAGLINI” MARTINA FRANCA (TA)
INFORMAZIONI GENERALI Web site: Att. DidatticaIns. UniversitarioA.A PROGRAMMA.
Architetture dei Calcolatori (Lettere j-z ) Il Processore
Architettura del calcolatore
Calcolatori Elettronici II Lezione n. 17 – Introduzione alle architetture parallele Prof. Gianni Conte Università di Parma CALCOLATORI ELETTRONICI II CALCOLATORI.
LE SAI LE TABELLINE? Mettiti alla prova!.
Un trucchetto di Moltiplicazione per il calcolo mentale
Sviluppare un programma in C che, dato un array da 100 elementi interi caricato con numeri casuali compresi tra [10,100], sia in grado di cercare il valore.
La RAM, la ROM e la CPU di Beatrice Cecchini e Margherita Pelagagge
GPGPU General Purpose Computation on GPU Emanuele Ruffaldi 2005 Corso su Elasticità non lineare ed Oggetti Deformabili.
3  Sistema composto da un numero elevato di componenti, in cui ogni componente svolge una sua funzione  elaborazione dati  memorizzazione dati 
IL GIOCO DEL PORTIERE CASISTICA. Caso n. 1 Il portiere nella seguente azione NON commette infrazioni.
Calcolatori Elettronici Il Processore
Informatica Lezione 5 Scienze e tecniche psicologiche dello sviluppo e dell'educazione (laurea triennale) Anno accademico:
Tecnologie Informatiche ed Elettroniche per le Produzioni Animali (corso TIE) CORSO LAUREA MAGISTRALE IN SCIENZE E TECNOLOGIE DELLE PRODUZIONI ANIMALI.
Sistema operativo Il Sistema Operativo gestisce le risorse hw e sw del sistema di elaborazione Facilita l'interazione tra utente e sistema Esistono diversi.
Informatica Generale Marzia Buscemi
TESI DI LAUREA TRIENNALE IN GPU-CUDA ENVIRONMENT
Hardware Struttura fisica (architettura) del calcolatore formata da parti meccaniche, elettriche, elettroniche.
GPU - Graphics Processing Unit Corso di Sistemi Paralleli Luigi La Torre Giugno 2012.
I Microprocessori Unità 3 del libro Internet Working Sistemi e reti.
Uso Didattico dell'Informatica Storica 07 STORIA DEI MICROPROCESSORI E INTRODUZIONE ALLA VIRTUALIZZAZIONE prof. Cuoghi Giampaolo ITIS “A.Volta” Sassuolo.
© 2016 Giorgio Porcu - Aggiornamennto 18/03/2016 I STITUTO T ECNICO SECONDO BIENNIO T ECNOLOGIE E P ROGETTAZIONE Il Sistema Operativo Concorrenza e Grafi.
HARDWARE (2). MEMORIE Due classi di memoria MEMORIA CENTRALE –media capacità - ottima velocità MEMORIA DI MASSA elevata capacità - bassa velocità.
© 2016 Giorgio Porcu - Aggiornamennto 31/01/2016 I STITUTO T ECNICO SECONDO BIENNIO T ECNOLOGIE E P ROGETTAZIONE Il Sistema Operativo Thread G IORGIO P.
Hardware Struttura fisica (architettura) del calcolatore formata da parti meccaniche, elettriche, elettroniche.
Breve Storia 3d prima generazione (escludiamo Wolf3d, Doom e Duke3d, che erano una sorta di 2D)  per ogni triangolo che compone una mesh calcoliamo la.
Transcript della presentazione:

Introduzione al Calcolo Parallelo GPGPU – CUDA Girolamo Giudice Seminario di Bioinformatica

Introduzione al calcolo parallelo Cenni sul calcolo sequenziale Cenni sul calcolo parallelo Perché usare il calcolo parallelo Architettura hardware GPU - CUDA Modello Software Cuda Esempio pratico

Introduzione al calcolo parallello Benchmark di alcuni tool Bioinformatici Vento sulla GPU

Evoluzione della CPU Negli ultimi 20 anni i microprocessori basati su una singola CPU hanno avuto un rapido incremento nelle prestazioni e una diminuzione dei costi. Questa corsa ha subito una battuta d’ arresto a causa dei consumi e dei problemi di riscaldamento 15 nov 2004 p4 3,8ghz 28 mag 2011 I7extreme 3,6ghz

Evoluzione della CPU I produttori di microprocessori si sono orientati verso modelli con più unità di processo (multi core),allo scopo di aumentare la potenza di calcolo. Intel ha presentato un 80 core

Problemi dei Multi-core Tradizionalmente i programmi sono stati scritti per essere eseguiti su un computer con una singola CPU ( modello Von Neuman). La stragrande maggioranza delle applicazioni sono costituite da programmi sequenziali I processori dual core sono praticamente lo standard attuale

Cenni di calcolo sequenziale Un problema viene suddiviso in sequenze discrete di istruzioni che vengono eseguite (di solito) una dopo l’altra In un dato istante di tempo solo una istruzione è in esecuzione sulla CPU

Cenni di calcolo parallelo Il calcolo parallelo è l’uso di più unità di computazione ( CPU multi core o multi CPU) per risolvere problemi Storicamente è stato sempre un paradigma costoso e di alto livello

Cenni di calcolo parallelo Il calcolo viene eseguito su più CPU o su CPU multicore o dual thread Il problema viene decomposto in componenti discrete che possono essere eseguite concorrentemente Le istruzioni sono eseguite simultaneamente su CPU differenti

Tassonomia di Flynn

Tassonomia di Flynn SISD SIMD MISD MIMD

Perché usare il calcolo parallelo Risolvo un problema più grande nello stesso tempo (SCALE – UP) Lo stesso problema in minor tempo (SPEED-UP) Contenere i costi Sfruttare meglio la RAM Aumentare l’affidabilità Utilizzare risorse distribuite

GPGPU / CUDA GPGPU: utilizzare il processore della scheda grafica (GPU) per scopi diversi dalla tradizionale creazione di un’immagine tridimensionale. Le GPU sono processori multicore ad elevate prestazioni, il loro avvento è relativamente recente. Le prime soluzioni programmabili risalgono al 2006,precedentemente erano dedicate solo allo sviluppo della grafica e dei videogiochi. Le GPU sono diventate processori paralleli general purpose con interfacce di programmazione con supporto ai linguaggi di programmazione come il C.

Differenze Macroscopiche CPU / GPU

Architettura CUDA G80 Host = CPU Device = GPU C: Compute U: Unified D: Device A: Architecture 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16

Architettura Cuda Ciascun Streaming Multiprocessor contiene al suo interno: 8 Stream Processor (add sub,mul su int e float) SFU(super funciton unit): seno,coseno,log,inv,exp Shared memory per tutti i thread in esecuzione sul SM Cache per dati e istruzioni Unità per la decodifica delle istruzioni (decodifica una istruzione ogni 4 cicli di clock)

Architettura hardware Mascherare la latenza della memoria globale con migliaia di thread Struttura di memoria semplice ma a bassa latenza, anziché ad accesso ottimizzato , ma complesso Nessuna priorità sui thread No context switch No overhead SIMT (single instruction multiple thread) tutti i thread eseguono la stesso istruzione ma su dati diversi

Cuda: Modello di esecuzione Un codice Cuda alterna porzioni di codice seriale, eseguito dalla CPU e di codice parallelo eseguito dalla GPU. Le porzioni di codice eseguite sulla GPU sono note come kernel (~ funzione in C/C++) Il kernel, è definito come una griglia di blocchi che vengono assegnati ai vari multiprocessori, e rappresentano un parallelismo a grana grossa. Ogni blocco esegue l’unità di computazione fondamentale, il thread. Un thread può appartenere ad un solo blocco ed è univocamente identificato da un ID.

Multidimensionalità degli IDs Il codice parallelo viene lanciato, dalla CPU, sulla GPU , questa esegue un solo kernel alla volta. La dimensione della griglia si misura in blocchi questi possono essere: Block: 1-D o 2-D La dimensione dei blocchi si misura in thread Thread 1-D,2-D,3-D

Cuda memory model Tipi di memoria Global (device) memory (R/W) Shared memory (R/W) Registers (R/W locale per thread) Constant (R/O) Texture (R/O) Global,costant e texture memory sono persistenti a diversi lanci di kernel Si minimizza il transfer rate bottleneck

Classi di applicazioni Presenza di molte operazioni matematiche(grande intensità aritmetica) Elevato grado di parallelismo (le stesse operazioni vengono ripetute per una grande quantità di dati) Condizioni di controllo limitate Minima dipendenza tra i dati

Linguaggi che supportano cuda

Esempio 2 vettori da 100.000 elementi Su ogni elemento del vettore dobbiamo eseguire questa operazione log(h_a[i]*h_b[i]) Quanti blocchi? Quanti thread? Fissiamo per esempio 512 thread Dimensione del blocco = 100000/512=195.31 Arrotondiamo a 196 n°thread=196*512=100352

#include <stdio.h> // implementazione del kernel __global__ void Kernel(float *d_a,float *d_b,float *d_c) { // calcolo dell'indice di thread int idx = blockIdx.x*blockDim.x + threadIdx.x; if(idx<100000) d_c[idx] =log(d_a[idx]*d_b[idx]); } // Dichiariamo il main int main( int argc, char** argv) int n=100000; time_t begin,end; // puntatore per la struttura dati sull'host float *h_a=(float*) malloc(sizeof(float)*n); float *h_b=(float*) malloc(sizeof(float)*n); float *h_c=(float*) malloc(sizeof(float)*n); //inizializzo il vettore numeri casuali for(int i=0;i<n;i++) h_a[i]=rand(); h_b[i]=rand(); begin = clock(); h_c[i] =log(h_a[i]*h_b[i]); end=clock(); float time_cpu = (double)(end-begin)/CLOCKS_PER_SEC; printf("CPU time %.20lf\n",time_cpu); // puntatore per la struttura dati sul device float *d_a=NULL; float *d_b=NULL; float *d_c=NULL; //verifico al secondo lancio del kernel for(int i=0;i<2;i++) begin = clock(); //malloc e memcopy host to device cudaMalloc( (void**) &d_a, sizeof(float)*n) ; cudaMemcpy( d_a, h_a, sizeof(float)*n, cudaMemcpyHostToDevice) ; cudaMemcpy( d_b, h_b, sizeof(float)*n, cudaMemcpyHostToDevice) ; cudaMemcpy( d_c, h_c, sizeof(float)*n, cudaMemcpyHostToDevice) ; // definizione della grandezza della griglia e dei blocchi int numBlocks = 196; int numThreadsPerBlock = 512; // Lancio del kernel dim3 dimGrid(numBlocks); dim3 dimBlock(numThreadsPerBlock); Kernel<<< dimGrid, dimBlock >>>( d_a,d_b,d_c ); // blocca la CPU fino al completamento del kernel sul device cudaThreadSynchronize(); // Esegue la copia dei risultati dalla memoria del device a quella dell'host cudaMemcpy( h_c, d_c, n, cudaMemcpyDeviceToHost ); end = clock(); } float time_gpu = (double)(end-begin)/CLOCKS_PER_SEC; printf("GPU time %.20lf\n",time_gpu); // libera la memoria sul device cudaFree(d_a); cudaFree(d_b); cudaFree(d_c); // libera la memoria sull'host free(h_a); free(h_b); free(h_c); return 0;

Inizialmente: float *h_a=(float*) malloc(sizeof(float)*n); float *h_b=(float*) malloc(sizeof(float)*n); float *h_c=(float*) malloc(sizeof(float)*n); CPU GPU Array h_a Host’s memory Device’s memory Array h_b Array h_c

Allocare memoria sulla GPU cudaMalloc( (void**) &d_a, sizeof(float)*n) ; CPU GPU Array h_a Array d_a Host’s memory Array h_b Array d_b Device’s memory Array h_c Array d_c

Copiare il contenuto dalla host memory alla device memory cudaMemcpy( d_a, h_a, sizeof(float)*n, cudaMemcpyHostToDevice) ; cudaMemcpy( d_b, h_b, sizeof(float)*n, cudaMemcpyHostToDevice) ; cudaMemcpy( d_c, h_c, sizeof(float)*n, cudaMemcpyHostToDevice) ; CPU GPU Array h_a Array d_a Host’s memory Array h_b Array d_b Device’s memory Array h_c Array d_c

Eseguire il contenuto sulla GPU __global__ void Kernel( float *d_a,float *d_b,float *d_c) { // calcolo dell'indice di thread int idx = blockIdx.x*blockDim.x + threadIdx.x; if(idx<100000) d_c[idx] =log(d_a[idx]*d_b[idx]); } Kernel<<< 196, 512 >>>( d_a,d_b,d_c ); GPU MPs CPU GPU Array h_a Array d_a Host’s memory Array h_b Array d_b Device’s memory Array h_c Array d_c

In the GPU … … … … … … … d_c[idx]= Thread 0 Thread 1 Thread 2 Log(d_a[idx]+d_b[idx] d_c[idx]= Log(d_a[idx]+d_b[idx] d_c[idx]= Log(d_a[idx]+d_b[idx] d_c[idx]= Log(d_a[idx]+d_b[idx] d_c[idx]= Log(d_a[idx]+d_b[idx] d_c[idx]= Log(d_a[idx]+d_b[idx] d_c[idx]= Log(d_a[idx]+d_b[idx] … … … … Block 0 Block 196

Restituire il risultato cudaMemcpy( h_c, d_c, n, cudaMemcpyDeviceToHost ); Host’s Memory GPU Card’s Memory Array h_c Array d_c Tempi CPU 0.01 GPU 0.002 100.000 el Tempi CPU 0.1 GPU 0.007 1.000.000 el Tempi CPU 0.8 GPU 0.037 10.000.000 el

Applicazioni tipiche Elaborazione video Astrofisica Finanza Fisica di gioco Modellazione fisica Analisi numerica DSP Imaging medicale Data mining Dinamica molecolare Bioinformatica

http://gpu.epfl.ch/sw.html

Usa suffix tree

Match insert delete

Probabilità oops

Mcode:Finds clusters in a network

Subgraph isomorphism Subgraph matching. Un grafo G(V,E) e un sottografo isomorfo a G1(V1,E1) se esiste una funzione iniettiva f:VV1 tale che (u,v)E se e solo se (f(u),f(v))E1. La ricerca di sottostrutture all’interno di un grafo target è un processo estremamente oneroso dal punto di vista computazionale (problema NP-completo). Il processo di ricerca di una query si articola in tre fasi Preprocessing Filtering Matching

Esempio #Graph 4 71 83 27 44 3 0 1 0 2 2 3 1 83 71 27 44 2 3

Esempio #graph 15 69 72 37 22 97 95 50 8 88 12 81 36 10 9 69 8 7 50 8 88 16 0 7 0 1 7 1 10 1 11 10 11 13 11 6 11 3 11 9 11 8 11 5 11 2 11 4 11 12 14 11 97 4 1 72 8 11 95 69 3 5 37 22 2 13 12 36 12 6 50 81 14

Grafo Query #Query 3 69 50 8 1 50 69 2 0 1 0 2 8 2

Preprocessing Nodo iniziale / Nodo finale #graph 16 8 69 8 72 69 72 8 69 8 72 69 72 50 72 69 50 69 81 69 22 69 8 69 88 69 95 69 37 69 97 69 12 36 69 Nodo iniziale / Nodo finale #Query 2 69 50 69 8

Applichiamo CUDA Nodo iniziale / Nodo finale #Query 2 69 50 69 8 8 69 69 50 69 8 Nodo iniziale / Nodo finale #graph 16 8 69 8 72 69 72 50 72 69 50 69 81 69 22 69 8 69 88 69 95 69 37 69 97 69 12 36 69 Tid 1 Tid 2 Tid 3 Tid 4 Tid 5 Tid 6 Tid 7 Tid 8 Tid 9 Tid 10 Tid 11 Tid 12 Tid 13 Tid 14 Tid 15 Tid 16 Tid 1 Tid 2 Tid 3 Tid 4 Tid 5 Tid 6 Tid 7 Tid 8 Tid 9 Tid 10 Tid 11 Tid 12 Tid 13 Tid 14 Tid 15 Tid 16

Nodo iniziale / Nodo finale #graph 16 8 69 8 72 69 72 50 72 69 50 69 81 69 22 69 8 69 88 69 95 69 37 69 97 69 12 36 69 1° kernel 69 50 Tid 1 Tid 2 Tid 3 Tid 4 Tid 5 Tid 6 Tid 7 Tid 8 Tid 9 Tid 10 Tid 11 Tid 12 Tid 13 Tid 14 Tid 15 Tid 16 Tid 1 Tid 2 Tid 3 Tid 4 Tid 5 Tid 6 Tid 7 Tid 8 Tid 9 Tid 10 Tid 11 Tid 12 Tid 13 Tid 14 Tid 15 Tid 16

Nodo iniziale / Nodo finale #graph 16 69 8 8 72 69 72 50 72 69 50 69 81 69 22 69 88 69 95 69 37 69 97 69 12 36 69 2° kernel 69 8 Tid 1 Tid 2 Tid 3 Tid 4 Tid 5 Tid 6 Tid 7 Tid 8 Tid 9 Tid 10 Tid 11 Tid 12 Tid 13 Tid 14 Tid 15 Tid 16 Tid 1 Tid 2 Tid 3 Tid 4 Tid 5 Tid 6 Tid 7 Tid 8 Tid 9 Tid 10 Tid 11 Tid 12 Tid 13 Tid 14 Tid 15 Tid 16

Pruning Foresta di grafi 50 8 8 Query 1 50 69 69 69 8 2 50

Ricapitolando CUDA

2° pruning

VF2

Risultati Scalefree2000 Composta da 2000 nodi e 3997 archi Query4 Rete utilizzata: Scalefree2000 Composta da 2000 nodi e 3997 archi Query Test: Query4 Query16 Query64 Hardware utilizzato: Intel Core 2 duo E4400 (2 GHz) Nvidia Geforce Gts 250 (128 Cuda cores)

Rete utilizzata: Query Test: Hardware utilizzato: YeastNetworkRand Composta da 5589 nodi e 92835 archi Query Test: Query4 Query8 Query16 Query32 Query64 Query128 Hardware utilizzato: Intel Core 2 duo E4400 (2 GHz) Nvidia Geforce Gts 250 (128 Cuda cores)

Query 8

Query 16 Guadagno da 6x a 164x

Query 16

Query 32

L’elaborazione della query128_036,da parte di ventoCPU, è stata interrotta dopo oltre 7 ore di elaborazione

Confronto con SING Rete:ScaleFree_2000_128 n° Query4 : 100 n° Match Effettivi: 31 Query da valutare con VentoGPU:32 Falsi positivi VentoGPU:1 Query da valutare con Sing: 99 Falsi positivi Sing: 68

Query da valutare con VentoGPU:49 Falsi positivi VentoGPU:0 Rete:ScaleFree_2000_128 n° Query16 : 100 n° Match Effettivi: 49 Query da valutare con VentoGPU:49 Falsi positivi VentoGPU:0 Query da valutare con Sing: 50 Falsi positivi Sing: 1

Query da valutare con VentoGPU:40 Falsi positivi VentoGPU:0 Rete:ScaleFree_2000_128 n° Query64 : 100 n° Match Effettivi: 40 Query da valutare con VentoGPU:40 Falsi positivi VentoGPU:0 Query da valutare con Sing: 42 Falsi positivi Sing: 2

Rete:Yeastnetworkrand n° Query4 : 100 n° Match Effettivi: 68 Query da valutare con VentoGPU:75 Falsi positivi VentoGPU:7

Rete:Yeastnetworkrand n° Query16 : 100 n° Match Effettivi: 35 Query da valutare con VentoGPU:61 Falsi positivi VentoGPU:26

Rete:Yeastnetworkrand n° Query64 : 100 n° Match Effettivi: 34 Query da valutare con VentoGPU: 60 Falsi positivi VentoGPU:26

Questions?