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

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

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

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

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

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

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

CUDA Compute Unified Device Architecture

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

All Pairs Shortest Path

Κεντρική Μονάδα Επεξεργασίας. Επανάληψη: Απόδοση ΚΜΕ. ΚΜΕ ενός κύκλου (single-cycle) Παραλληλισμός σε επίπεδο εντολών. Υπολογιστικό σύστημα

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

Διεργασίες και Νήματα (2/2)

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

Τεχνικές για διαμοιρασμό φορτίου και μακροεντολές Broadcast - Scatter για αποδοτικές πολύ-επεξεργαστικές εφαρμογές

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

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

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

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

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

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

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

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

Εφαρμογές μικροελεγκτών

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

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

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

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

Παραλληλισμός σε επίπεδο εντολών

Εισαγωγικά & Βασικές Έννοιες

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

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

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

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

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

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

Μνήμη Διευθύνσεις Δείκτες. Προγραμματισμός II 1

ΕΙΣΑΓΩΓΗ ΣΤΟΝ ΠΑΡΑΛΛΗΛΟ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟ ΜΕ OpenMP

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

Συστήματα μνήμης και υποστήριξη μεταφραστή για MPSoC

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

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

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

; Γιατί είναι ταχύτερη η λήψη και αποκωδικοποίηση των εντολών σταθερού μήκους;

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

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

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

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

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

Υ- 07 Παράλληλα Συστήματα Συνέπεια και συνοχή μνήμης

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

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

Εισαγωγικά & Βασικές Έννοιες

Δημιουργία & Τερματισμός Διεργασιών. Προγραμματισμός II 1

Αρχιτεκτονικές Συνόλου Εντολών

Transcript:

Παράλληλος Προγραμματισμός σε Επεξεργαστές Γραφικών Συστήματα Παράλληλης Επεξεργασίας 9ο εξάμηνο, ΣΗΜΜΥ Εργαστήριο Υπολογιστικών Συστημάτων (CSLab) Φεβρουάριος 2014

Περιεχόμενα 1 Εισαγωγή 2 Επεξεργαστές γραφικών γενικού σκοπού 3 Compute Uni ed Device Architecture 4 Προγραμματιστικό Μοντέλο 5 CUDA C 6 Ζητήματα επίδοσης 7 Σύνδεσμοι 2 01 / 2014 Προγραμματισμός GPUs

Τι είναι οι επιταχυντές; Σύγχρονες CPUs, αρκετά γενικές για να καλύψουν κάθε ανάγκη 3 01 / 2014 Προγραμματισμός GPUs

Τι είναι οι επιταχυντές; Σύγχρονες CPUs, αρκετά γενικές για να καλύψουν κάθε ανάγκη Μια ιδέα από τα παλιά (70 s) Co-processors (μαθηματικές πράξεις) Επεξεργαστές γραφικών (GPUs) Ειδικές υπολογιστικά απαιτητικές λειτουργίες (signal processing, encryption κ.λπ.) 3 01 / 2014 Προγραμματισμός GPUs

Τι είναι οι επιταχυντές; Σύγχρονες CPUs, αρκετά γενικές για να καλύψουν κάθε ανάγκη Μια ιδέα από τα παλιά (70 s) Co-processors (μαθηματικές πράξεις) Επεξεργαστές γραφικών (GPUs) Ειδικές υπολογιστικά απαιτητικές λειτουργίες (signal processing, encryption κ.λπ.) Οι επιταχυντές σήμερα Η τεχνολογία επανέρχεται Υποστήριξη data- και compute-intensive εφαρμογών Ειδικές λειτουργίες (FPGAs, προγραμματιζόμενο h/w) 3 01 / 2014 Προγραμματισμός GPUs

Τι είναι οι επιταχυντές; Γενική αρχιτεκτονική System on Chip (SoC) Επεξεργαστής και συνεπεξεργαστές στο ίδιο chip Ενσωματωμένα συστήματα και όχι μόνο (π.χ., Intel s/amd s integrated graphics) + Μικρό overhead επικοινωνίας Dedicated h/w Off-chip Επικοινωνία μέσω του διαύλου PCIe (Intel Phi, NVIDIA GPUs, κ.α.) + Ευελιξία και επεκτασιμότητα Κόστος επικοινωνίας 4 01 / 2014 Προγραμματισμός GPUs

Γιατί επιταχυντές; Πολύ μεγάλη υπολογιστική ισχύς Καλή ενεργειακή απόδοση Μέσα στο top-10 των Top500 και Green500 τα τελευταία χρόνια Μικρό κόστος Μαζικά παράλληλοι επεξεργαστές (massively parallel/threaded) Βελτιστοποιημένοι για συγκεκριμένα workloads 5 01 / 2014 Προγραμματισμός GPUs

Επεξεργαστές γραφικών γενικού σκοπού Πηγή: anandtech.com Πολύ απλά επεξεργαστικά στοιχεία (single-issue, in-order) Massively threaded Πολύ μικρή ή ανύπαρκτη ιεραρχία κρυφής μνήμης Μεγάλο εύρος ζώνης μνήμης 6 01 / 2014 Προγραμματισμός GPUs

Compute Uni ed Device Architecture (CUDA) Επεξεργαστικά στοιχεία Πηγή: anandtech.com Συστοιχίες επεξεργαστών textures (Texture Processing Clusters TPCs) Πολυεπεξεργαστές ροών (Streaming Multiprocessors SMs) Επεξεργαστές ροών (Streaming Processors SPs) 7 01 / 2014 Προγραμματισμός GPUs

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) 8 01 / 2014 Προγραμματισμός GPUs

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 έχει μηδαμινό κόστος 9 01 / 2014 Προγραμματισμός GPUs

Compute Uni ed Device Architecture (CUDA) Ιεραρχία μνήμης Καθολική μνήμη (global memory) 400 600 κύκλοι καθυστέρηση Προσβάσιμη από όλα τα SMs Μοιραζόμενη μνήμη (shared memory) On-chip Κοινή για όλα τα SPs ενός SM Μηδενική καθυστέρηση (ιδανικά) Χρήση και ως L1 cache 10 01 / 2014 Προγραμματισμός GPUs

Compute Uni ed Device Architecture (CUDA) Ιεραρχία μνήμης Καθολική μνήμη (global memory) 400 600 κύκλοι καθυστέρηση Προσβάσιμη από όλα τα SMs Μοιραζόμενη μνήμη (shared memory) On-chip Κοινή για όλα τα SPs ενός SM Μηδενική καθυστέρηση (ιδανικά) Χρήση και ως L1 cache Μνήμη σταθερών (constant memory) Μέρος της κύριας μνήμης, cached ανά SM Μνήμη textures (texture memory) Μέρος της κύριας μνήμης, cached ανά TPC Χρησιμοποιείται κυρίως από εφαρμογές γραφικών Τοπική μνήμη (local memory) Μέρος της κύριας μνήμης, όχι cached Μπορεί να χρησιμοποιηθεί από τον μεταγλωττιστή για αυτόματες μεταβλητές 10 01 / 2014 Προγραμματισμός GPUs

Compute Uni ed Device Architecture (CUDA) Δυνατότητες συσκευών Οι δυνατότητες κάθε συσκευής καθορίζονται από το compute capability <major>.<minor> Ο αριθμός major δηλώνει έκδοση της κύριας αρχιτεκτονικής Ο αριθμός minor δηλώνει βελτιώσεις της αρχιτεκτονικής Αρχιτεκτονική Comp. Capability G80 1.0 1.1 G92 1.2 Fermi 2.0 Kepler 3.0 11 01 / 2014 Προγραμματισμός GPUs

Προγραμματιστικό Μοντέλο Single Instruction Multiple Thread (SIMT) Όλα τα νήματα (ενός warp) εκτελούν την ίδια εντολή σε διαφορετικά δεδομένα εισόδου (πρβλ. data parallel, vector machines) 12 01 / 2014 Προγραμματισμός GPUs

Προγραμματιστικό Μοντέλο Single Instruction Multiple Thread (SIMT) Όλα τα νήματα (ενός warp) εκτελούν την ίδια εντολή σε διαφορετικά δεδομένα εισόδου (πρβλ. data parallel, vector machines) Κάθε νήμα (ενός warp) μπορεί να ακολουθήσει διαφορετική ροή ελέγχου (divergent warp) Κάθε νήμα προγραμματίζεται με σειριακό τρόπο 12 01 / 2014 Προγραμματισμός GPUs

Προγραμματιστικό Μοντέλο Αρχιτεκτονικά στοιχεία που εκτίθενται στο Π.Μ. Σχεδόν 1-1 αναλογία μεταξύ αρχιτεκτονικής και Π.Μ. 13 01 / 2014 Προγραμματισμός GPUs

Προγραμματιστικό Μοντέλο Αρχιτεκτονικά στοιχεία που εκτίθενται στο Π.Μ. Σχεδόν 1-1 αναλογία μεταξύ αρχιτεκτονικής και Π.Μ. Αρχιτεκτονικό στοιχείο Εκτίθεται TPC ΟΧΙ SM ΟΧΙ SP ΟΧΙ Warp ΝΑΙ Έμμεσα Block ΝΑΙ Grid ΝΑΙ Καθολική μνήμη ΝΑΙ Μνήμη σταθερών ΝΑΙ Μνήμη textures ΝΑΙ Μοιραζόμενη μνήμη ΝΑΙ Τοπική μνήμη ΝΑΙ Μέσω assembly Caches ΟΧΙ (Εξαίρεση L1/shared στις Fermi) 13 01 / 2014 Προγραμματισμός GPUs

Προγραμματιστικό Μοντέλο Οργάνωση νημάτων I..grid.block..block.warp..warp Τα blocks μπορεί να είναι 1Δ, 2Δ ή 3Δ Το grid μπορεί να είναι 1Δ ή 2Δ 14 01 / 2014 Προγραμματισμός GPUs

Προγραμματιστικό Μοντέλο Οργάνωση νημάτων 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 15 01 / 2014 Προγραμματισμός GPUs

Προγραμματιστικό Μοντέλο Οργάνωση νημάτων III Κάθε SM αναλαμβάνει την εκτέλεση ενός ή περισσοτέρων blocks 16 01 / 2014 Προγραμματισμός GPUs

Προγραμματιστικό Μοντέλο Πρόσβαση στην ιεραρχία μνήμης Η ιεραρχία μνήμης εκτίθεται στο Π.Μ. και μπορεί να την χειριστεί ο προγραμματιστής Διαμοιρασμός της ιεραρχίας Καθολική μνήμη Μνήμη σταθερών Μνήμη textures Μοιραζόμενη μνήμη Register le Όλα τα blocks Όλα τα blocks Όλα τα blocks Όλα τα νήματα ενός block Όλα τα νήματα ενός block 17 01 / 2014 Προγραμματισμός GPUs

Προγραμματιστικό Μοντέλο Συγχρονισμός Εντός ενός block (ή SM): Memory fences Barriers Atomic operations (compute capability >= 1.1) Καθολικά: Μεταξύ διαδοχικών κλήσεων πυρήνων Atomic operations (compute capability >= 1.1) Barriers (compute capability >= 2.0) 18 01 / 2014 Προγραμματισμός GPUs

CUDA C Επέκταση της C με επιπλέον τύπους και προσδιοριστές Χρησιμοποιεί το front-end της C++ Πολυμορφισμός Παράμετροι προεπιλογής (default parameters) Υπερφόρτωση τελεστών Χώροι ονομάτων (namespaces) Πρότυπα συναρτήσεων (function templates) Αρχεία πηγαίου κώδικα με κατάληξη.cu Μεταγλωττιστής: nvcc Κώδικας που πρόκειται να τρέξει στην CPU (host code) Κώδικας που πρόκειται να τρέξει στην GPU (device code) Χρησιμοποιεί τον μεταγλωττιστή του συστήματος για την παραγωγή κώδικα για την CPU 19 01 / 2014 Προγραμματισμός GPUs

CUDA C Διαδικασία μεταγλώττισης και εκτέλεσης $ nvcc o my_gpu_prog my_prog. cu + Just-In-Time μεταγλώττιση του πυρήνα GPU. nvcc front-end.. host compiler. nvcc core. PTX assembly. fat binary for VM. 20 01 / 2014 Προγραμματισμός GPUs

CUDA C Διαχωρισμός κώδικα host/device Με χρήση προσδιοριστών (quali ers) συναρτήσεων 21 01 / 2014 Προγραμματισμός GPUs

CUDA C Διαχωρισμός κώδικα host/device Με χρήση προσδιοριστών (quali ers) συναρτήσεων device Εκτελείται στην συσκευή Μπορεί να κληθεί μόνο από κώδικα της συσκευής 21 01 / 2014 Προγραμματισμός GPUs

CUDA C Διαχωρισμός κώδικα host/device Με χρήση προσδιοριστών (quali ers) συναρτήσεων device Εκτελείται στην συσκευή Μπορεί να κληθεί μόνο από κώδικα της συσκευής host Εκτελείται στο host Μπορεί να κληθεί μόνο από κώδικα του host 21 01 / 2014 Προγραμματισμός GPUs

CUDA C Διαχωρισμός κώδικα host/device Με χρήση προσδιοριστών (quali ers) συναρτήσεων device Εκτελείται στην συσκευή Μπορεί να κληθεί μόνο από κώδικα της συσκευής host Εκτελείται στο host Μπορεί να κληθεί μόνο από κώδικα του host global Εκτελείται στην συσκευή Μπορεί να κληθεί μόνο από κώδικα του host Σημείο εισόδου στην συσκευή Συνήθως αναφέρεται ως GPU kernel 21 01 / 2014 Προγραμματισμός GPUs

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 ) ; } 22 01 / 2014 Προγραμματισμός GPUs

CUDA C Διαχωρισμός κώδικα host/device Περιορισμοί για τις συναρτήσεις συσκευής Δεν υποστηρίζεται αναδρομή Δεν υποστηρίζονται static μεταβλητές Δεν μπορούν να δεχτούν μεταβλητό αριθμό ορισμάτων Οι συναρτήσεις global δεν πρέπει να επιστρέφουν τιμή Κάθε κλήση συνάρτησης global θα πρέπει να προσδιορίζει τις παραμέτρους εκτέλεσης (blocks, grid, κ.λπ.) Τα ορίσματα στις συναρτήσεις global πρέπει να είναι μέχρι 256 byte 23 01 / 2014 Προγραμματισμός GPUs

CUDA C Προσδιοριστές μεταβλητών device Βρίσκεται στην καθολική μνήμη Προσβάσιμη από όλα τα blocks constant Βρίσκεται στην μνήμη σταθερών Προσβάσιμη από όλα τα blocks shared Βρίσκεται στην μοιραζόμενη μνήμη του SM Προσβάσιμη από όλα τα νήματα ενός block 24 01 / 2014 Προγραμματισμός GPUs

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 ] ; 24 01 / 2014 Προγραμματισμός GPUs

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 25 01 / 2014 Προγραμματισμός GPUs

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 > > > (... ) ;... } 26 01 / 2014 Προγραμματισμός GPUs

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) 26 01 / 2014 Προγραμματισμός GPUs

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 27 01 / 2014 Προγραμματισμός GPUs

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 ] ; } 28 01 / 2014 Προγραμματισμός GPUs

CUDA C Πρόσβαση στην ιεραρχία μνήμης Μνήμη σταθερών Με χρήση του προσδιοριστή constant Μοιραζόμενη μνήμη Με χρήση του προσδιοριστή shared Μνήμη textures Με χρήση ειδικών δομών που ονομάζονται texture references Τοπική μνήμη Με χρήση του προσδιοριστή. local στην PTX assembly 29 01 / 2014 Προγραμματισμός GPUs

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 > > > (... ) ;... 30 01 / 2014 Προγραμματισμός GPUs

CUDA C Συγχρονισμός Memory fences Barriers Εγγυάται ότι όλες οι προσβάσεις στην μνήμη (global ή shared) μέχρι αυτό το σημείο έχουν πραγματοποιηθεί threadfence(), threadfence_block() Εγγυάται ότι όλα τα νήματα του block έχουν φτάσει σε κάποιο σημείο και όλες οι προσβάσεις που έχουν γίνει στην μνήμη (global ή shared) έχουν πραγματοποιηθεί syncthreads() Ατομικές συναρτήσεις Αναφορές στην μνήμη (global, shared) atomicadd(), atomicinc () κ.ο.κ. 31 01 / 2014 Προγραμματισμός GPUs

CUDA C Συγχρονισμός Memory fences Barriers Εγγυάται ότι όλες οι προσβάσεις στην μνήμη (global ή shared) μέχρι αυτό το σημείο έχουν πραγματοποιηθεί threadfence(), threadfence_block() Εγγυάται ότι όλα τα νήματα του block έχουν φτάσει σε κάποιο σημείο και όλες οι προσβάσεις που έχουν γίνει στην μνήμη (global ή shared) έχουν πραγματοποιηθεί syncthreads() Ατομικές συναρτήσεις Αναφορές στην μνήμη (global, shared) atomicadd(), atomicinc () κ.ο.κ.. Καθολικός συγχρονισμός..... Μόνο μεταξύ διαδοχικών κλήσεων του πυρήνα 31 01 / 2014 Προγραμματισμός GPUs

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 f l o a t 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 ; } 32 01 / 2014 Προγραμματισμός GPUs

CUDA C Runtime Environment Συναρτήσεις διαχείρισης μνήμης cudamalloc(), cudafree() cudamallochost(), cudafreehost() Συναρτήσεις επικοινωνίας με την συσκευή cudamemcpy() Συναρτήσεις διαχείρισης σφαλμάτων cudagetlasterror () Συναρτήσεις διαχείρισης νημάτων cudathreadsynchronize(), cudathreadexit() Συναρτήσεις διαχείρισης της συσκευής Συναρτήσεις διαχείρισης γεγονότων. Μεταγλώττιση..... cudaeventcreate(), cudaeventdestroy(), cudaeventelapsedtime() Συνδεση με την βιβλιοθήκη cudart, lcudart 33 01 / 2014 Προγραμματισμός GPUs

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 ; 34 01 / 2014 Προγραμματισμός GPUs

Προϋποθέσεις για υψηλή επίδοση Συνένωση αναφορών στην καθολική μνήμη (memory access coalescing) Warps χωρίς διακλαδώσεις Εκμετάλλευση της μοιραζόμενης μνήμης Μεγάλος αριθμός νημάτων Υψηλή χρησιμοποίηση των SMs 35 01 / 2014 Προγραμματισμός GPUs

Προϋποθέσεις για υψηλή επίδοση Συνένωση αναφορών στην καθολική μνήμη Κρύβει την καθυστέρηση πρόσβασης στην καθολική μνήμη Μικρή ή καθόλου cache Η καθολική μνήμη χωρίζεται σε τμήματα (segments) των 32, 64 ή 128 byte, ευθυγραμμισμένα (aligned) στα αντίστοιχα όρια Η πρόσβαση στην μνήμη γίνεται με διενέργειες (transactions) ανά τμήμα Με την συνένωση των αναφορών στην μνήμη επιδιώκουμε με ένα transaction να μεταφέρουμε όσο το δυνατόν περισσότερα χρήσιμα δεδομένα Αυστηρές προϋποθέσεις στην ακολουθία των αναφορών ανάμεσα στα νήματα και στο alignment των δεδομένων 36 01 / 2014 Προγραμματισμός GPUs

Προϋποθέσεις για υψηλή επίδοση Συνένωση αναφορών στην καθολική μνήμη Προϋποθέσεις (I) Τα 16 νήματα ενός half-warp θα πρέπει να προσπελαύνουν είτε λέξεις 4-byte (ένα 64-byte transaction) είτε λέξεις 8-byte (ένα 128-byte transaction) είτε λέξεις 16-byte (δύο 128-byte transactions) Και οι 16 λέξεις θα πρέπει να βρίσκονται στο ίδιο memory segment Το k-οστό νήμα θα πρέπει να προσπελαύνει την k-οστή λέξη 37 01 / 2014 Προγραμματισμός GPUs

Προϋποθέσεις για υψηλή επίδοση Συνένωση αναφορών στην καθολική μνήμη Προϋποθέσεις (II) Παράδειγμα πρόσβασης σε λέξεις 4 byte Συνεχόμενες και ευθυγραμμισμένες Aligned and sequential Addresses: 96 128 160 192 224 256 288 Threads: 0 31 Compute capability: Memory transactions: 1.0 and 1.1 1 x 64B at 128 1 x 64B at 192 Uncached 1.2 and 1.3 1 x 64B at 128 1 x 64B at 192 2.0 Cached 1 x 128B at 128 Πηγή: NVIDIA CUDA Programming Guide 38 01 / 2014 Προγραμματισμός GPUs

Προϋποθέσεις για υψηλή επίδοση Συνένωση αναφορών στην καθολική μνήμη Προϋποθέσεις (III) Παράδειγμα πρόσβασης σε λέξεις 4 byte Μη συνεχόμενες και ευθυγραμμισμένες Aligned and non-sequential Addresses: 96 128 160 192 224 256 288 Threads: 0 31 Compute capability: Memory transactions: 1.0 and 1.1 8 x 32B at 128 8 x 32B at 160 8 x 32B at 192 8 x 32B at 224 Uncached 1.2 and 1.3 1 x 64B at 128 1 x 64B at 192 2.0 Cached 1 x 128B at 128 Πηγή: NVIDIA CUDA Programming Guide 39 01 / 2014 Προγραμματισμός GPUs

Προϋποθέσεις για υψηλή επίδοση Συνένωση αναφορών στην καθολική μνήμη Προϋποθέσεις (IV) Παράδειγμα πρόσβασης σε λέξεις 4 byte Συνεχόμενες και μη ευθυγραμμισμένες Misaligned and sequential Addresses: 96 128 160 192 224 256 288 Threads: 0 31 Compute capability: Memory transactions: 1.0 and 1.1 Uncached 1.2 and 1.3 2.0 Cached 7 x 32B at 128 8 x 32B at 160 8 x 32B at 192 8 x 32B at 224 1 x 32B at 256 1 x 128B at 128 1 x 64B at 192 1 x 32B at 256 1 x 128B at 128 1 x 128B at 256 Πηγή: NVIDIA CUDA Programming Guide 40 01 / 2014 Προγραμματισμός GPUs

Προϋποθέσεις για υψηλή επίδοση Warps χωρίς διακλαδώσεις Το SIMT μοντέλο επιτρέπει σε κάθε νήμα να ακολουθήσει διαφορετικό κλάδο, αλλά Κάθε κλάδος εκτελείται από όλα τα νήματα του warp, απενεργοποιώντας τα αντίστοιχα νήματα όταν εκτελείται ο not taken κλάδος τους Το πλήθος των χρήσιμων υπολογισμών ανά νήμα μειώνεται σημαντικά 41 01 / 2014 Προγραμματισμός GPUs

Προϋποθέσεις για υψηλή επίδοση Εκμετάλλευση της μοιραζόμενης μνήμης Η πρόσβαση στην μοιραζόμενη μνήμη έχει μηδενικό κόστος Οργάνωση σε 16 ή 32 banks Διαδοχικές λέξεις ανατίθενται σε διαδοχικά banks Εκμετάλλευση της χρονικής τοπικότητας των προγραμμάτων Δύο φάσεις: 1. (Προ)φόρτωση των δεδομένων προς υπολογισμό 2. Υπολογισμοί με χρήση της μοιραζόμενης μνήμης 42 01 / 2014 Προγραμματισμός GPUs

Προϋποθέσεις για υψηλή επίδοση Εκμετάλλευση της μοιραζόμενης μνήμης Η πρόσβαση στην μοιραζόμενη μνήμη έχει μηδενικό κόστος Οργάνωση σε 16 ή 32 banks Διαδοχικές λέξεις ανατίθενται σε διαδοχικά banks Εκμετάλλευση της χρονικής τοπικότητας των προγραμμάτων Δύο φάσεις: 1. (Προ)φόρτωση των δεδομένων προς υπολογισμό 2. Υπολογισμοί με χρήση της μοιραζόμενης μνήμης. Περιορισμοί.. Περιορισμένο μέγεθος (16 48 KiB) που μοιράζονται όλα τα νήματα ενός block.. Μπορεί να οδηγήσει σε χαμηλή χρησιμοποιήση των SMs Προσοχή στα bank con icts 42 01 / 2014 Προγραμματισμός GPUs

Προϋποθέσεις για υψηλή επίδοση Υψηλή χρησιμοποιήση των SMs Κάθε SM υποστηρίζει ένα μέγιστο αριθμό ενεργών block (ή warps) Ένα warp είναι ενεργό όταν μπορεί να δρομολογηθεί Περισσότερα ενεργά νήματα μπορούν να κρύψουν τις καθυστερήσεις από την πρόσβαση στην καθολική μνήμη Η χρησιμοποιήση των SMs εξαρτάται από τις απαιτήσεις κάθε νήματος σε καταχωρητές και μοιραζόμενη μνήμη, το πλήθος των νημάτων ανά block 43 01 / 2014 Προγραμματισμός GPUs

Προϋποθέσεις για υψηλή επίδοση Υψηλή χρησιμοποιήση των 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/block 1024 Πόσα ενεργά warps υπάρχουν ανά SM? 44 01 / 2014 Προγραμματισμός GPUs

Προϋποθέσεις για υψηλή επίδοση Υψηλή χρησιμοποιήση των 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/block 1024 Πόσα ενεργά warps υπάρχουν ανά SM? CUDA Occupancy calculator 44 01 / 2014 Προγραμματισμός GPUs

OpenCL Ανοιχτό πρότυπο για παράλληλο προγραμματισμό σε ετερογενείς αρχιτεκτονικές (π.χ., CPU+GPU) Διάφορες υλοποιήσεις (NVIDIA, AMD κ.ά) Ίδιες αρχές με το μοντέλο CUDA, αλλά αρκετά πιο γενικευμένο με ελαφρώς διαφορετική ορολογία + Τρέχει παντού + Πολλές δυνατότητες, ανοιχτές υλοποιήσεις API που απαιτεί περίοδο εξοικείωσης Θέματα επίδοσης (αρχικές υλοποιήσεις) 45 01 / 2014 Προγραμματισμός GPUs

Ανακεφαλαίωση SIMT μοντέλο προγραμματισμού Επιδιώκουμε τοπικότητα των αναφορών μεταξύ συνεχόμενων νημάτων Τα νήματα οργανώνονται σε 32-άδες και δρομολογούνται στα SPs του SM σε κάθε κύκλο ρολογιού Κάθε μπλοκ τρέχει αποκλειστικά σε ένα SM Συγχρονισμός μόνο μεταξύ των νημάτων ενός block Προσπαθούμε να «κρύψουμε» το κόστος πρόσβασης στην καθολική μνήμη 46 01 / 2014 Προγραμματισμός GPUs

Σύνδεσμοι www.gpgpu.org www.gpucomputing.net NVIDIA Developer Zone, https://developer.nvidia.com OpenCL http://www.khronos.org/opencl 47 01 / 2014 Προγραμματισμός GPUs

48 01 / 2014 Προγραμματισμός GPUs Συζήτηση Ερωτήσεις