Laboratorio Corso di sviluppo Nvidia CUDA TM. Davide Barbieri

Documenti analoghi
Architettura CUDA Corso di sviluppo Nvidia CUDATM. Davide Barbieri

GPGPU GPGPU. anni piu' recenti e' naturamente aumentata la versatilita' ed usabilita' delle GPU

Esercizi su CUDA Algoritmi e Calcolo Parallelo. Daniele Loiacono

Esercizi su CUDA Algoritmi e Calcolo Parallelo. Daniele Loiacono

Cosa si intende per GPGPU? Il modello di programmazione di CUDA. GPU di precedente generazione. Storia delle GPU

Simulazioni Monte Carlo in ambiente OpenACC

Introduzione alla GPGPU Corso di sviluppo Nvidia CUDATM. Davide Barbieri

Introduzione al Many/Multi-core Computing

Ottimizzazioni 1 Corso di sviluppo Nvidia CUDATM. Davide Barbieri

Modelli di programmazione parallela

Problema: dati i voti di tutti gli studenti di una classe determinare il voto medio della classe.

Traduzione e interpretazione

PAES. Laurea Specialistica in Informatica. Analisi e sviluppo di un implementazione parallela dell AES per. architetture eterogenee multi/many-core

Informatica ALGORITMI E LINGUAGGI DI PROGRAMMAZIONE. Francesco Tura. F. Tura

Ulteriore Parallelismo Corso di sviluppo Nvidia CUDA TM. Davide Barbieri

UNIVERSITÀ DEGLI STUDI DI MODENA E REGGIO EMILIA

Linguaggi di programmazione

Laboratorio di Calcolo Linguaggi di programmazione

Strutture dati nel supporto a run time

Architetture Applicative Altri Esempi

Codifica di canale. (dalle dispense e dalle fotocopie) Trasmissione dell Informazione

Inversa. Inversa. Elisabetta Colombo

Lezione 6 Introduzione al C++ Mauro Piccolo

Cos è un algoritmo. Si dice algoritmo la descrizione di un metodo di soluzione di un problema che sia

Componenti e connessioni. Capitolo 3

Componenti principali. Programma cablato. Architettura di Von Neumann. Programma cablato. Cos e un programma? Componenti e connessioni

Macchine Astratte. Luca Abeni. February 22, 2017

Calcolo Parallelo. Domanda. In particolare. Qual è l algoritmo parallelo. PROBLEMA: Prodotto Matrice-Vettore

Componenti principali

Introduzione a Java. Prof. Francesco Accarino IIS Altiero Spinelli Via Leopardi132 Sesto San Giovanni

I THREAD O PROCESSI LEGGERI

Laurea Magistrale in Informatica - AA 2016/17 Docente G. Grossi. Lezione 3 Il modello di esecuzione CUDA (1)

Programma del corso. Elementi di Programmazione. Introduzione agli algoritmi. Rappresentazione delle Informazioni. Architettura del calcolatore

Algoritmi, Strutture Dati e Programmi. UD 2.b: Programmazione in Pascal

Spazio di indirizzamento virtuale

Algoritmo. La programmazione. Algoritmo. Programmare. Procedimento di risoluzione di un problema

Come funzionano i computer

Mini-dispensa sui puntatori in C

Introduzione al GPU Compu4ng con CUDA. Francesco Caruso

Indice generale. 1 Il calcolatore: astrazioni. 2 Le istruzioni: il linguaggio. e tecnologia 1. dei calcolatori 57

Modi di indirizzamento del processore MC68000 (parte seconda)

Quadrato Magico. Fondamenti di Programmazione

Lezione 15 Il Set di Istruzioni (1)

Indice PARTE A. Prefazione Gli Autori Ringraziamenti dell Editore La storia del C. Capitolo 1 Computer 1. Capitolo 2 Sistemi operativi 21 XVII XXIX

ELABORAZIONE DELLE INFORMAZIONI (ALGORITMI E LINGUAGGI DI PROGRAMMAZIONE)

10 STRUTTURE DI CONTROLLO REPEAT E WHILE. Strutture di controllo e variabili strutturate

1. Che cos è un sistema multiprogrammato? Si può realizzare la multiprogrammazione

Primi passi col linguaggio C

Informatica Generale 07 - Sistemi Operativi:Gestione dei processi

Indice. Prefazione. 3 Oggetti e Java 53

Corso di Laboratorio di Sistemi Operativi

Laboratorio di Calcolatori 1 Corso di Laurea in Fisica A.A. 2006/2007

Tipi di dato. Il concetto di tipo di dato viene introdotto per raggiungere due obiettivi:

Fondamenti di Informatica e Laboratorio T-AB Ingegneria Elettronica e Telecomunicazioni. Lab 06 Array" Lab06 1

Introduzione a GCC: GNU Compiler Collection

Il Linguaggio C. Caratteristiche. Caratteristiche. Esempio di programma in C. Tipi di dato primitivi in C. Dati

Esercizi di riepilogo (Fondamenti di Informatica 1 Walter Didimo)

Le etichette nei programmi. Istruzioni di branch: beq. Istruzioni di branch: bne. Istruzioni di jump: j

Esercizio 2: Algebra dei Puntatori e Puntatori a Puntatori

COSTRUZIONE DI UN APPLICAZIONE

Quicksort e qsort() Alessio Orlandi. 28 marzo 2010

Funzioni, Stack e Visibilità delle Variabili in C

Programmazione I - Laboratorio

Linguaggio C - sezione dichiarativa: costanti e variabili

Il CPU UNITA DI CALCOLI (ALU) UNITA DI CONTROLLO (CU) 1

Corso di Architettura (Prof. Scarano) 09/04/2002

Introduzione al Linguaggio C Corso di Informatica Laurea in Fisica

Introduzione a Matlab

Linguaggi di Programmazione

CUDA computing with the GPU

Introduzione al DEV C++

GPGPU for machine learning algorithms

Corso di programmazione Arduino DI MALVEZZI DAVIDE

Architettura degli Elaboratori

CUDA computing with the GPU

II Esercitazione: S.O. & Fortran 77

Fondamenti di Informatica 6. Algoritmi e pseudocodifica

Informatica per la Comunicazione/ Verdicchio/ 23/05/2013/ Domande /Versione 1

Modelli di programmazione per architetture di calcolo eterogenee

Esercizi C su array e matrici

Caratteri e stringhe

Linguaggi e moduli. Dott. Franco Liberati

Introduzione. Classificazione di Flynn... 2 Macchine a pipeline... 3 Macchine vettoriali e Array Processor... 4 Macchine MIMD... 6

INTRODUZIONE ALLA PROGRAMMAZIONE. Cosimo Laneve

LA CODIFICA DELL INFORMAZIONE. Introduzione ai sistemi informatici D. Sciuto, G. Buonanno, L. Mari, McGraw-Hill Cap.2

10: I LINGUAGGI di PROGRAMMAZIONE PARTE 1

Macchina Astratta: struttura e realizzazione.

Laboratorio di Architettura degli Elaboratori LabArch 2007 Terzo Quadimestre, a.a Docente: H. Muccini

INFORMATICA. L informatica comprende:

Calcolo parallelo. Una sola CPU (o un solo core), per quanto potenti, non sono sufficienti o richiederebbero tempi lunghissimi

Università di Roma Tor Vergata Corso di Laurea triennale in Informatica Sistemi operativi e reti A.A Pietro Frasca.

I Linguaggi di Programmazione

; programma MOV AX, DATO_1. ; somma al contenuto dell' accumulatore il contenuto del registro B

Prefazione. Capitolo 1 Sistemi di elaborazione 1

Sistemi Operativi SISTEMI DI INPUT/OUTPUT. D. Talia - UNICAL. Sistemi Operativi 10.1

Introduzione a Java. Riferimenti

Architetture aritmetiche

RETI LINEARI R 3 I 3 R 2 I 4

Sincronizzazione. Soluzioni hardware Stefano Quer Dipartimento di Automatica e Informatica Politecnico di Torino

GPU (Graphics Processing Unit) Programming in CUDA. Giorno 1

Transcript:

Laboratorio Corso di sviluppo Nvidia CUDA TM Davide Barbieri

Librerie CUDA CUBLAS, CUSPARSE Applicazione CUDA CUDA Runtime Funzioni cuda*() CUDA Driver API Libreria dinamica nvcuda installata con i driver della scheda video Funzioni cu*() In questo corso utilizzeremo solo Runtime

nvcc Compiler Driver Toolkit nvopen64 Compilatore da CUDA a ptx Versione modificata di AMD open64 (da CUDA 4.1 sarà basato su LLVM) ptxas Compilatore da ptx a cubin (binario eseguibile da GPU) cuobjdump Stessa filosofia di objdump per il codice CUDA cuda-memcheck Informazioni a run-time su errori di accesso a memoria Generalmente cudaerror ci da unspecified launch error

Percorso di compilazione nvcc divide il codice C/C++ dal codice CUDA Il codice C/C++ viene compilato da cl (visual studio) o gcc Il codice CUDA da nvopen64

cudafe (CUDA front end) Opera una serie di preprocessamenti utili ad i passi di compilazione successivi fatbin Produce un eseguibile contenente: cubin Uno per architettura specificata in compilazione ptx Compatibilità con architetture future In esecuzione, se non è presente un cubin compatibile Libreria dinamica contiene un compilatore jit per il ptx

Esercizio 1: hello world Somma di due vettori su GPU, C[i] = A[i] + B[i] Ogni elemento somma una coppia di elementi Funzioni Host da utilizzare: cudamalloc() cudamemcpy() cudafree() Funzione Device da realizzare: sumvec<<<dimgriglia, dimblocco>>> Primo tentativo: 1 thread per blocco Secondo tentativo: 32 thread per blocco

Esercizio 2: id a 2 dimensioni Somma di due matrici su GPU, C = A + B Ogni elemento somma una coppia di elementi Utilizzare blocco e griglia a 2 dimensioni: dim3 blocksize(block_w, BLOCK_H); es. BLOCK_W = BLOCK_H = 16 dim3 gridsize(grid_w, GRID_H);

Ogni thread deve posizionarsi in modo da effettuare una parte del lavoro: int idx = threadidx.x + blockidx.x*blockdim.x; int idy = threadidx.y + blockidx.y*blockdim.y; int id = idx + idy*pitch; Con pitch comunemente si identifica la distanza (in byte o #elementi) tra: il primo elemento di una riga il primo elemento della riga successiva Spesso pitch!= width

Esercizio 3: id che cambia ruolo Trasposta di una matrice Per semplicità: matrice quadrata Ogni thread: legge un elemento [i,j] scrive nella posizione [j,i] Primo tentativo: Un elemento per blocco Secondo tentativo: Blocco di 16*16

Esercizio 4: memoria condivisa Trasposta di una matrice Nella versione precedente Letture coalizzate Scritture non coalizzate Dimensione blocco: 16*16 Usiamo memoria condivisa per ottenere anche scritture coalizzate syncthreads()

Esercizio 5: Parallel Reduction Somma di elementi di un array: x[i] Problema detto parallel reduction È un problema che prende in input un array di valori e da in output un solo valore Ha senso realizzarlo in CUDA? Posso sfruttare la grande banda di memoria della GPU! Come lo parallelizziamo? Ogni blocco esegue una somma parziale

Passo 1: Ogni thread esegue una somma Risultato in memoria condivisa Passo 2: Metà dei thread del blocco esegue la somma sui risultati precedenti Passo 3: Un quarto dei thread esegue la somma sui risultati precedenti Un thread salva in memoria globale il risultato parziale Rieseguiamo il kernel sul vettore dei risultati parziali oppure eseguiamo le ultime somme su CPU oppure operazione atomica

Esercizio 6: Sincronizzazione Warp Ha gli stessi identici problemi dell'esercizio precedente Riscriviamo l'algoritmo La reduction è la parte più pesante del kernel Riduzione a livello di warp, anziché del blocco Un warp è implicitamente sincronizzato (niente syncthreads()) Grandezza sia della griglia e del blocco fissi Numero blocchi grande almeno quanto il numero di multiprocessori

Esercizio 7: Funzioni atomiche ballot() è una funzione warp vote disponibile solo su Fermi unsigned int ballot(int predicate) Ritorna una bitmask riferita ai thread attivi del warp corrente se predicate è diverso da zero bit uguale ad 1 Implementare una versione compatibile con c.c. 1.2 e 1.3 Utilizzare la funzione unsigned int atomicor(unsigned int* address, unsigned int val);

Esercizio 8: funzioni di vote syncthreads_and, syncthreads_or sono disponibili solo su Fermi Implementiamo delle funzioni equivalenti su c.c. 1.2 e 1.3 Come? Utilizzando le funzioni di warp vote int all(int predicate) int any(int predicate)

Esercizio 9: inline ptx Esempio di inline ptx per leggere i registri speciali: lane id id del thread nel warp warp id id del warp nel blocco sm id id del multiprocessore attuale grid id id del kernel cui appartiene il thread corrente

Esercizio 10: sezioni critiche e approfondimento compilazione Implementare lock() e unlock() per sezioni critiche: solo a livello di griglia di blocchi Non è possibile implementare lock a livello di thread (nel blocco) Deadlock sicuro Scopriamo perché disassemblando il codice finale cuobjdump -sass

Esercizio 11: Classi device Esempio di programmazione C++ lato device Solo su Fermi Classe Operation Polimorfismo Add Somma Sub Sottrazione