CUDA & OpenMP parallel programming
GPU vs CPU
Multiprocessor CPU
CPU POSIX Threads OpenMP
CPU POSIX Threads OpenMP
CPU POSIX Threads MPI OpenMP
CPU MapReduce POSIX Threads MPI OpenMP
GPU CUDA
GPU CUDA
GPU Vs CPU
GPU Vs CPU
Che cosè un processo?
fock()
Multi-threading
POSIX Threads, or Pthreads, is a POSIX standard for threads. The standard, POSIX.1c, Threads extensions, defines an API for creating and manipulating threads. #include <pthread.h> #include <stdio.h> #include <stdlib.h> #define NUM_THREADS 5 void *PrintHello(void *threadid) { long tid; tid = (long)threadid; printf("Hello World! It's me, thread #%ld!\n", tid); pthread_exit(NULL); } int main (int argc, char *argv[]) pthread_t threads[NUM_THREADS]; int rc; long t; for(t=0; t<NUM_THREADS; t++){ printf("In main: creating thread %ld\n", t); rc = pthread_create(&threads[t], NULL, PrintHello, (void *)t); if (rc){ printf("ERROR; return code from pthread_create() is %d\n", rc); exit(-1);
MPI Message Passing Interface
MPI Message Passing Interface
ESEMPIO
OpenMP Open Multi-Processing
Costrutti OpenMP
Costrutti OpenMP
ESEMPI
CUDA Compute Unified Device Architecture
Processing flow on CUDA
CUDA programming language
CUDA programming language Third party wrappers are also available for Python, Fortran, Java and Matlab
Architettura nelle GPU Nelle GPU sono integrati 512 CUDA Cores, nome scelto da NVIDIA per indicare i propri stream processors. Le GPU vedono i 512 CUDA Cores divisi in blocchi, ciascuno dei quali è indicato come streaming multiprocessor o SM;
Come è fatto un SM? La parte centrale vede la presenza dei 32 CUDA cores: a gruppi di 4 sono associati a due unità di load e store (LD/ST). Mentre 2 di questi gruppi, per un totale di 8 CUDA cores, sono abbinati ad una unità di tipo special function (SFU). A monte troviamo una cache per le istruzioni, seguita da due Warp Scheduler e da due unità per le operazioni di dispatch, collegate al registro dei files capace di gestire un massimo di 32.768 entry a 32bit. Ogni singolo CUDA Core integra al proprio interno un Dispatch Port, una unità per la raccolta degli operanti, una unità in floating point e una per i calcoli interni oltre ad una result queue.
Come è fatto un SM? Per ogni streaming microprocessor troviamo una cache dedicata da 64 Kbytes di capacità, partizionabile come memoria condivisa e come cache L1: i rapporti sono 1:3 oppure 3:1 Ogni SM integra al proprio interno 4 texture units, per un totale quindi di 60 unità di questo tipo presenti all'interno delle schede GeForce GTX 480 Le textures units sono dotate di una propria cache dedicata integrata all'interno dello specifico SM.
A completare la gerarchia della cache segnaliamo anche la presenza di una cache L2 integra alla GPU, di tipo unificato tra i vari SM, in quantitativo di 768 Kbytes. La gerarchia della cache vede quindi ogni thread a gestire in primo livello la cache da 64 Kbytes integrata in ogni SM, divisa in un blocco condiviso e in un secondo blocco di tipo L1 con dimensioni che possono essere pari a 16K/48K oppure 48K/16K.
GeForce GTX 480
Threads Hierarchy
Memory Hierarchy
Heterogeneous Programming
Coalesced Global Memory Access
Coalesced Global Memory Access