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

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

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

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

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

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

CUDA Compute Unified Device Architecture

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

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

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

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

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

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

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

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

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

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

ΤΕΧΝΙΚΕΣ ΑΥΞΗΣΗΣ ΤΗΣ ΑΠΟΔΟΣΗΣ ΤΩΝ ΥΠΟΛΟΓΙΣΤΩΝ I

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

All Pairs Shortest Path

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

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

9. Συστολικές Συστοιχίες Επεξεργαστών

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

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

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

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

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

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

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

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

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

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

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

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

Πανεπιστήμιο Θεσσαλίας Τμήμα Μηχανικών Ηλεκτρονικών Υπολογιστών Τηλεπικοινωνιών & Δικτύων

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

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

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

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

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

GPGPU. Grover. On Large Scale Simulation of Grover s Algorithm by Using GPGPU

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

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

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

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

Αρχιτεκτονική Επεξεργαστών Ψ.Ε.Σ

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

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

ΠΕΡΙΕΧΟΜΕΝΑ Υλικό και Λογισμικό Αρχιτεκτονική Υπολογιστών Δομή, Οργάνωση και Λειτουργία Υπολογιστών 6

EM 361: Παράλληλοι Υπολογισμοί

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

Υ- 01 Αρχιτεκτονική Υπολογιστών Front- end: Προσκόμιση, αποκωδικοποίηση, μετονομασία καταχωρητών

ΠΤΥΧΙΑΚΗ ΕΡΓΑΣΙΑ. Σχεδίαση παράλληλων αλγορίθμων ταξινόμησης και ψηφιακών φίλτρων (DSP) με εφαρμογή σε FPGA και CUDA. Αλέξανδρος Κ.

ΠΡΟΗΓΜΕΝΟΙ ΜΙΚΡΟΕΠΕΞΕΡΓΑΣΤΕΣ PROJECT 2: MEMORY MANAGEMENT

Μοντέλα. χαρακτηριστικά χωρίς να συνοδεύεται από λεπτοµέρειες.

Εισαγωγή στην Πληροφορική


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

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

Εφαρµογές Πληροφορικής Υπολογιστών. Κεφάλαιο 3 Το υλικό του υπολογιστή

ΕΣ 08 Επεξεργαστές Ψηφιακών Σηµάτων. Βιβλιογραφία Ενότητας

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

Στοιχεία από την αρχιτεκτονική των μικροϋπολογιστών

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

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

Multi Cycle Datapath. Αρχιτεκτονική Υπολογιστών. 5ο εξάμηνο ΣΗΜΜΥ ακ. έτος: Νεκ. Κοζύρης

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

Διονύσιος Σαλονικίδης. Μεταπτυχιακός Φοιτητής. Διπλωματική Εργασία. Επιβλέπων: Κωνσταντίνος Μαργαρίτης, Καθηγητής. Τμήμα Εφαρμοσμένης Πληροφορικής

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

Προγραμματισμός Ταυτόχρονος Προγραμματισμός

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

Α. Δίνονται οι. (i) στη. πρέπει να. πιο. (ii) $a0. $s0 θα πρέπει να. αποθήκευση. αυξάνει τον. f: sub sll add sub jr. h: addi sw sw.

ΗΜΥ Εργαστήριο Οργάνωσης Υπολογιστών και Μικροεπεξεργαστών

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

Ατομική Διπλωματική Εργασία ΣΥΓKΡΙΣΗ ΕΠΙΔΟΣΗΣ ΚΑΙ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ ΜΕ ΤΗΝ ΧΡΗΣΗ ΤΗΣ OPENACC ΚΑΙ ΤΗΣ CUDA. Ανδρέας Κωνσταντίνου ΠΑΝΕΠΙΣΤΗΜΙΟ ΚΥΠΡΟΥ

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

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

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

Π Τ Υ Χ Ι Α Κ Η Ε Ρ ΓΑ Σ Ι Α

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

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

CUDA FFT. High Performance 3-D FFT in CUDA Environment. Akira Nukada, 1, 2 Yasuhiko Ogata, 1, 2 Toshio Endo 1, 2 and Satoshi Matsuoka 1, 2, 3

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

Κεφάλαιο 3 Αρχιτεκτονική Ηλεκτρονικού Τμήματος (hardware) των Υπολογιστικών Συστημάτων ΕΡΩΤΗΣΕΙΣ ΑΣΚΗΣΕΙΣ

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

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

Transcript:

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

Περιεχόμενα 2 01 / 2014 Προγραμματισμός GPUs

3 01 / 2014 Προγραμματισμός GPUs Εισαγωγή

Τι είναι οι Επεξεργαστές Γραφικών; Επιταχυντές (hardware accelerators) για την επεξεργασία γραφικών Η ιδέα του acceleration υπάρχει από τα 70 s Για μαθηματικές πράξεις Για την επεξεργασία γραφικών Για ειδικές υπολογιστικά απαιτητικές λειτουργίες (signal processing, encryption κ.λπ.) Οι επιταχυντές σήμερα Η τεχνολογία επανέρχεται Υποστήριξη data- και compute-intensive εφαρμογών Ειδικές λειτουργίες (fixed-function FPGAs, fixed-function ASICs) 4 01 / 2014 Προγραμματισμός GPUs

Γιατί GPUs; Πολύ μεγάλη υπολογιστική ισχύς Καλή ενεργειακή απόδοση CPU > 1000pJ/instruction vs GPU < 200pJ/instruction Μέσα στο top-10 του Green500 τα τελευταία χρόνια Χαμηλότερο $/performance Μαζικά παράλληλοι επεξεργαστές (massively parallel/threaded) 5 01 / 2014 Προγραμματισμός GPUs

CPU vs. GPU CPU: λίγα και σύνθετα cores κάθε core έχει το δικό του control logic κάθε νήμα είναι μία heavyweight οντότητα context-switching -> SW managed coherent caches μεγάλης χωρητικότητας out-of-order execution branch prediction GPU: πολλά και απλά cores ομάδες από cores μοιράζονται το ίδιο control logic κάθε νήμα είναι μία lightweight οντότητα context-switching -> HW managed caches μικρής χωρητικοτητας in-order execution branch divergence 6 01 / 2014 Προγραμματισμός GPUs

GPGPU General-Purpose computation on Graphics Processing Units χρήση των GPUs για επιτάχυνση υψηλά παραλληλοποιήσιμων υπολογιστικών προβλημάτων γενικού σκοπού 7 01 / 2014 Προγραμματισμός GPUs

GPGPU General-Purpose computation on Graphics Processing Units χρήση των GPUs για επιτάχυνση υψηλά παραλληλοποιήσιμων υπολογιστικών προβλημάτων γενικού σκοπού Ποιες εφαρμογές είναι ιδανικές για GPGPU; υψηλός παραλληλισμός compute intensive ελάχιστες εξαρτήσεις ανάμεσα στα δεδομένα μεγάλα data sets 7 01 / 2014 Προγραμματισμός GPUs

GPGPU General-Purpose computation on Graphics Processing Units χρήση των GPUs για επιτάχυνση υψηλά παραλληλοποιήσιμων υπολογιστικών προβλημάτων γενικού σκοπού Ποιες εφαρμογές είναι ιδανικές για GPGPU; υψηλός παραλληλισμός compute intensive ελάχιστες εξαρτήσεις ανάμεσα στα δεδομένα μεγάλα data sets Πώς γίνεται ο GPGPU προγραμματισμός; Vendor specific interfaces: Nvidia CUDA AMD Stream Generic interfaces: OpenCL OpenACC 7 01 / 2014 Προγραμματισμός GPUs

GPGPU Processing flow Βασικά βήματα: 1. Αντιγράφουμε τα δεδομένα που θέλουμε να επεξεργαστούμε από την μνήμη της CPU στην μνήμη της GPU 2. Η CPU αναθέτει τον υπολογισμό στην GPU 3. Ο υπολογισμός εκτελείται στην GPU 4. Αντιγράφουμε τα αποτελέσματα του υπολογισμού από την μνήμη της GPU στην μνήμη της CPU 8 01 / 2014 Προγραμματισμός GPUs

Compute Unified Device Architecture (CUDA) 9 01 / 2014 Προγραμματισμός GPUs

Compute Unified Device Architecture (CUDA) Παράλληλη αρχιτεκτονική που αναπτύχθηκε από την NVIDIA Ειδικά σχεδιασμένη για GPGPU 10 01 / 2014 Προγραμματισμός GPUs

Compute Unified Device Architecture (CUDA) Γενική αρχιτεκτονική Κάθε συσκευή GPU αποτελείται από συστοιχίες πολυεπεξεργαστών ροών (Streaming Multiprocessors SMs) Κάθε πολυεπεξεργαστής ροών αποτελείται από: Eπεξεργαστές ροών (Streaming Processors SPs ή αλλιώς CUDA cores) Πολύ μεγάλο αρχείο καταχωρητών (8K 32K) Multithreaded Instruction Unit Shared memory Constant cache (read-only) Texture cache... 11 01 / 2014 Προγραμματισμός GPUs

Compute Unified Device Architecture (CUDA) Βασική δομική μονάδα: Streaming Multiprocessor (SM) Υποστηρίζονται εκατοντάδες ενεργά νήματα ανά SM Κάθε SM αναλαμβάνει να εκτελέσει ένα ή περισσότερα μπλοκ από νήματα (thread blocks) Όλα τα νήματα ενός thread block μοιράζονται τους πόρους του SM Τα νήματα οργανώνονται περαιτέρω σε ομάδες των 32 νημάτων (warps) και δρομολογούνται από τον(τους) warp scheduler(s) στα cores που το αποτελούν Σε κάθε κύκλο ρολογιού όλα τα cores εκτελούν την ίδια εντολή για κάθε νήμα του warp που δρομολογήθηκε Η χρονοδρομολόγηση των warps ενός μπλοκ έχει μηδαμινό κόστος 12 01 / 2014 Προγραμματισμός GPUs

Compute Unified Device Architecture (CUDA) Παράδειγμα: αρχιτεκτονική Fermi 13 01 / 2014 Προγραμματισμός GPUs

Compute Unified Device Architecture (CUDA) Δυνατότητες συσκευών Οι δυνατότητες κάθε συσκευής καθορίζονται από το compute capability <major>.<minor> Ο αριθμός major δηλώνει έκδοση της κύριας αρχιτεκτονικής Ο αριθμός minor δηλώνει βελτιώσεις της αρχιτεκτονικής Microarchitecture Comp. Capability Tesla 1.x Fermi 2.x Kepler 3.x Maxwell 5.x 14 01 / 2014 Προγραμματισμός GPUs

15 01 / 2014 Προγραμματισμός GPUs Προγραμματιστικό Μοντέλο

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

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

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

Προγραμματιστικό Μοντέλο Οργάνωση νημάτων I Κάθε υπολογιστικός πυρήνας (kernel) που ανατίθεται προς εκτέλεση στην GPU οργανώνεται από τον προγραμματιστή σε ένα πλέγμα (grid) από νήματα grid. thread block thread block warp warp Το grid μπορεί να είναι 1Δ, 2Δ ή 3Δ Τα thread blocks μπορεί να είναι 1Δ, 2Δ ή 3Δ Υπάρχουν περιορισμοί στις διαστάσεις του grid και του thread block (ανάλογα με το compute capability) 17 01 / 2014 Προγραμματισμός GPUs

Προγραμματιστικό Μοντέλο Οργάνωση νημάτων II Σε κάθε νήμα εκτέλεσης ανατίθεται ένα μοναδικό ID εντός του thread block στο οποίο ανήκει 18 01 / 2014 Προγραμματισμός GPUs

Προγραμματιστικό Μοντέλο Οργάνωση νημάτων II Σε κάθε νήμα εκτέλεσης ανατίθεται ένα μοναδικό ID εντός του thread block στο οποίο ανήκει Το ID κάθε νήματος προσδιορίζεται από τις «συντεταγμένες» του εντός του thread block στο οποίο ανήκει Για μπλοκ (Dx, Dy), το ID του νήματος (x, y) είναι x + yd x Για μπλοκ (Dx, Dy, Dz), το ID του νήματος (x, y, z) είναι x + yd x + zd xd y 18 01 / 2014 Προγραμματισμός GPUs

Προγραμματιστικό Μοντέλο Οργάνωση νημάτων II Σε κάθε νήμα εκτέλεσης ανατίθεται ένα μοναδικό ID εντός του thread block στο οποίο ανήκει Το ID κάθε νήματος προσδιορίζεται από τις «συντεταγμένες» του εντός του thread block στο οποίο ανήκει Για μπλοκ (Dx, Dy), το ID του νήματος (x, y) είναι x + yd x Για μπλοκ (Dx, Dy, Dz), το ID του νήματος (x, y, z) είναι x + yd x + zd xd y Η οργάνωση των νημάτων ενός thread block σε warps γίνεται σειριακά με βάση τα IDs των νημάτων το warp 0 περιέχει τα νήματα με IDs 0-31, το warp 1 τα νήματα με IDs 32-63, κ.ο.κ. αν ο αριθμός νημάτων του thread block δεν είναι πολλαπλάσιο του warp size (32) τότε το τελευταίο warp θα συμπληρωθεί με νήματα τα οποία θα είναι «μαρκαρισμένα» ως ανενεργά 18 01 / 2014 Προγραμματισμός GPUs

Προγραμματιστικό Μοντέλο Οργάνωση νημάτων II Σε κάθε νήμα εκτέλεσης ανατίθεται ένα μοναδικό ID εντός του thread block στο οποίο ανήκει Το ID κάθε νήματος προσδιορίζεται από τις «συντεταγμένες» του εντός του thread block στο οποίο ανήκει Για μπλοκ (Dx, Dy), το ID του νήματος (x, y) είναι x + yd x Για μπλοκ (Dx, Dy, Dz), το ID του νήματος (x, y, z) είναι x + yd x + zd xd y Η οργάνωση των νημάτων ενός thread block σε warps γίνεται σειριακά με βάση τα IDs των νημάτων το warp 0 περιέχει τα νήματα με IDs 0-31, το warp 1 τα νήματα με IDs 32-63, κ.ο.κ. αν ο αριθμός νημάτων του thread block δεν είναι πολλαπλάσιο του warp size (32) τότε το τελευταίο warp θα συμπληρωθεί με νήματα τα οποία θα είναι «μαρκαρισμένα» ως ανενεργά Τα IDs χρησιμοποιούνται συνήθως για την ανάθεση δεδομένων σε νήματα 18 01 / 2014 Προγραμματισμός GPUs

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

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

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

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

22 01 / 2014 Προγραμματισμός GPUs CUDA C

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

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

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

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

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

CUDA C Διαχωρισμός κώδικα host/device Παράδειγμα device i n t g e t _ t h r e a d _ i d ( ) { return (... ) ; } 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, * my_result ;... my_gpu_kernel <<<G, B>>>(my_input, m y_result ) ; } 25 01 / 2014 Προγραμματισμός GPUs

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

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

CUDA C Προσδιοριστές μεταβλητών device Βρίσκεται στην καθολική μνήμη Προσβάσιμη από όλα τα blocks constant Βρίσκεται στην μνήμη σταθερών Προσβάσιμη από όλα τα blocks shared Βρίσκεται στην μοιραζόμενη μνήμη του SM Προσβάσιμη από όλα τα νήματα ενός thread block Π.χ., πίνακας 256 floats στην μοιραζόμενη μνήμη: shared f l o a t a r r a y [ 2 5 6 ] ; 27 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 > > > (... ) ;... } 28 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) 28 01 / 2014 Προγραμματισμός GPUs

CUDA C Περιβάλλον εκτέλεσης και οργάνωση νημάτων Προσδιορισμός νήματος Το ID κάθε νήματος προσδιορίζεται από τις «συντεταγμένες» του εντός του block στο οποίο ανήκει Η CUDA C ορίζει τις εξής μεταβλητές: uint3 threadidx: οι συντεταγμένες του νήματος εντός του τρέχοντος block uint3 blockidx: οι συντεταγμένες του block εντός του grid dim3 blockdim: οι διαστάσεις του block dim3 griddim: οι διαστάσεις του grid Π.χ., το ID του τρέχοντος νήματος ενός μονοδιάστατου block σε ένα μονοδιάστατο grid είναι local_tid = threadidx. x, εντός του block global_tid = threadidx.x + blockdim.x*blockidx.x, εντός του grid 29 01 / 2014 Προγραμματισμός GPUs

CUDA C Πρόσβαση στην ιεραρχία μνήμης Μνήμη σταθερών Με χρήση του προσδιοριστή constant Μοιραζόμενη μνήμη Με χρήση του προσδιοριστή shared Μνήμη textures Με χρήση ειδικών δομών που ονομάζονται texture references Τοπική μνήμη Με χρήση του προσδιοριστή. local στην PTX assembly 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 Runtime Environment Συναρτήσεις διαχείρισης μνήμης cudamalloc(), cudafree() cudamallochost(), cudafreehost() Συναρτήσεις επικοινωνίας με την συσκευή cudamemcpy() Συναρτήσεις διαχείρισης σφαλμάτων cudagetlasterror () Συναρτήσεις διαχείρισης νημάτων cudathreadsynchronize(), cudathreadexit() Συναρτήσεις διαχείρισης της συσκευής Συναρτήσεις διαχείρισης γεγονότων cudaeventcreate(), cudaeventdestroy(), cudaeventelapsedtime(). Μεταγλώττιση..Συνδεση με την βιβλιοθήκη cudart, lcudart 32 01 / 2014 Προγραμματισμός GPUs

CUDA C Παράδειγμα Άθροισμα διανυσμάτων Host code (1/2) i n t main ( ) { f l o a t a [ N ], b [ N ], c [ N ] ; f l o a t * dev_a, * dev_b, * dev_c ; / / A l l o c a t e memory on the GPU cudamalloc ( ( void * * ) & dev_a, N* s i z e o f ( i n t ) ) ; cudamalloc ( ( void * * ) & dev_b, N* s i z e o f ( i n t ) ) ; cudamalloc ( ( void * * ) & dev_c, N* s i z e o f ( i n t ) ) ; / / I n i t i a l i z e data on the CPU... / / Copy the a r r a y s a and b to the GPU cudamemcpy ( dev_a, a, N* s i z e o f ( i n t ), cudamemcpyhosttodevice ) ; cudamemcpy ( dev_b, b, N* s i z e o f ( i n t ), cudamemcpyhosttodevice ) ;... 33 01 / 2014 Προγραμματισμός GPUs

CUDA C Παράδειγμα Άθροισμα διανυσμάτων Host code (2/2)... / / Launch the k e r n e l with N/128 thread b l o c k s / / of 128 t h r e a d s dim3 block ( 1 2 8 ) ; dim3 g r i d ( ( N+ 1 2 7 ) / 1 2 8 ) ; vec_add <<<grid, block >>>(dev_a, dev_b, dev_c, N ) ; / / Copy the a r r a y c back from the GPU to the CPU cudamemcpy ( c, dev_c, N* s i z e o f ( i n t ), cudamemcpydevicetohost ) ; / / Free the memory a l l o c a t e d on the GPU cudafree ( dev_a ) ; cudafree ( dev_b ) ; cudafree ( dev_c ) ; } return 0 ; 34 01 / 2014 Προγραμματισμός GPUs

CUDA C Παράδειγμα Άθροισμα διανυσμάτων Device code Ορίσαμε 1Δ grid και 1Δ block (γιατί;) Κάθε νήμα αναλαμβάνει τον υπολογισμό ενός στοιχείου global void vec_add ( const f l o a t * a, const f l o a t *b, f l o a t * c, i n 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 ] ; 35 01 / 2014 Προγραμματισμός GPUs

CUDA C Παράδειγμα Άθροισμα διανυσμάτων Device code Ορίσαμε 1Δ grid και 1Δ block (γιατί;) Κάθε νήμα αναλαμβάνει τον υπολογισμό ενός στοιχείου global void vec_add ( const f l o a t * a, const f l o a t *b, f l o a t * c, i n 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 ] ;. Τι θα συμβεί αν το Ν είναι αρκετά μεγάλο ώστε τα Ν/128 blocks να υπερβαίνουν το. επιτρεπτό όριο της διάστασης του grid; 35 01 / 2014 Προγραμματισμός GPUs

CUDA C Παράδειγμα Άθροισμα διανυσμάτων Device code Ορίζουμε grid με fixed διαστάσεις μέσα στα επιτρεπτά όρια (ανεξάρτητες του N) Αναθέτουμε σε κάθε νήμα τον υπολογισμό περισσότερων στοιχείων global void vec_add ( const f l o a t * a, const f l o a t *b, f l o a t * c, i n t N ) { / / Grid s t r i d e loop f o r ( t i d = blockdim. x * b l o c k I d x. x + t h r e a d I d x. x ; t i d < N ; t i d += blockdim. x * griddim. x ) { c [ t i d ] = a [ t i d ] + b [ t i d ] ; } } 36 01 / 2014 Προγραμματισμός GPUs

CUDA C Παράδειγμα Άθροισμα διανυσμάτων Device code Ορίζουμε grid με fixed διαστάσεις μέσα στα επιτρεπτά όρια (ανεξάρτητες του N) Αναθέτουμε σε κάθε νήμα τον υπολογισμό περισσότερων στοιχείων global void vec_add ( const f l o a t * a, const f l o a t *b, f l o a t * c, i n t N ) { / / Grid s t r i d e loop f o r ( t i d = blockdim. x * b l o c k I d x. x + t h r e a d I d x. x ; t i d < N ; t i d += blockdim. x * griddim. x ) { c [ t i d ] = a [ t i d ] + b [ t i d ] ; } }. Τώρα μπορούμε να προσθέσουμε διανύσματα οποιουδήποτε μήκους, περιοριζόμενοι μόνο. από το μέγεθος της RAM στην GPU 36 01 / 2014 Προγραμματισμός GPUs

37 01 / 2014 Προγραμματισμός GPUs Ζητήματα επίδοσης

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

Προϋποθέσεις για υψηλή επίδοση Συνένωση αναφορών στην καθολική μνήμη Κρύβει την καθυστέρηση πρόσβασης στην καθολική μνήμη Η καθολική μνήμη χωρίζεται σε τμήματα (segments) των 32, 64 ή 128 byte, ευθυγραμμισμένα (aligned) στα αντίστοιχα όρια Η πρόσβαση στην μνήμη γίνεται με διενέργειες (transactions) ανά τμήμα Με την συνένωση των αναφορών στην μνήμη επιδιώκουμε με ένα transaction να μεταφέρουμε όσο το δυνατόν περισσότερα χρήσιμα δεδομένα Αυστηρές προϋποθέσεις στην ακολουθία των αναφορών ανάμεσα στα νήματα και στο alignment των δεδομένων 39 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-οστή λέξη 40 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 41 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 42 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 43 01 / 2014 Προγραμματισμός GPUs

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

Προϋποθέσεις για υψηλή επίδοση Warps χωρίς διακλαδώσεις Το SIMT μοντέλο επιτρέπει σε κάθε νήμα να ακολουθήσει διαφορετικό κλάδο, αλλά Κάθε κλάδος εκτελείται από όλα τα νήματα του warp, απενεργοποιώντας τα αντίστοιχα νήματα όταν εκτελείται ο not taken κλάδος τους Το πλήθος των χρήσιμων υπολογισμών ανά νήμα μειώνεται σημαντικά i f ( t h r e a d I d x. x > 2 ) { / / do s t u f f } 44 01 / 2014 Προγραμματισμός GPUs

Προϋποθέσεις για υψηλή επίδοση Warps χωρίς διακλαδώσεις Το SIMT μοντέλο επιτρέπει σε κάθε νήμα να ακολουθήσει διαφορετικό κλάδο, αλλά Κάθε κλάδος εκτελείται από όλα τα νήματα του warp, απενεργοποιώντας τα αντίστοιχα νήματα όταν εκτελείται ο not taken κλάδος τους Το πλήθος των χρήσιμων υπολογισμών ανά νήμα μειώνεται σημαντικά i f ( t h r e a d I d x. x > 2 ) { / / do s t u f f }. Divergence για το πρώτο warp. κάθε thread block! 44 01 / 2014 Προγραμματισμός GPUs

Προϋποθέσεις για υψηλή επίδοση Warps χωρίς διακλαδώσεις Το SIMT μοντέλο επιτρέπει σε κάθε νήμα να ακολουθήσει διαφορετικό κλάδο, αλλά Κάθε κλάδος εκτελείται από όλα τα νήματα του warp, απενεργοποιώντας τα αντίστοιχα νήματα όταν εκτελείται ο not taken κλάδος τους Το πλήθος των χρήσιμων υπολογισμών ανά νήμα μειώνεται σημαντικά i f ( t h r e a d I d x. x > 2 ) { / / do s t u f f }. Divergence για το πρώτο warp. κάθε thread block! i f ( t h r e a d I d x. x / WARP_SIZE > 2 ) { / / do s t u f f } 44 01 / 2014 Προγραμματισμός GPUs

Προϋποθέσεις για υψηλή επίδοση Warps χωρίς διακλαδώσεις Το SIMT μοντέλο επιτρέπει σε κάθε νήμα να ακολουθήσει διαφορετικό κλάδο, αλλά Κάθε κλάδος εκτελείται από όλα τα νήματα του warp, απενεργοποιώντας τα αντίστοιχα νήματα όταν εκτελείται ο not taken κλάδος τους Το πλήθος των χρήσιμων υπολογισμών ανά νήμα μειώνεται σημαντικά i f ( t h r e a d I d x. x > 2 ) { / / do s t u f f } i f ( t h r e a d I d x. x / WARP_SIZE > 2 ) { / / do s t u f f }. Divergence για το πρώτο warp. κάθε thread block!. Ṇo divergence! 44 01 / 2014 Προγραμματισμός GPUs

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

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

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

Προϋποθέσεις για υψηλή επίδοση Υψηλή χρησιμοποιήση των SMs Παράδειγμα Υποθέτουμε GPU με compute capability 1.0: Register file 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? 47 01 / 2014 Προγραμματισμός GPUs

Προϋποθέσεις για υψηλή επίδοση Υψηλή χρησιμοποιήση των SMs Παράδειγμα Υποθέτουμε GPU με compute capability 1.0: Register file 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 47 01 / 2014 Προγραμματισμός GPUs

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

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

50 01 / 2014 Προγραμματισμός GPUs Σύνδεσμοι

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

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