Παράλληλος προγραμματισμός σε επεξεργαστές γραφικών Συστήματα Παράλληλης Επεξεργασίας 9ο εξάμηνο, ΣΗΜΜΥ Εργαστήριο Υπολογιστικών Συστημάτων (CSLab) Νοέμβριος 2010
Περιεχόμενα...1 Σύντομη Ιστορική Αναδρομή...2 Compute Uni ed Device Architecture...3 Προγραμματιστικό Μοντέλο...4 CUDA C...5 Ζητήματα επίδοσης...6 Σύνδεσμοι
Γιατί GPUs? Πολύ μεγάλη υπολογιστική ισχύς. Ο #1 Top500 υπερυπολογιστής χρησιμοποιεί 7.168 GPUs. Μικρό κόστος. Μαζικά παράλληλοι επεξεργαστές (massively parallel/threaded). Μόδα ή το μέλλον;
Σύντομη Ιστορική Αναδρομή Επιταχυντές Γραφικών (Graphics Accelerators) Ανελάμβαναν μόνο το τελικό κομμάτι της απεικόνισης στην οθόνη. Μονάδες Επεξεργασίας Γραφικών (Graphics Processing Units GPUs) Αναλαμβάνουν ολόκληρη την διαδικασία απεικόνισης. Σωλήνωση γραφικών (graphics pipeline). Οι δύο όροι χρησιμοποιούνται πλέον εναλλάξιμα.
Σύντομη Ιστορική Αναδρομή Η σωλήνωση γραφικών Καθορίζει τα βήματα που απαιτούνται για την τελική απεικόνιση του τρισδιάστατου χώρου στην οθόνη (rendering). DirectX, OpenGL.
Σύντομη Ιστορική Αναδρομή Η σωλήνωση γραφικών 2000 Το στάδιο Fragment είναι προγραμματιζόμενο.
Σύντομη Ιστορική Αναδρομή Η σωλήνωση γραφικών 2001 Το στάδιο Geometry γίνεται προγραμματιζόμενο (Vertex Unit).
Σύντομη Ιστορική Αναδρομή Η σωλήνωση γραφικών 2003 Ανάγνωση από μνήμη. Διακλαδώσεις (branches). Πρώτες γλώσσες υψηλού επιπέδου (HLSL, Cg). Πρώτα προγράμματα γενικού σκοπού (GPGPU).
Σύντομη Ιστορική Αναδρομή Η σωλήνωση γραφικών 2007 Μονάδα αφιερωμένη στους γεωμετρικούς υπολογισμούς Ανάγνωση από & εγγραφή στη μνήμη. Εμφάνιση ενοποιημένων μονάδων επεξεργασίας.
Compute Uni ed Device Architecture (CUDA) Ο επεξεργαστής γραφικών Πηγή: anandtech.com
Compute Uni ed Device Architecture (CUDA) Επεξεργαστικά στοιχεία Συστοιχίες επεξεργαστών textures (Texture Processing Clusters TPCs). Πολυεπεξεργαστές ροών (Streaming Multiprocessors SMs). Επεξεργαστές ροών (Streaming Processors SPs). Πηγή: anandtech.com
Compute Uni ed Device Architecture (CUDA) Streaming Multiprocessor SM Πηγή: anandtech.com Σύνολο επεξεργαστικών στοιχείων (8 32 SPs). Μονάδα προώθησης εντολών (MT issue). Instruction cache. Constant cache (read-only). Texture cache. Μοιραζόμενη μνήμη (Shared memory). Special Function Units (SFUs). Πολύ μεγάλο αρχείο καταχωρητών (8K 32K).
Compute Uni ed Device Architecture (CUDA) Εκτέλεση νημάτων Υποστηρίζονται χιλιάδες ενεργά νήματα (μέχρι 24Κ, Fermi). Τα νήματα οργανώνονται σε ομάδες των 32 (warps) και δρομολογούνται από το SM στα SPs που το αποτελούν. Σε κάθε κύκλο ρολογιού όλα τα SPs εκτελούν την ίδια εντολή σε κάθε νήμα του warp που δρομολογήθηκε. Εάν συμβεί διακλάδωση εντός του warp, εκτελούνται και οι δύο κλάδοι, απενεργοποιώντας τα νήματα στον not taken κλάδο τους. Τα νήματα οργανώνονται περαιτέρω σε μπλοκ (blocks) και πλέγματα (grids). Όλα τα νήματα ενός μπλοκ μοιράζονται τους πόρους του SM (register le, shared memory). Η χρονοδρομολόγηση των warps ενός block έχει μηδαμινό κόστος.
Compute Uni ed Device Architecture (CUDA) Ιεραρχία μνήμης Καθολική μνήμη (global memory). 400 600 κύκλοι καθυστέρηση. Προσβάσιμη από όλα τα SMs. Μνήμη σταθερών (constant memory). Μέρος της κύριας μνήμης. Cached ανά SM. Μνήμη textures (texture memory). Μέρος της κύριας μνήμης. Χρησιμοποιείται κυρίως από εφαρμογές γραφικών. Cached ανά TPC. Μοιραζόμενη μνήμη (shared memory). On-chip. Κοινή για όλα τα SPs ενός SM. Μηδενική καθυστέρηση (ιδανικά).
Compute Uni ed Device Architecture (CUDA) Ιεραρχία μνήμης Καθολική μνήμη (global memory). 400 600 κύκλοι καθυστέρηση. Προσβάσιμη από όλα τα SMs. Μνήμη σταθερών (constant memory). Μέρος της κύριας μνήμης. Cached ανά SM. Μνήμη textures (texture memory). Μέρος της κύριας μνήμης. Χρησιμοποιείται κυρίως από εφαρμογές γραφικών. Cached ανά TPC. Μοιραζόμενη μνήμη (shared memory). On-chip. Κοινή για όλα τα SPs ενός SM. Μηδενική καθυστέρηση (ιδανικά). Τοπική μνήμη (local memory). Μέρος της κύριας μνήμης. Μπορεί να χρησιμοποιηθεί από τον μεταγλωττιστή για αυτόματες μεταβλητές. Δεν είναι cached.
Compute Uni ed Device Architecture (CUDA) Δυνατότητες συσκευών Οι δυνατότητες κάθε συσκευής καθορίζονται από το compute capability. <major>.<minor> Ο αριθμός major δηλώνει έκδοση της κύριας αρχιτεκτονικής. Ο αριθμός minor δηλώνει βελτιώσεις της αρχιτεκτονικής. Αρχιτεκτονική Comp. Capability G80 1.0 1.1 G92 1.1 Fermi 2.0
Προγραμματιστικό Μοντέλο Single Instruction Multiple Thread (SIMT). Όλα τα νήματα (ενός warp) εκτελούν την ίδια εντολή σε διαφορετικά δεδομένα εισόδου (πρβλ. data parallel, vector machines).
Προγραμματιστικό Μοντέλο Single Instruction Multiple Thread (SIMT). Όλα τα νήματα (ενός warp) εκτελούν την ίδια εντολή σε διαφορετικά δεδομένα εισόδου (πρβλ. data parallel, vector machines). Κάθε νήμα (ενός warp) μπορεί να ακολουθήσει διαφορετική ροή ελέγχου (divergent warp). Κάθε νήμα προγραμματίζεται με σειριακό τρόπο.
Προγραμματιστικό Μοντέλο Αρχιτεκτονικά στοιχεία που εκτίθενται στο Π.Μ. Σχεδόν ένα-προς-ένα αναλογία μεταξύ αρχιτεκτονικής και Π.Μ.
Προγραμματιστικό Μοντέλο Αρχιτεκτονικά στοιχεία που εκτίθενται στο Π.Μ. Σχεδόν ένα-προς-ένα αναλογία μεταξύ αρχιτεκτονικής και Π.Μ. Αρχιτεκτονικό στοιχείο Εκτίθεται TPC ΟΧΙ SM ΟΧΙ SP ΟΧΙ Warp ΝΑΙ Έμμεσα Block ΝΑΙ Grid ΝΑΙ Καθολική μνήμη ΝΑΙ Μνήμη σταθερών ΝΑΙ Μνήμη textures ΝΑΙ Μοιραζόμενη μνήμη ΝΑΙ Τοπική μνήμη ΝΑΙ Μέσω assembly Caches ΟΧΙ
Προγραμματιστικό Μοντέλο Οργάνωση νημάτων I..grid.block..block.warp..warp Τα blocks μπορεί να είναι 1Δ, 2Δ ή 3Δ. Το grid μπορεί να είναι 1Δ ή 2Δ.
Προγραμματιστικό Μοντέλο Οργάνωση νημάτων II Σε κάθε νήμα εντός του block ανατίθεται ένα μοναδικό ID. Τα νήματα ενός block (D x, D y, D z ) αριθμούνται κατά στήλες σειριακά στο διάστημα [0, D x D y D z 1]. Το ID του νήματος (x, y) του block είναι x + yd x. Το ID του νήματος (x, y, z) του block είναι x + yd x + zd x D y. Τα νήματα ανά 32 σχηματίζουν ένα warp.
Προγραμματιστικό Μοντέλο Οργάνωση νημάτων III Κάθε SM αναλαμβάνει την εκτέλεση ενός ή περισσοτέρων blocks.
Προγραμματιστικό Μοντέλο Πρόσβαση στην ιεραρχία μνήμης Η ιεραρχία μνήμης εκτίθεται στο Π.Μ. και μπορεί να την χειριστεί ο προγραμματιστής. Διαμοιρασμός της ιεραρχίας Καθολική μνήμη Μνήμη σταθερών Μνήμη textures Μοιραζόμενη μνήμη Register le Όλα τα blocks Όλα τα blocks Όλα τα blocks Όλα τα νήματα ενός block Όλα τα νήματα ενός block
Προγραμματιστικό Μοντέλο Συγχρονισμός Εντός ενός block (ή SM): Memory fences. Barriers. Atomic operations (compute capability >= 1.1). Καθολικά: Μεταξύ διαδοχικών κλήσεων πυρήνων. Atomic operations (compute capability >= 1.1). Barriers (compute capability >= 2.0).
CUDA C Επέκταση της C με επιπλέον τύπους και προσδιοριστές. Χρησιμοποιεί το front-end της C++. Πολυμορφισμός. Παράμετροι προεπιλογής (default parameters). Υπερφόρτωση τελεστών. Χώροι ονομάτων (namespaces). Πρότυπα συναρτήσεων (function templates). Αρχεία πηγαίου κώδικα με κατάληξη.cu. Μεταγλωττιστής: nvcc. Κώδικας που πρόκειται να τρέξει στην CPU (host code). Κώδικας που πρόκειται να τρέξει στην GPU (device code). Χρησιμοποιεί τον μεταγλωττιστή του συστήματος για την παραγωγή κώδικα για την CPU.
CUDA C Διαδικασία μεταγλώττισης $ nvcc o my_gpu_prog my_prog. cu.. nvcc front-end. host compiler. nvcc core. PTX assembly. fat binary.
CUDA C Διαχωρισμός κώδικα host/device Με χρήση προσδιοριστών (quali ers) συναρτήσεων.
CUDA C Διαχωρισμός κώδικα host/device Με χρήση προσδιοριστών (quali ers) συναρτήσεων. device Εκτελείται στην συσκευή. Μπορεί να κληθεί μόνο από κώδικα της συσκευής.
CUDA C Διαχωρισμός κώδικα host/device Με χρήση προσδιοριστών (quali ers) συναρτήσεων. device Εκτελείται στην συσκευή. Μπορεί να κληθεί μόνο από κώδικα της συσκευής. host Εκτελείται στο host. Μπορεί να κληθεί μόνο από κώδικα του host.
CUDA C Διαχωρισμός κώδικα host/device Με χρήση προσδιοριστών (quali ers) συναρτήσεων. device Εκτελείται στην συσκευή. Μπορεί να κληθεί μόνο από κώδικα της συσκευής. host Εκτελείται στο host. Μπορεί να κληθεί μόνο από κώδικα του host. global Εκτελείται στην συσκευή. Μπορεί να κληθεί μόνο από κώδικα του host. Σημείο εισόδου στην συσκευή. Συνήθως αναφέρεται ως GPU kernel.
CUDA C Διαχωρισμός κώδικα host/device Παράδειγμα device i n t g e t _ t h r e a d _ i d ( ) { r e t u r n (... ) ; } global void my_gpu_kernel ( const f l o a t * input, f l o a t * r e s u l t ) { i n t t i d = g e t _ t h r e a d _ i d ( ) ;... } i n t main ( ) { f l o a t * my_input, * m y _ r e s u l t ;... my_gpu_kernel <<<G, B>>>(my_input, m y _ r e s u l t ) ; }
CUDA C Διαχωρισμός κώδικα host/device Περιορισμοί για τις συναρτήσεις συσκευής Δεν υποστηρίζεται αναδρομή. Δεν υποστηρίζονται static μεταβλητές. Δεν μπορούν να δεχτούν μεταβλητό αριθμό ορισμάτων. Οι συναρτήσεις global δεν πρέπει να επιστρέφουν τιμή. Κάθε κλήση συνάρτησης global θα πρέπει να προσδιορίζει τις παραμέτρους εκτέλεσης (blocks, grid, κ.λπ.). Τα ορίσματα στις συναρτήσεις global πρέπει να είναι μέχρι 256 bytes.
CUDA C Προσδιοριστές μεταβλητών device Βρίσκεται στην καθολική μνήμη. Προσβάσιμη από όλα τα blocks. constant Βρίσκεται στην μνήμη σταθερών. Προσβάσιμη από όλα τα blocks. shared Βρίσκεται στην μοιραζόμενη μνήμη του SM. Προσβάσιμη από όλα τα νήματα ενός block.
CUDA C Προσδιοριστές μεταβλητών device Βρίσκεται στην καθολική μνήμη. Προσβάσιμη από όλα τα blocks. constant Βρίσκεται στην μνήμη σταθερών. Προσβάσιμη από όλα τα blocks. shared Βρίσκεται στην μοιραζόμενη μνήμη του SM. Προσβάσιμη από όλα τα νήματα ενός block. Π.χ., πίνακας 256 oats στην μοιραζόμενη μνήμη: shared f l o a t a r r a y [ 2 5 6 ] ;
CUDA C Τύποι διανυσμάτων (vector types) Συνένωση ίδιων βασικών τύπων. int2, int3, int4, oat2, oat3, oat4 κ.ο.κ. dim3 Ισοδύναμος με τον uint3. Αρχικοποιεί αυτόματα σε 1 όλα τα μη προσδιορισμένα μέρη του, π.χ., dim3 a (5,5) = uint3 b (5,5,1) Χρησιμοποιείται για τον προσδιορισμό των διαστάσεων των blocks και grids. Τα επιμέρους στοιχεία των τύπων αυτών προσπελαύνονται μέσω των πεδίων x, y, z και w. Π.χ., a.x == 5, a.y == 5 και a.z == 1.
CUDA C Περιβάλλον εκτέλεσης και οργάνωση νημάτων Κλήση πυρήνων Κατά την κλήση ενός πυρήνα για την GPU θα πρέπει να προσδιορίζονται πάντα το μέγεθος του block και του grid. Παράδειγμα δημιουργίας μονοδιάστατου block 32 νημάτων και αντίστοιχου grid: i n t main (... ) {... dim3 block ( 3 2 ) ; dim3 g r i d ( N / 3 2 ) ; my_gpu_kernel <<<grid, block > > > (... ) ;... }
CUDA C Περιβάλλον εκτέλεσης και οργάνωση νημάτων Κλήση πυρήνων Κατά την κλήση ενός πυρήνα για την GPU θα πρέπει να προσδιορίζονται πάντα το μέγεθος του block και του grid. Παράδειγμα δημιουργίας μονοδιάστατου block 32 νημάτων και αντίστοιχου grid: i n t main (... ) {... dim3 block ( 3 2 ) ; dim3 g r i d ( N / 3 2 ) ; my_gpu_kernel <<<grid, block > > > (... ) ;... }. Η κλήση του πυρήνα μπορεί να αποτύχει, εάν δεν επαρκούν οι πόροι της συσκευής (registers,.. shared memory).
CUDA C Περιβάλλον εκτέλεσης και οργάνωση νημάτων Προσδιορισμός νήματος Το ID κάθε νήματος προσδιορίζεται από τις «συντεταγμένες» του εντός του block στο οποίο ανήκει. Η CUDA C ορίζει τις εξής μεταβλητές: uint3 threadidx: οι συντεταγμένες του νήματος εντός του τρέχοντος block. uint3 blockidx: οι συντεταγμένες του block εντός του grid. dim3 blockdim: οι διαστάσεις του block. dim3 griddim: οι διαστάσεις του grid. Π.χ., το ID του τρέχοντος νήματος ενός μονοδιάστατου block είναι tid = blockdim.x*blockidx.x + threadidx. x
CUDA C Παράδειγμα Άθροισμα διανυσμάτων Κάθε νήμα αναλαμβάνει τον υπολογισμό ενός στοιχείου. Μονοδιάστατα blocks και grid. global void vecadd ( const f l o a t * a, const f l o a t *b, f l o a t * c, s i z e _ t n ) { t i d = blockdim. x * b l o c k I d x. x + t h r e a d I d x. x ; i f ( t i d >= n ) return ; c [ t i d ] = a [ t i d ] + b [ t i d ] ; }
CUDA C Πρόσβαση στην ιεραρχία μνήμης Μνήμη σταθερών Με χρήση του προσδιοριστή constant. Μοιραζόμενη μνήμη Με χρήση του προσδιοριστή shared. Μνήμη textures Με χρήση ειδικών δομών που ονομάζονται texture references. Τοπική μνήμη Με χρήση του προσδιοριστή. local στην PTX assembly.
CUDA C Πρόσβαση στην ιεραρχία μνήμης Μοιραζόμενη μνήμη Το μέγεθος της μοιραζόμενης μνήμης μπορεί να καθοριστεί και κατά την κλήση μίας global συνάρτησης. Κώδικας πυρήνα global my_gpu_kernel (... ) { } e x t e r n shared f l o a t shmem_buff [ ] ;... Κλήση του πυρήνα i n t main ( ) { }... shmem_size = 32* s i z e o f ( f l o a t ) ; my_gpu_kernel <<<G, B, shmem_size > > > (... ) ;...
CUDA C Συγχρονισμός Memory fences Barriers Εγγυάται ότι όλες οι προσβάσεις στην μνήμη (global ή shared) μέχρι αυτό το σημείο έχουν πραγματοποιηθεί. threadfence(), threadfence_block(). Εγγυάται ότι όλα τα νήματα του block έχουν φτάσει σε κάποιο σημείο και όλες οι προσβάσεις που έχουν γίνει στην μνήμη (global ή shared) έχουν πραγματοποιηθεί. syncthreads(). Ατομικές συναρτήσεις Αναφορές στην μνήμη (global, shared). atomicadd(), atomicinc () κ.ο.κ.
CUDA C Συγχρονισμός Memory fences Barriers Εγγυάται ότι όλες οι προσβάσεις στην μνήμη (global ή shared) μέχρι αυτό το σημείο έχουν πραγματοποιηθεί. threadfence(), threadfence_block(). Εγγυάται ότι όλα τα νήματα του block έχουν φτάσει σε κάποιο σημείο και όλες οι προσβάσεις που έχουν γίνει στην μνήμη (global ή shared) έχουν πραγματοποιηθεί. syncthreads(). Ατομικές συναρτήσεις Αναφορές στην μνήμη (global, shared). atomicadd(), atomicinc () κ.ο.κ.. Καθολικός συγχρονισμός..... Μόνο μεταξύ διαδοχικών κλήσεων του πυρήνα.
CUDA C Παράδειγμα Γινόμενο Διανυσμάτων (Dot Product) v = a b v = N i=1 a ib i Τα μερικά αθροίσματα βρίσκονται στον πίνακα C. Χρειάζεται και άλλος πυρήνας για την τελική αναγωγή. global void dotprod ( const f l o a t *a, const f l o a t *b, f l o a t * c, s i z e _ t n ) { extern shared partial_ prod [ ] ; / / equals the block s i z e i n t t i d = blockdim. x * b l o c k I d x. x + t h r e a d I d x. x ; i n t b t i d = t h r e a d I d x. x ; i f ( t i d >= n ) return ; p a r t i a l _ p r o d [ b t i d ] = a [ t i d ] * b [ t i d ] ; s y n c t h r e a d s ( ) ; } i f ( b t i d == 0 ) { f l o a t p a r t i a l _ s u m = 0 ; f o r ( s i z e _ t i = 0 ; i < blockdim. x ; ++ i ) partial_sum += parti al_ pro d [ i ] ; c [ b l o c k I d x. x ] = p a r t i a l _ s u m ; }
CUDA C Runtime Environment Συναρτήσεις διαχείρισης μνήμης. cudamalloc(), cudafree(). cudamallochost(), cudafreehost(). Συναρτήσεις επικοινωνίας με την συσκευή. cudamemcpy(). Συναρτήσεις διαχείρισης σφαλμάτων. cudagetlasterror (). Συναρτήσεις διαχείρισης νημάτων. cudathreadsynchronize(), cudathreadexit(). Συναρτήσεις διαχείρισης της συσκευής. Συναρτήσεις διαχείρισης γεγονότων.. Μεταγλώττιση..... cudaeventcreate(), cudaeventdestroy(), cudaeventelapsedtime(). Συνδεση με την βιβλιοθήκη cudart, lcudart.
CUDA C Σκελετός Προγράμματος i n t main ( i n t argc, char ** argv ) { / / A l l o c a t e on h o s t cudamallochost (... ) ; / / I n i t i a l i z e your data / / A l l o c a t e on the d e v i c e cudamalloc (... ) ; / / Copy data to the d e v i c e cudamemcpy (..., cudamemcpyhosttodevice ) ; / / Setup b l o c k s and g r i d s dim3 block (... ) ; dim3 g r i d (... ) ; / / Launch the k e r n e l my_gpu_kernel <<<grid, block > > > (... ) ; / / Wait f o r k e r n e l to f i n i s h cudathreadsynchronize ( ) ; / / Copy r e s u l t back to h o s t cudamemcpy (..., cudamemcpydevicetohost ) ; / / P r o c e s s and r e p o r t the r e s u l t s } r e t u r n 0 ;
Προϋποθέσεις για υψηλή επίδοση Συνένωση αναφορών στην καθολική μνήμη (memory access coalescing). Warps χωρίς διακλαδώσεις. Εκμετάλλευση της μοιραζόμενης μνήμης. Μεγάλος αριθμός νημάτων. Υψηλή χρησιμοποίηση των SMs.
Προϋποθέσεις για υψηλή επίδοση Συνένωση αναφορών στην καθολική μνήμη Κρύβει την καθυστέρηση πρόσβασης στην καθολική μνήμη. Η καθολική μνήμη δεν είναι cached. Η καθολική μνήμη χωρίζεται σε τμήματα (segments) των 32, 64 ή 128 bytes, ευθυγραμμισμένα (aligned) στα αντίστοιχα όρια. Η πρόσβαση στην μνήμη γίνεται με διενέργειες (transactions) ανά τμήμα. Με την συνένωση των αναφορών στην μνήμη επιδιώκουμε με ένα transaction να μεταφέρουμε όσο το δυνατόν περισσότερα χρήσιμα δεδομένα. Αυστηρές προϋποθέσεις στην ακολουθία των αναφορών ανάμεσα στα νήματα και στο alignment των δεδομένων.
Προϋποθέσεις για υψηλή επίδοση Συνένωση αναφορών στην καθολική μνήμη Προϋποθέσεις Τα 16 νήματα ενός half-warp θα πρέπει να προσπελαύνουν είτε λέξεις 4-byte (ένα 64-byte transaction) είτε λέξεις 8-byte (ένα 128-byte transaction) είτε λέξεις 16-byte (δύο 128-byte transactions) Και οι 16 λέξεις θα πρέπει να βρίσκονται στο ίδιο memory segment. Το k-οστό νήμα θα πρέπει να προσπελαύνει την k-οστή λέξη.
Προϋποθέσεις για υψηλή επίδοση Συνένωση αναφορών στην καθολική μνήμη Προϋποθέσεις Συνενωμένες προσβάσεις oat (ένα transaction).
Προϋποθέσεις για υψηλή επίδοση Συνένωση αναφορών στην καθολική μνήμη Προϋποθέσεις Μη συνενωμένες προσβάσεις oat (16 transactions).
Προϋποθέσεις για υψηλή επίδοση Warps χωρίς διακλαδώσεις Το SIMT μοντέλο επιτρέπει σε κάθε νήμα να ακολουθήσει διαφορετικό κλάδο, αλλά Κάθε κλάδος εκτελείται από όλα τα νήματα του warp, απενεργοποιώντας τα αντίστοιχα νήματα όταν εκτελείται ο not taken κλάδος τους. Το πλήθος των χρήσιμων υπολογισμών ανά νήμα μειώνεται σημαντικά.
Προϋποθέσεις για υψηλή επίδοση Εκμετάλλευση της μοιραζόμενης μνήμης Η πρόσβαση στην μοιραζόμενη μνήμη έχει μηδενικό κόστος. Οργάνωση σε 16 banks. Διαδοχικές λέξεις ανατίθενται σε διαδοχικά banks. Εκμετάλλευση της χρονικής τοπικότητας των προγραμμάτων. Δύο φάσεις: 1. (Προ)φόρτωση των δεδομένων προς υπολογισμό. 2. Υπολογισμοί με χρήση της μοιραζόμενης μνήμης.
Προϋποθέσεις για υψηλή επίδοση Εκμετάλλευση της μοιραζόμενης μνήμης Η πρόσβαση στην μοιραζόμενη μνήμη έχει μηδενικό κόστος. Οργάνωση σε 16 banks. Διαδοχικές λέξεις ανατίθενται σε διαδοχικά banks. Εκμετάλλευση της χρονικής τοπικότητας των προγραμμάτων. Δύο φάσεις: 1. (Προ)φόρτωση των δεδομένων προς υπολογισμό. 2. Υπολογισμοί με χρήση της μοιραζόμενης μνήμης.. Περιορισμοί.. Περιορισμένο μέγεθος (16Κ) που μοιράζονται όλα τα νήματα ενός block... Μπορεί να οδηγήσει σε χαμηλή χρησιμοποιήση των SMs. Προσοχή στα bank con icts.
Προϋποθέσεις για υψηλή επίδοση Υψηλή χρησιμοποιήση των SMs Κάθε SM υποστηρίζει ένα μέγιστο αριθμό ενεργών block (ή warps). Ένα warp είναι ενεργό όταν μπορεί να δρομολογηθεί. Περισσότερα ενεργά νήματα μπορούν να κρύψουν τις καθυστερήσεις από την πρόσβαση στην καθολική μνήμη. Η χρησιμοποιήση των SMs εξαρτάται από τις απαιτήσεις κάθε νήματος σε καταχωρητές και μοιραζόμενη μνήμη, το πλήθος των νημάτων ανά block.
Προϋποθέσεις για υψηλή επίδοση Υψηλή χρησιμοποιήση των SMs Παράδειγμα Υποθέτουμε GPU με compute capability 1.0: Register le 8192 Shared memory 16384 Active blocks/sm 8 Active warps/sm 24 Υποθέτουμε πυρήνα με Block size 128 Register usage/thread 9 Shared memory usage/thread 1024 Πόσα ενεργά warps υπάρχουν ανά SM?
Προϋποθέσεις για υψηλή επίδοση Υψηλή χρησιμοποιήση των SMs Παράδειγμα Υποθέτουμε GPU με compute capability 1.0: Register le 8192 Shared memory 16384 Active blocks/sm 8 Active warps/sm 24 Υποθέτουμε πυρήνα με Block size 128 Register usage/thread 9 Shared memory usage/thread 1024 Πόσα ενεργά warps υπάρχουν ανά SM? CUDA Occupancy calculator.
Ανακεφαλαίωση SIMT μοντέλο προγραμματισμού. Επιδιώκουμε τοπικότητα των αναφορών μεταξύ συνεχόμενων νημάτων. Τα νήματα οργανώνονται σε 32-άδες και δρομολογούνται στα SPs του SM σε κάθε κύκλο ρολογιού. Κάθε μπλοκ τρέχει αποκλειστικά σε ένα SM. Συγχρονισμός μόνο μεταξύ των νημάτων ενός block. Προσπαθούμε να «κρύψουμε» το κόστος πρόσβασης στην καθολική μνήμη.
Σύνδεσμοι www.gpgpu.org www.gpucomputing.net nvidia CUDA Zone, http://www.nvidia.com/object/cuda_home_new.html OpenCL http://www.khronos.org/opencl