Παράλληλος προγραμματισμός σε επεξεργαστές γραφικών

Σχετικά έγγραφα
Παράλληλος Προγραμματισμός σε Επεξεργαστές Γραφικών

Παράλληλος Προγραμματισμός σε Επεξεργαστές Γραφικών

Παράλληλος Προγραμματισμός σε Επεξεργαστές Γραφικών

Παράλληλος Προγραμματισμός σε Επεξεργαστές Γραφικών

Παράλληλος Προγραμματισμός με OpenCL

ΕΘΝΙΚΟ ΚΑΙ ΚΑΠΟΔΙΣΤΡΙΑΚΟ ΠΑΝΕΠΙΣΤΗΜΙΟ ΑΘΗΝΩΝ

CUDA Compute Unified Device Architecture

Προγραμματισμός GPUs μέσω του περιβάλλοντος CUDA

ΣΥΣΤΗΜΑΤΑ ΠΑΡΑΛΛΗΛΗΣ ΕΠΕΞΕΡΓΑΣΙΑΣ 9o εξάμηνο ΗΜΜΥ, ακαδημαϊκό έτος

Ανάπτυξη αλγόριθμου Closest Pair με CUDA API

Π Τ Υ Χ Ι Α Κ Η / Δ Ι Π Λ Ω Μ ΑΤ Ι Κ Η Ε Ρ ΓΑ Σ Ι Α

Προγραμματισμός Συστημάτων Υψηλών Επιδόσεων (ΗΥ421) Εργασία Εξαμήνου

ΕΘΝΙΚΟ ΜΕΤΣΟΒΙΟ ΠΟΛΥΤΕΧΝΕΙΟ

ΕΘΝΙΚΟ ΜΕΤΣΟΒΙΟ ΠΟΛΥΤΕΧΝΕΙΟ. Άσκηση 5: Παράλληλος προγραμματισμός σε επεξεργαστές γραφικών

Αρχιτεκτονική Υπολογιστών

Εισαγωγή στον GPGPU προγραμματισμό 50,000, ,000,000 (1 από 2) 19/5/2018

Αρχιτεκτονική Υπολογιστών

Ασκήσεις στα Προηγμένα Θέματα Αρχιτεκτονικής Υπολογιστών

Παράλληλη Επεξεργασία

ΕΘΝΙΚΟ ΜΕΤΣΟΒΙΟ ΠΟΛΥΤΕΧΝΕΙΟ Σχολή Μηχανολόγων Μηχανικών Εργαστήριο Θερμικών Στροβιλομηχανών

Ετήσια Τεχνική Έκθεση

ΑΡΙΣΤΟΤΕΛΕΙΟ ΠΑΝΕΠΙΣΤΗΜΙΟ ΘΕΣΣΑΛΟΝΙΚΗΣ ΠΟΛΥΤΕΧΝΙΚΗ ΣΧΟΛΗ

Ατομική Διπλωματική Εργασία ΕΚΤΕΛΕΣΗ ΤΟΥ QUERY 6 ΤΟΥ BENCHMARK TPC-H ΣΕ ΚΑΡΤΑ ΓΡΑΦΙΚΩΝ, ΜΕ CUDA. Μαρία Λοϊζίδη ΠΑΝΕΠΙΣΤΗΜΙΟ ΚΥΠΡΟΥ ΤΜΗΜΑ ΠΛΗΡΟΦΟΡΙΚΗΣ

Οργάνωση επεξεργαστή (2 ο μέρος) ΜΥΥ-106 Εισαγωγή στους Η/Υ και στην Πληροφορική

Πτυχιακή εργασία της φοιτήτριας Λαδοπούλου Παρασκευής ΑΛΕΞΑΝΔΡΕΙΟ Τ.Ε.Ι. ΘΕΣΣΑΛΟΝΙΚΗΣ ΣΧΟΛΗ ΤΕΧΝΟΛΟΓΙΚΩΝ ΕΦΑΡΜΟΓΩΝ ΤΜΗΜΑ ΠΛΗΡΟΦΟΡΙΚΗΣ

Λειτουργικά Συστήματα (Λ/Σ)

Προσομοιώσεις Monte Carlo σε GPU

Η πολυνηματική γλώσσα προγραμματισμού Cilk

Συστήματα Παράλληλης & Κατανεμημένης Επεξεργασίας

ΑΡΙΣΤΟΤΕΛΕΙΟ ΠΑΝΕΠΙΣΤΗΜΙΟ ΘΕΣΣΑΛΟΝΙΚΗΣ

Κατανεμημένο Σύστημα Διαχείρισης Εργασιών Απομακρυσμένης Εκτέλεσης Κώδικα Για Επιταχυντές Γραφικών Σε Συστοιχίες Υπολογιστών ΔΙΠΛΩΜΑΤΙΚΗ ΕΡΓΑΣΙΑ

Ε-85: Ειδικά Θέµατα Λογισµικού

Προγραμματισμός Η/Υ (ΤΛ2007 )

Παράλληλη Επεξεργασία

Δομημένος Προγραμματισμός

Ιόνιο Πανεπιστήμιο Τμήμα Πληροφορικής Αρχιτεκτονική Υπολογιστών Κρυφές Μνήμες. (οργάνωση, λειτουργία και απόδοση)

Δομημένος Προγραμματισμός (ΤΛ1006)

Αρχιτεκτονική Υπολογιστών

ΠΑΝΕΠΙΣΤΗΜΙΟ ΘΕΣΣΑΛΙΑΣ ΠΟΛΥΤΕΧΝΙΚΗ ΣΧΟΛΗ ΤΜΗΜΑ ΜΗΧΑΝΙΚΩΝ Η/Υ ΤΗΛΕΠΙΚΟΙΝΩΝΙΩΝ ΚΑΙ ΔΙΚΤΥΩΝ. Διπλωματικη Εργασια. Γεωργία Ε. Κρόκου

ΕΘΝΙΚΟ ΜΕΤΣΟΒΙΟ ΠΟΛΥΤΕΧΝΕΙΟ

10 η Διάλεξη C++ - Πίνακες. Δρ. Χρήστος Δρόσος ΑΕΙ ΠΕΙΡΑΙΑ ΤΤ ΤΜΗΜΑ ΑΥΤΟΜΑΤΙΣΜΟΥ

Πολυπύρηνοι επεξεργαστές Multicore processors

Λύβας Χρήστος Αρχική επιµέλεια Πιτροπάκης Νικόλαος και Υφαντόπουλος Νικόλαος

ΑΡΙΣΤΟΤΕΛΕΙΟ ΠΑΝΕΠΙΣΤΗΜΙΟ ΘΕΣΣΑΛΟΝΙΚΗΣ ΠΟΛΥΤΕΧΝΙΚΗ ΣΧΟΛΗ

Αρχιτεκτονική υπολογιστών

Προγραμματισμός Συστημάτων Υψηλών Επιδόσεων (ΗΥ421) 3η Εργαστηριακή Άσκηση

Δομημένος Προγραμματισμός. Τμήμα Επιχειρηματικού Σχεδιασμού και Πληροφοριακών Συστημάτων

Μηχανοτρονική. Τμήμα Μηχανικών Παραγωγής και Διοίκησης 7 ο Εξάμηνο,

Το ολοκληρωμένο κύκλωμα μιας ΚΜΕ. «Φέτα» ημιαγωγών (wafer) από τη διαδικασία παραγωγής ΚΜΕ

Προγραμματισμός συστημάτων UNIX/POSIX. Θέμα επιλεγμένο από τους φοιτητές: Προγραμματιστικές τεχνικές που στοχεύουν σε επιδόσεις

Δομημένος Προγραμματισμός

All Pairs Shortest Path

Προγραμματισμός Ι (ΗΥ120)

Ιεραρχία Μνήμης. Ιεραρχία μνήμης και τοπικότητα. Σκοπός της Ιεραρχίας Μνήμης. Κρυφές Μνήμες

Πανεπιστήμιο Πειραιώς Τμήμα Πληροφορικής Πρόγραμμα Μεταπτυχιακών Σπουδών «Πληροφορική»

Διαδικασιακός Προγραμματισμός

Εικονική Μνήμη (Virtual Μemory)

Δομημένος Προγραμματισμός

Κεντρική Μονάδα Επεξεργασίας

ΑΣΚΗΣΗ 6: ΔΕΙΚΤΕΣ. Σκοπός της Άσκησης. 1. Εισαγωγικά στοιχεία για τους Δείκτες

Συστήματα Παράλληλης και Κατανεμημένης Επεξεργασίας

Εισαγωγή εκτελέσιμου κώδικα σε διεργασίες

Προγραμματισμός Υπολογιστών & Υπολογιστική Φυσική

ΕΘΝΙΚΟ ΜΕΤΣΟΒΙΟ ΠΟΛΥΤΕΧΝΕΙΟ

Παράλληλα Συστήματα. Γιώργος Δημητρίου. Ενότητα 3 η : Παράλληλη Επεξεργασία. Πανεπιστήμιο Θεσσαλίας - Τμήμα Πληροφορικής

ΠΑΝΕΠΙΣΤΗΜΙΟ ΘΕΣΣΑΛΙΑΣ ΠΟΛΥΤΕΧΝΙΚΗ ΣΧΟΛΗ ΤΜΗΜΑ ΜΗΧΑΝΙΚΩΝ Η/Υ, ΤΗΛΕΠΙΚΟΙΝΩΝΙΩΝ ΚΑΙ ΔΙΚΤΥΩΝ

Είναι το «μυαλό» του υπολογιστή μας. Αυτός κάνει όλους τους υπολογισμούς και τις πράξεις. Έχει δική του ενσωματωμένη μνήμη, τη λεγόμενη κρυφή

Επίλυση ιδιάστατης Ροής µε Κεντροκυψελική ιατύπωση σε Μη- οµηµένα Πλέγµατα. Προγραµµατισµός σε Επεξεργαστές Καρτών Γραφικών.

Προβλήματα ταυτόχρονης εκτέλεσης (για νήματα με κοινή μνήμη)

ΑΡΙΣΤΟΤΕΛΕΙΟ ΠΑΝΕΠΙΣΤΗΜΙΟ ΘΕΣΣΑΛΟΝΙΚΗΣ

Πίνακες: μια σύντομη εισαγωγή. Πίνακες χαρακτήρων: τα "Αλφαριθμητικά"

ΕΘΝΙΚΟ ΜΕΤΣΟΒΙΟ ΠΟΛΥΤΕΧΝΕΙΟ ΔΙΑΤΜΗΜΑΤΙΚΟ ΠΡΟΓΡΑΜΜΑ ΜΕΤΑΠΤΥΧΙΑΚΩΝ ΣΠΟΥΔΩΝ ΥΠΟΛΟΓΙΣΤΙΚΗΣ ΜΗΧΑΝΙΚΗΣ ΜΕΤΑΠΤΥΧΙΑΚΗ ΕΡΓΑΣΙΑ

ii Πυργιώτης Θεμιστοκλής

Εργαστήριο ΔΙΕΡΓΑΣΙΕΣ - ΔΙΑΧΕΙΡΙΣΗ

Προβλήματα ταυτόχρονης εκτέλεσης (για νήματα με κοινή μνήμη)

Διεργασίες (μοντέλο μνήμης & εκτέλεσης) Προγραμματισμός II 1

Διαφορές single-processor αρχιτεκτονικών και SoCs

Συστήματα Παράλληλης & Κατανεμημένης Επεξεργασίας

i Όλες οι σύγχρονες ΚΜΕ είναι πολυπλοκότερες!

Αρχιτεκτονικη υπολογιστων

Οργάνωση Υπολογιστών (ΙI)

Ενδεικτική περιγραφή μαθήματος

ιεργασίες και νήµατα Προγραµµατισµός ΙΙΙ 1 lalis@inf.uth.gr

Προγραμματισμός Ι. Προχωρημένα Θέματα. Δημήτρης Μιχαήλ. Τμήμα Πληροφορικής και Τηλεματικής Χαροκόπειο Πανεπιστήμιο

Αρχιτεκτονική Μνήμης

Θέματα Μεταγλωττιστών

Προγραμματισμός Η/Υ 1 (Εργαστήριο)

Προβλήματα ταυτόχρονης εκτέλεσης (για νήματα με κοινή μνήμη)

Λειτουργικά Συστήματα 7ο εξάμηνο, Ακαδημαϊκή περίοδος

Μεταγλώττιση και σύνδεση πολλαπλών αρχείων κώδικα. Προγραμματισμός II 1

Η γλώσσα προγραμματισμού C

Κλήση Συναρτήσεων ΚΛΗΣΗ ΣΥΝΑΡΤΗΣΕΩΝ. Γεώργιος Παπαϊωάννου ( )

Παραλληλισμός Αλγορίθμων σε Κάρτες Γραφικών για Σχεδιασμό Κίνησης

ΠΛΕ- 074 Αρχιτεκτονική Υπολογιστών 2

Προγραμματισμός Ι. Δυναμική Διαχείριση Μνήμης. Δημήτρης Μιχαήλ. Ακ. Έτος Τμήμα Πληροφορικής και Τηλεματικής Χαροκόπειο Πανεπιστήμιο

Ανάπτυξη και Σχεδίαση Λογισμικού

ΚΑΤΑΣΚΕΥΑΣΤΕΣ ΑΝΤΙΓΡΑΦΗΣ

Κύρια μνήμη. Μοντέλο λειτουργίας μνήμης. Ένα τυπικό υπολογιστικό σύστημα σήμερα. Οργάνωση Υπολογιστών (ΙI)

int array[10]; double arr[5]; char pin[20]; Προγραµµατισµός Ι

SMPcache. Ένα εργαλείο για προσομοίωση-οπτικοποίηση κρυφής μνήμης (Cache)

Transcript:

Παράλληλος προγραμματισμός σε επεξεργαστές γραφικών Συστήματα Παράλληλης Επεξεργασίας 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