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

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

Λιβανός Γιώργος Εξάμηνο 2017Β

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

Α.Τ.Ε.Ι. Ηρακλείου Ψηφιακή Επεξεργασία Εικόνας ιδάσκων: Βασίλειος Γαργανουράκης. Ανθρώπινη Όραση - Χρωµατικά Μοντέλα

1 ο Εργαστήριο Συντεταγμένες, Χρώματα, Σχήματα

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

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

Μάθημα 3: Αρχιτεκτονική Υπολογιστών

2.0 ΒΑΣΙΚΕΣ ΓΝΩΣΕΙΣ-ΟΡΟΛΟΓΙΕΣ

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

Οδηγίες σχεδίασης στο περιβάλλον Blender

7.Α.1 Παρουσιάσεις. 7.Α.2 Περιγραφή περιεχομένων της εφαρμογής

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

Κεφάλαιο 4 ο. Ο Προσωπικός Υπολογιστής

ΠΡΟΓΡΑΜΜΑ ΕΠΕΞΕΡΓΑΣΙΑΣ ΕΙΚΟΝΑΣ

Κεφάλαιο 3. Διδακτικοί Στόχοι

Κεφάλαιο 4: Λογισμικό Συστήματος

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

Λειτουργικά Συστήματα Ι. Καθηγήτρια Παπαδάκη Αναστασία

Ιστορική Αναδρομή Λειτουργικών Συστημάτων (ΛΣ) Εισαγωγή : ο πυρήνας (kernel) / ο φλοιός (shell) Β ΕΠΑΛ

Υπάρχουν δύο τύποι μνήμης, η μνήμη τυχαίας προσπέλασης (Random Access Memory RAM) και η μνήμη ανάγνωσης-μόνο (Read-Only Memory ROM).

Λειτουργικά Συστήματα (διαχείριση επεξεργαστή, μνήμης και Ε/Ε)

Τι είναι ένα λειτουργικό σύστημα (ΛΣ); Μια άλλη απεικόνιση. Το Λειτουργικό Σύστημα ως μέρος του υπολογιστή

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

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

Μάθημα 5: Χαρακτηριστικά της Κ.Μ.Ε.

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

Η διαδικασία Παραγωγής Συνθετικής Εικόνας (Rendering)

Οδηγός Photoshop Μαρία Zάππα Κασαπίδη Interactive Education 22/7/2016

ΛΟΓΙΣΜΙΚΟ (software)

Το υλικό του υπολογιστή

Microsoft Excel Κεφάλαιο 1. Εισαγωγή. Βιβλίο εργασίας

ΚΕΦΑΛΑΙΟ 10 ΥΠΟΠΡΟΓΡΑΜΜΑΤΑ

Απεικόνιση Υφής. Μέρος Α Υφή σε Πολύγωνα

Κεφάλαιο 5. ΑΡΧΙΤΕΚΤΟΝΙΚΗ ΥΠΟΛΟΓΙΣΤΩΝ -. Σερπάνος 2. Σημείωση

Τυπικές χρήσεις της Matlab

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

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

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

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

Λειτουργικά Συστήματα Κεφάλαιο 2 Οργάνωση Συστήματος Αρχείων 2.1 Διαχείριση Αρχείων και Σύστημα Αρχείων(File System)

Επεξεργασία Χαρτογραφικής Εικόνας

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

GIMP. Κάππας Κωνσταντίνος Ματθές Δημήτριος

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

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

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

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

Γενικά Στοιχεία Ηλεκτρονικού Υπολογιστή

Μάθημα 4ο. Προγράμματα

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

Κατανεμημένα Συστήματα

DIP_06 Συμπίεση εικόνας - JPEG. ΤΕΙ Κρήτης

Μία μέθοδος προσομοίωσης ψηφιακών κυκλωμάτων Εξελικτικής Υπολογιστικής

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

Γενική οργάνωση υπολογιστή «ΑΒΑΚΑ»

Οργάνωση ενός σύγχρονου Υπολογιστικού Συστήματος ή Ηλεκτρονικού Υπολογιστή (Η/Υ) Τα σύγχρονα συστήματα Η/Υ έχουν την παρακάτω οργάνωση:

Οργάνωση και Αρχιτεκτονική Υπολογιστών. Κεφάλαιο 7.4

Οι βασικές λειτουργίες (ή πράξεις) που γίνονται σε μια δομή δεδομένων είναι:

Λειτουργικά Συστήματα. Τ.Ε.Ι. Ιονίων Νήσων Σχολή Διοίκησης και Οικονομίας - Λευκάδα

ΑΣΚΗΣΗ 2 ΒΑΣΙΚΑ ΚΑΙ ΣΥΝΘΕΤΑ ΣΗΜΑΤΑ ΔΥΟ ΔΙΑΣΤΑΣΕΩΝ - ΕΙΚΟΝΑΣ

ΕΙΣΑΓΩΓΗ ΣΤΙΣ ΑΡΧΕΣ ΤΗΣ ΕΠΙΣΤΗΜΗΣ ΤΩΝ Η/Υ

21. ΦΥΛΛΟ ΕΡΓΑΣΙΑΣ 4 - ΔΗΜΙΟΥΡΓΩΝΤΑΣ ΜΕ ΤΟ BYOB BYOB. Αλγόριθμος Διαδικασία Παράμετροι

Τιμή Τιμή. σκορ. ζωές

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

1 η Εργαστηριακή Άσκηση MATLAB Εισαγωγή

ΕΦΑΡΜΟΓΕΣ ΠΛΗΡΟΦΟΡΙΚΗΣ. Α Γενικού Λυκείου (Μάθημα Επιλογής)

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

ΣΧΕΔΙΑΣΗ ΣΥΣΤΗΜΑΤΩΝ ΜΕ ΧΡΗΣΗ ΥΠΟΛΟΓΙΣΤΩΝ (E-CAD) ΑΚΑΔΗΜΑΪΚΟ ΕΤΟΣ Χ. Βέργος Καθηγητής

Προγραμματισμός Ι (HY120)

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

Λειτουργικά. Τεχνολογικό Εκπαιδευτικό Ίδρυμα Δυτικής Μακεδονίας Σιώζιος Κων/νος - Πληροφορική Ι

ΕΡΓΑΣΤΗΡΙΑΚΗ ΑΣΚΗΣΗ 1

ΑΝΑΠΤΥΞΗ ΕΦΑΡΜΟΓΩΝ ΣΕ ΠΡΟΓΡΑΜΜΑΤΙΣΤΙΚΟ ΠΕΡΙΒΑΛΛΟΝ

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

ΔΙΑΡΘΡΩΣΗ ΠΕΡΙΕΧΟΜΕΝΟΥ

Κεφάλαιο 8. Αριθμητική Λογική μονάδα

ΣΧΕΔΙΑΣΗ ΣΥΣΤΗΜΑΤΩΝ ΜΕ ΧΡΗΣΗ ΥΠΟΛΟΓΙΣΤΩΝ (E-CAD) ΑΚΑΔΗΜΑΪΚΟ ΕΤΟΣ

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

Εργαστήριο Γραφικών. Βοηθητικό Υλικό για την εκπόνηση των εργασιών Αφορά την 1 η Εργαστηριακή Άσκηση

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

Εφαρμογές Πληροφορικής

Αρχιτεκτονική Eckert-von Neumann. Πως λειτουργεί η ΚΜΕ; Κεντρική μονάδα επεξεργασίας [3] ΕΠΛ 031: ΕΙΣΑΓΩΓΗ ΣΤΟΝ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟ

Εισαγωγή στο περιβάλλον Code::Blocks

Μαλούτα Θεανώ Σελίδα 1

Εξωτερική Αναζήτηση. Ιεραρχία Μνήμης Υπολογιστή. Εξωτερική Μνήμη. Εσωτερική Μνήμη. Κρυφή Μνήμη (Cache) Καταχωρητές (Registers) μεγαλύτερη ταχύτητα

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

ΗΜΥ 100 Εισαγωγή στην Τεχνολογία ιάλεξη 5

Ενότητα 3 - Θέματα Εφαρμοσμένης Επιστήμης Υπολογιστών. Κοντογιάννης Βασίλειος ΠΕ19

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

Επιπλέον διδακτικό υλικό κρυφών μνημών: set-associative caches, πολιτικές αντικατάστασης, χειρισμός εγγραφών

Κεφάλαιο 5Β (επανάληψη) Εισαγωγή στην Πληροφορική. Τυπικοί χρόνοι πρόσβασης. Μέσος χρόνος πρόσβασης. Ταχύτητα µεταφοράς δεδοµένων

Υλοποίηση ενός προγραμματιστικού κελύφους εργασίας

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

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

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

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

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

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

Α. Θα καλεί υποπρόγραμμα INPUT που θα διαβάζει τις τιμές του πίνακα MAP.

Transcript:

ΠΑΝΕΠΙΣΤΗΜΙΟ ΘΕΣΣΑΛΙΑΣ ΠΟΛΥΤΕΧΝΙΚΗ ΣΧΟΛΗ ΤΜΗΜΑ ΜΗΧΑΝΙΚΩΝ Η/Υ ΤΗΛΕΠΙΚΟΙΝΩΝΙΩΝ ΚΑΙ ΔΙΚΤΥΩΝ Αλγόριθμοι Επεξεργασιας Εικονας Υψηλης Ευκρεινιας σε Πολυεπεξεργαστικα συστηματα Διπλωματικη Εργασια Γεωργία Ε. Κρόκου Επιβλέποντες Καθηγητές: Μπέλλας Νικόλαος Αναπληρωτής Καθηγητής Π.Θ. Αντωνόπουλος Χρήστος Επίκουρος Καθηγητής Π.Θ. Βόλος, Σεπτέμβριος 2010

Στην οικογένειά μου και στους φίλους μου 2

Ευχαριστίες Με την περάτωση αυτής της διπλωματικής εργασίας, θα ήθελα να ευχαριστήσω τους επιβλέποντες καθηγητές της εργασίας κ. Μπέλλα Νικόλαο και κ. Αντωνόπουλο Χρήστο, για την πολύτιμη βοήθειά τους στην υλοποίησή της, τις εύστοχες υποδείξεις και τις ουσιαστικές παρεμβάσεις τους, καθώς και για την εμπιστοσύνη που έδειξαν στο πρόσωπό μου σε αυτή τη συνεργασία. Επιπλέον, θα ήθελα να ευχαριστήσω ιδιαίτερα την οικογένεια μου και τους φίλους μου για την υποστήριξή τους και τη βοήθειά τους, καθώς βρίσκονταν πάντα δίπλα μου κατά τη διάρκεια των σπουδών μου αλλά και κατά την εκπόνηση της παρούσας διπλωματικής εργασίας. Κρόκου Γεωργία Βόλος, 2010 3

Περιεχόμενα Κατάλογος Σχημάτων... 6 Περίληψη... 7 1. Εισαγωγή... 8 1.1 Περιγραφή του προβλήματος και συμβολή της εργασίας... 8 1.2 Διάρθρωση της Διπλωματικής Εργασίας... 9 2. Resampling... 10 2.1 Οι έννοιες Upsampling και Downsampling... 10 2.2 Απλές Μέθοδοι Παρεμβολής... 11 2.3 Η χρήση του αλγορίθμου Sinc στην παρεμβολή... 12 3. Εισαγωγή στο πρόγραμμα GIMP... 15 3.1 Το πρόγραμμα GIMP και η διεπαφή με το χρήστη... 15 3.2 Γενική δομή των εικόνων στο GIMP... 16 3.3 Ανοίγοντας νέες και υπάρχουσες εικόνες... 16 3.4 Resampling στο GIMP... 18 4. Γενική επισκόπηση της αρχιτεκτονικής CUDA.... 20 4.1 Τι είναι η αρχιτεκτονική CUDA;... 20 4.2 Χρησιμοποιώντας την αρχιτεκτονική CUDA... 20 4.3 Ο παραλληλισμός στον πυρήνα της αρχιτεκτονικής CUDA... 22 4.4 Η ιεραρχία των νημάτων... 23 4.5 Η ιεραρχία της μνήμης... 25 4.5.1 Memory Bandwidth... 26 4.5.2 Global Memory... 27 4.5.3 Coales cing σε κάρτες γραφικών με Υπολογιστική Ικανότητα 1.0 και 1.1... 27 5. Υλοποίηση της μεθόδου παρεμβολής Lanczos 3 σε CUDA και βελτιστοποίηση... 33 5.1 Ο παραλληλισμός στον πυρήνα της αρχιτεκτονικής CUDA... 33 5.2 Υλοποίηση του αλγορίθμου Lanczos 3 στο GIMP... 34 5.3 Αρχική υλοποίηση του αλγορίθμου Lanczos 3 σε CUDA... 39 5.3.1 Τρόπος εγγραφής των δεδομένων στη global μνήμη... 45 5.3.2 Τρόπος ανάγνωσης των δεδομένων από τη global μνήμη... 45 5.3.3 Εγγραφή εικόνας εξόδου στα tiles... 45 5.4 Υλοποίηση του αλγορίθμου Lanczos 3 σε CUDA με χρήση της μνήμης texture.... 47 5.4.1 Αριθμός νημάτων... 48 5.4.2 Τρόπος προσπέλασης των δεδομένων στην Texture μνήμη... 49 5.4.3 Τρόπος εγγραφής των δεδομένων στη global μνήμη... 49 5.5 Υλοποίηση του αλγορίθμου Lanczos 3 στην κάρτα γραφικών GeForce GTX 480.... 49 5.5.1 Αριθμός νημάτων... 50 5.5.2 Τρόπος προσπέλασης των δεδομένων στην Texture μνήμη... 51 5.5.3 Τρόπος εγγραφής των δεδομένων στη global μνήμη... 51 5.6 Υλοποίηση του αλγορίθμου Cubic Splines σε CUDA... 51 5.6.1 Υλοποίηση του αλγορίθμου Cubic Splines στο GIMP... 52 5.6.2 Αρχική υλοποίηση του αλγορίθμου Cubic Splines σε CUDA... 53 5.6.3 Υλοποίηση του αλγορίθμου Cubic Splines σε CUDA με χρήση της μνήμης texture.... 53 5.6.4 Υλοποίηση του αλγορίθμου Cubic Splines στην κάρτα γραφικών GeForce GTX 480.... 54 6. Απόδοσης της εφαρμογής... 55 6.1 Απόδωση της υλοποίησης του αλγορίθμου Lanczos 3... 55 6.1.1 Αρχική υλοποίηση στην κάρτα γραφικών Quadro NVS 290... 55 4

6.1.2 Υλοποίηση με χρήση texture μνήμης... 55 6.1.3 Υλοποίηση στην κάρτα γραφικών GeForce GTX 480... 56 6.2 Απόδωση της υλοποίησης του αλγορίθμου Cubic Splines... 60 6.2.1 Αρχική υλοποίηση στην κάρτα γραφικών Quadro NVS 290... 60 6.2.2 Υλοποίηση με χρήση texture μνήμης... 60 6.2.3 Υλοποίηση στην κάρτα γραφικών GeForce GTX 480... 61 7. Επίλογος... 65 Βιβλιογραφία... 66 5

Κατάλογος Σχημάτων Εικόνα 2.1 : Συνάρτηση Sinc.. 12 Εικόνα 2.2: Γραφική παράσταση συνάρτησης Lanczos2(x). 13 Εικόνα 2.3: Γραφική παράσταση συνάρτησης Lanczos3(x) 13 Εικόνα 3.2: Ο διάλογος New Image.. 17 Εικόνα 3.2: Ο διάλογος Open Image..... 18 Εικόνα 3.2: Ο διάλογος Scale Image..... 19 Εικόνα 4.1: Εντολές κινητής υποδιαστολής ανά δευτερόλεπτο και εύρος ζώνης για CPU και GPU. 22 Εικόνα 4.2: Grid από μπλοκ νημάτων.. 24 Εικόνα 4.3: Το μοντέλο του hardware.. 26 Εικόνα 4.4: Μοντέλα προσπέλασης της shared μνήμης χωρίς bank conflicts. 29 Εικόνα 4.5: Μοντέλα προσπέλασης της shared μνήμης με bank conflicts.. 30 Εικόνα 6.1.1: Αύξηση του χρόνου εκτέλεσης του αλγορίθμου Lanczos 3 κατά το Upsampling χρησιμοποιώντας την κάρτα γραφικών GeForce GTX 480. 57 Εικόνα 6.1.2: Αύξηση του χρόνου εκτέλεσης του αλγορίθμου Lanczos 3 κατά το Upsampling χρησιμοποιώντας την μόνο τη CPU. 58 Εικόνα 6.1.3: Απόδοση του αλγορίθμου Lanczos 3 κατά το Upsampling χρησιμοποιώντας την κάρτα γραφικών GeForce GTX 480. 59 Εικόνα 6.1.4: Απόδοση του αλγορίθμου Lanczos 3 κατά το Downsampling χρησιμοποιώντας την κάρτα γραφικών GeForce GTX 480. 60 Εικόνα 6.2.1: Αύξηση του χρόνου εκτέλεσης του αλγορίθμου Cubic Splines κατά το Upsampling χρησιμοποιώντας την κάρτα γραφικών GeForce GTX 480... 62 Εικόνα 6.2.2: Αύξηση του χρόνου εκτέλεσης του αλγορίθμου Cubic Splines κατά το Upsampling χρησιμοποιώντας μόνο τη CPU.. 63 Εικόνα 6.2.3: Απόδοση του αλγορίθμου Cubic Splines κατά το Upsampling χρησιμοποιώντας την κάρτα γραφικών GeForce GTX 480. 64 6

Περίληψη Resampling αποκαλείται η διαδικασία κατά την οποία μεταβάλλεται το μέγεθος, δηλαδή η ανάλυση μίας εικόνας. Συγκεκριμένα, η διαδικασία κατά την οποία αυξάνεται το μέγεθος της εικόνας λέγεται Upsampling, ενώ αντίστοιχα όταν μειώνεται το μέγεθος της εικόνας λέγεται Downsampling. Υπάρχουν διάφοροι αλγόριθμοι για το σκοπό αυτό όπως οι nearest neighbor, bilinear, cubic splines και sinc. Οι διάφοροι αλγόριθμοι διαφέρουν μεταξύ τους σε χρόνο που απαιτούν για την εκτέλεσή τους αλλά και στην ποιότητα της εικόνας εξόδου. Το GIMP είναι ένα δωρεάν πρόγραμμα επεξεργασίας εικόνας που είναι πλέον διαθέσιμο για τα πιο γνωστά και ευρέως χρησιμοποιούμενα λειτουργικά συστήματα, όπως Linux, Mac OS και Windows. Μία από της πολλές λειτουργικότητες του προγράμματος αυτού είναι το scaling, δηλαδή η αλλαγή μεγέθους εικόνας. Για το σκοπό αυτό το GIMP διαθέτει τους αλγορίθμους nearest neighbor, bilinear, cubic splines και sinc. Συγκεκριμένα, επειδή ο αλγόριθμος sinc είναι αόριστος στην έκτασή του, το GIMP χρησιμοποιεί μία προσέγγισή του, έναν αλγόριθμο με περιορισμένο εύρος έκτασης, ώστε να αποτελεί ένα ρεαλιστικό φίλτρο. Ο αλγόριθμος αυτός είναι ο Lanczos 3. Από τους αλγορίθμους όμως που προσφέρει το GIMP για resampling, ο Lanczos 3 αν και προσφέρει το καλύτερο αποτέλεσμα ποιοτικά, ωστόσο είναι και αυτός που απαιτεί το μεγαλύτερο χρόνο εκτέλεσης. Η αρχιτεκτονική CUDA είναι μία γενικού σκοπού παράλληλη αρχιτεκτονική που έχει εισάγει τα τελευταία χρόνια η NVIDIA. Με την αρχιτεκτονική αυτή προσθέθηκαν στις κάρτες γραφικών της NVIDIA χαρακτηριστικά έτσι ώστε να υπερτερούν και στους υπολογισμούς εκτός από τις παραδοσιακές εργασίες των γραφικών. Τα χαρακτηριστικά (όπως περιοχές μνήμης και ο ιδιαίτερα υψηλός παραλληλισμός) είναι προσπελάσιμα από τον προγραμματιστή με ένα σετ από προεκτάσεις των πλέον διαδεδομένων γλωσσών προγραμματισμού, όπως η C. Η παρούσα διπλωματική εργασία παρουσιάζει τον τρόπο με τον οποίο χρησιμοποιήθηκε η αρχιτεκτονική CUDA για την υλοποίηση των αλγορίθμων Lanczos 3 και Cubic Splines ώστε να βελτιστοποιηθεί ο χρόνος εκτέλεσής τους. Παρούσιάζονται τα διάφορα στάδια βελτιστοποίησης που ακολουθήθηκαν και η ανάλυση της χρήσης των πόρων που μας προσφέρει η αρχιτεκτονική CUDA. Η απόδοση του προγράμματος που προτείνει η διπλωματική αυτή εργασία μετά την εφαρμογή του στην κάρτα γραφικών ξεκινάει από 2.5x και μπορεί να ξεπεράσει το 44x ιδιαίτερα όταν η κλίμακα μεγέθυνσης της εικόνας αυξάνεται σημαντικά. 7

ΚΕΦΑΛΑΙΟ 1 Εισαγωγή 1.1 Περιγραφή του προβλήματος και συμβολή της εργασίας Resampling αποκαλείται η διαδικασία κατά την οποία μεταβάλλεται το μέγεθος, δηλαδή η ανάλυση μίας εικόνας. Αυτό σημαίνει ότι αλλάζει ο αριθμός των pixels από τα οποία αποτελείται. Συγκεκριμένα, η διαδικασία κατά την οποία αυξάνεται το μέγεθος της εικόνας λέγεται Upsampling, ενώ αντίστοιχα αυτή κατά την οποία μειώνεται το μέγεθος της εικόνας λέγεται Downsampling. Η τεχνική με την οποία επιτυγχάνεται το Upsampling ή το Downsampling αποκαλείται Interpolation (Παρεμβολή). Υπάρχουν διάφοροι αλγόριθμοι παρεμβολής. Στους απλούστερους αλγορίθμους συμπεριλαμβάνονται οι nearest neighbor και bilinear. Κάποιοι από τους αλγορίθμους ωστόσο που χρησιμοποιούνται πιο συχνά από διάφορα προγράμματα είναι οι cubic splines και bicubic καθώς είναι πιο πολύπλοκοι και προσφέρουν καλύτερη εικόνα εξόδου σε σχέση με τους προηγούμενους σε λογικό χρόνο. Οι αλγόριθμοι που υπάρχουν διαφέρουν μεταξύ τους σε χρόνο που απαιτούν για την εκτέλεσή τους αλλά και στην ποιότητα της εικόνας εξόδου. Ένας αλγόριθμος που προσφέρει πολύ καλή ποιότητα στην εικόνα εξόδου ακόμη και για σημαντική μεγέθυνση της εικόνας είναι ο sinc. Ωστόσο, επειδή ο αλγόριθμος sinc είναι αόριστος στην έκτασή του, δε χρησιμοποιείται στην πράξη. Έτσι, χρησιμοποιείται μία προσέγγισή του, ένας αλγόριθμο με περιορισμένο εύρος έκτασης, ώστε να αποτελεί ένα ρεαλιστικό φίλτρο. Ο αλγόριθμος αυτός είναι ο Lanczos. Το GIMP είναι ένα δωρεάν πρόγραμμα επεξεργασίας εικόνας που είναι πλέον διαθέσιμο για τα πιο γνωστά και ευρέως χρησιμοποιούμενα λειτουργικά συστήματα, όπως Linux, Mac OS και Windows. Διαθέτει ποικιλία εργαλεία επεξεργασίας, γεγονός που το καθιστά ικανό τόσο για επαγγελματική όσο και για ερασιυεχνική χρήση. Μία από της πολλές λειτουργικότητες του προγράμματος αυτού είναι το scaling, δηλαδή η αλλαγή μεγέθους εικόνας. Για το σκοπό αυτό το GIMP διαθέτει τους αλγορίθμους nearest neighbor, bilinear, cubic splines και sinc. Συγκεκριμένα, το GIMP για την προσέγγιση του αλγορίθμου sinc, χρησιμοποιεί τον αλγόριθμο Lanczos 3. Από τους αλγορίθμους όμως που προσφέρει το GIMP για resampling, ο Lanczos 3 αν και προσφέρει το καλύτερο αποτέλεσμα ποιοτικά, ωστόσο είναι και αυτός που απαιτεί το μεγαλύτερο χρόνο εκτέλεσης. Το αμέσως καλύτερο αποτέλεσμα ποιοτικά που απαιτεί λιγότερο χρόνο το προσφέρει ο αλγόριθμος cubic splines. Η αρχιτεκτονική CUDA είναι μία γενικού σκοπού παράλληλη αρχιτεκτονική που έχει εισάγει τα 8

τελευταία χρόνια η NVIDIA. Η αρχιτεκτονική αυτή συμπεριλάμβανε διάφορα νέα στοιχεία τα οποία σχεδιάστηκαν αυστηρά για υπολογισμούς GPU τα οποία καταργούσαν πολλούς από τους περιορισμούς που εμπόδιζαν τους προηγούμενους επεξεργαστές γραφικών από το να είναι χρήσιμοι για γενικού σκοπού υπολογισμούς. Αυτά τα χαρακτηριστικά της αρχιτεκτονικής CUDA που παρουσιάζονται αναλυτικά στο Κεφάλαιο 4 προστέθηκαν ώστε να δημιουργήσουν μία κάρτα γραφικών η οποία θα υπερτερούσε και στους υπολογισμούς εκτός από τις παραδοσιακές εργασίες των γραφικών. Χρησιμοποιήσαμε λοιπόν την αρχιτεκτονική CUDA για να βελτιστοποιήσουμε το χρόνο εκτέλεσης του αλγορίθμου Lanczos 3 που χρησιμοποιεί το GIMP για resampling. Το ίδιο και για τον αλγόριθμο Cubic Splines. Η κάρτα γραφικών στην οποία έγινε η υλοποίηση των αλγορίθμων την πρώτη φορά είναι η Quadro NVS 290. Στην αρχή κάναμε μία προσαρμογή του κώδικα στη κάρτα γραφικών χρησιμοποιώντας μόνο τη global μνήμη, η οποία είναι μνήμη υψηλής καθυστέρησης και απαιτεί πολλούς κύκλους μηχανής για κάθε ανάγνωση ή εγγραφή σε αυτή. Χρησιμοποιήσαμε φυσικά και πολλαπλά μπλοκ νημάτων ώστε να χρησιμοποιήσουμε τις δυνατότητες παραλληλισμού που μας δίνει η αρχιτεκτονική αυτή. Στη συνέχεια, χρησιμοποιήσαμε την texture μνήμη για αποθήκευση των δεδομένων της εικόνας εισόδου. Η texture είναι μία read-only μνήμη που διαθέτει cache, έτσι χρεωνόμαστε κύκλους μηχανής μόνο σε περίπτωση αστοχίας της cache. Καταφέραμε με αυτό τον τρόπο να βελτιώσουμε σημαντικά την απόδοση των δύο αλγορίθμων. Έπειτα, χρησιμοποιήσαμε μία άλλη κάρτα γραφικών για την εφαρμογή του προγράμματος, την GeForce GTX 480. Με αυτή την κάρτα μπορούμε να πετύχουμε ακόμη μεγαλύτερο παραλληλισμό, άρα και ακόμη καλύτερη απόδοση και στους δύο αλγορίθμους. 1.2 Διάρθρωση της Διπλωματικής Εργασίας Στο Κεφάλαιο 2 παρουσιάζεται η έννοια του resampling καθώς και της παρεμβολής. Επιπλέον, παρουσιάζονται μερικοί από του πιο συνήθεις αλγορίθμους παρεμβολής και συγκρίνονται οι μεταξύ τους επιδώσεις σε χρόνο και ποιότητα. Στο Κεφάλαιο 3 παρουσιάζεται το πρόγραμμα GIMP καθώς και οι αλγόριθμοι που υποστηρίζει το πρόγραμμα αυτό για να εκτελεί το resamplig. Στο κεφάλαιο 4 παρουσιάζεται η αρχιτεκτονική CUDA, οι μέθοδοι που προσφέρονται για επίτευξη του παραλληλισμού καθώς και τα διάφορα κομμάτια μνήμης που προσφέρει η αρχιτεκτονική για βελτιστοποίηση και τα χαρακτηριστικά τους, όπως το bandwidth και οι συνθήκες κάτω από τις οποίες χρησιμοποιούνται με βέλτιστο τρόπο. Στο Κεφάλαιο 5 παρουσιάζεται η υλοποίηση των αλγορίθμων Lanczos 3 και Cubic Splines του προγράμματος GIMP σε αρχιτεκτονική CUDA, καθώς και τα διάφορα στάδια βελτιστοποίησης. Επιπλέον αναλύεται ο τρόπος με τον οποίο χρησιμοποιούνται οι πηγές μνήμης της αρχιτεκτονικής CUDA σε κάθε στάδιο, δηλαδή το μοντέλο που χρησιμοποιείται για την προσπέλαση κάθε μνήμης. Στο Κεφάλαιο 6 παρουσιάζονται τα αποτελέσματα που προέκυψαν σε κάθε στάδιο υλοποίησης και συγκρίνονται αναλυτικά μεταξύ τους. Τέλος, στο Κεφάλαιο 7 παρουσιάζονται τα τελικά συμπεράσματα που προέκυψαν μετά το τέλος της υλοποίησης της παρούσας διπλωματικής εργασίας. 9

ΚΕΦΑΛΑΙΟ 2 Resampling 2.1 Οι έννοιες Upsampling και Downsampling Resampling αποκαλείται η διαδικασία κατά την οποία αλλάζουμε τον αριθμό των δειγμάτων, δηλαδή των διακριτών τιμών ενός ψηφιακού σήματος. Πιο συγκεκριμένα, μπορούμε να αυξήσουμε τα δείγματα του σήματος είτε να τα μειώσουμε. Στη διπλωματική αυτή θα ασχοληθούμε με Resampling εικόνων. Όσο αφορά λοιπόν τις εικόνες, resampling αποκαλείται η μαθηματική διεργασία που χρησιμοποιείται για τη δημιουργία μιας καινούριας έκδοσης μιας υπάρχουσας εικόνας, η οποία θα έχει διαφορετικό πλάτος και ύψος από την αρχική εικόνα. Κατά τη διαδικασία λοιπόν αυτή αλλάζει το μέγεθος μίας ψηφιακής εικόνας, δηλαδή αλλάζει ο αριθμός των pixels από τα οποία αυτή αποτελείται. Η διαδικασία κατά την οποία αυξάνουμε το μέθοδος μίας εικόνας αποκαλείται Upsampling. Αυτό σημαίνει ότι αυξάνουμε την ανάλυση της εικόνας, δηλαδή αυξάνουμε τον αριθμό των pixels που περιέχει. Αντίστοιχα, η διαδικασία κατά την οποία μειώνουμε το μέγεθος μίας εικόνας αποκαλείται Downsampling και κατά τη διαδικασία αυτή μειώνουμε την ανάλυση της εικόνας, δηλαδή των αριθμό των pixels που αυτή περιέχει. Κατά το Upsampling μιας εικόνας ο αριθμός των pixels αυξάνεται, όμως η νέα εικόνα δεν περιέχει επιπλέον πληροφορίες και λεπτομέρειες που δεν υπήρχαν στην αρχική εικόνα. Αυτό έχει ως αποτέλεσμα, η εικόνα όσο περισσότερο μεγεθύνεται τόσο περισσότερο θολό να φαίνεται το αποτέλεσμα, καθώς η ποσότητα της πληροφορίας ανά pixel μειώνεται. Κατά το Downsampling μιας εικόνας ο αριθμός των pixels μειώνεται. Αυτό σημαίνει ότι πληροφορία που υπήρχε στην αρχική εικόνα πρέπει να απομακρυνθεί ώστε να μικρύνει η νέα εικόνα. Για το λόγο αυτό όταν μικραίνουμε την ανάλυση μιας εικόνας και έπειτα την αυξάνουμε πάλι, η εικόνα που θα δημιουργήσουμε δε θα είναι ταυτόσημη με την αρχική, καθώς θα έχει χαθεί ένα μέρος της πληροφορίας που αυτή περιείχε. [1] Το Upsampling ή Downsampling μιας εικόνας μπορούν να μας φανούν χρήσιμα σε διάφορες περιπτώσεις όπως: Μείωση του μεγέθους μιας εικόνας ώστε να την αναρτήσουμε σε μια ιστοσελίδα. Πρέπει να σκεφτούμε ότι πολλοί χρήστες του διαδικτύου διαθέτουν σχετικά μικρές οθόνες, στις οποίες δε μπορεί να απεικονιστεί ολόκληρη μια μεγάλη εικόνα. Πολλές οθόνες έχουν ανάλυση 1024x765 ή και ακόμα μικρότερη. [2] Αλλαγή μεγέθους μίας εικόνας που θέλουμε να εκτυπώσουμε ώστε να εκτυπωθεί στο 10

μέγεθος που επιθυμούμε. Αλλαγή μεγέθους μίας εικόνας ώστε να τη χρησιμοποιήσουμε ως wallpaper στην οθόνη του υπολογιστή μας ή σε άλλες συσκευές όπως η οθόνη ενός κινητού ή μία ψηφιακή κορνίζα. 2.2 Απλές Μέθοδοι Παρεμβολής Η τεχνική με την οποία επιτυγχάνεται το Upsampling ή το Downsampling αποκαλείται Interpolation (Παρεμβολή). Παρεμβολή είναι ο υπολογισμός ενδιάμεσων τιμών [3]. Συγκεκριμένα, κατά το Upsampling χρησιμοποιούμε την παρεμβολή για τον υπολογισμό της τιμής, δηλαδή του χρώματος, των επιπλέον pixels που δημιουργούνται κατά τη μεγέθυνση της εικόνας. Αυτό σημαίνει ότι χρησιμοποιούμε τα υπάρχοντα pixels της αρχικής εικόνας και με βάση αυτά υπολογίζουμε μία προσέγγιση της τιμής (του χρώματος) των επιπλέον pixels που δημιουργούνται. Αντίστοιχα, κατά το Downsampling υπολογίζουμε το μέσο όρο με βάρη των αρχικών pixels, ώστε να βρούμε την τιμή του κάθε νέου pixels. Στους συμβατικούς και πιο απλούς αλγόριθμους παρεμβολής περιλαμβάνονται οι Nearest Neighbor, Bilinear και Bicubic interpolation. Η παρεμβολή με τη μέθοδο των κοντινότερων γειτόνων (Nearest Neighbor) είναι η απλούστερη από όλους τους προαναφερθέντες αλγορίθμους γιατί απλά το κάθε pixel της τελικής εικόνας παίρνει την τιμή του κοντινότερου pixel της εικόνας εισόδου. Αυτό σημαίνει ότι ο αλγόριθμος λαμβάνει υπόψη του μόνο ένα pixel της εικόνας εισόδου για τον υπολογισμό της τιμής ενός pixel της εικόνας εξόδου. Αυτό λειτουργεί επαρκώς για πολύ απλές ψηφιακές εικόνες, αλλά τα ελαττώματα της εικόνας είναι πολύ φανερά όταν επιχειρούμε να αυξήσουμε τις διαστάσεις της εικόνας. Επομένως, η παρεμβολή με τη μέθοδο των κοντινότερων γειτόνων κάνει κάθε pixel μεγαλύτερο, παράγοντας ως αποτέλεσμα μία εικόνα με φανερά blocks που γενικά είναι ανεπιθύμητο. Η Bilinear παρεμβολή, είναι σχετικά πιο ανεπτυγμένη. Αντί να λαμβάνει υπόψη μόνο ένα pixel της εικόνας εισόδου, ο αλγόριθμος ελέγχει μία περιοχή από pixels μεγέθους 2x2 δηλαδή τα τέσσερα pixels από την εικόνα εισόδου που υπάρχουν σε κάθε κατεύθυνση γύρω από το pixel της εικόνας εξόδου. Η τιμή του κάθε pixel εξόδου αποτελεί το ζυγισμένο μέσο όρο των τεσσάρων αυτών τιμών. Ο αλγόριθμος υπολογίζει ένα βάρος για κάθε ένα από αυτά τα τέσσερα pixels ανάλογα με το πόσο κοντά βρίσκονται στο pixel εξόδου. Το άθροισμα των τεσσάρων βαρών πρέπει να είναι ίσο με ένα. Πολλαπλασιάζει έπειτα κάθε pixel με το σχετικό του βάρος και τα προσθέτει ώστε να βρει την τιμή του pixel εξόδου. Η Bicubic παρεμβολή είναι μία γενίκευση της Bilinear, αλλά αυτή τη φορά θέτει βάρη σε μία περιοχή από 4x4 pixels για να καθορίσει την τιμή ενός pixel εξόδου. Η εικόνα εξόδου γενικά θεωρείται καλύτερη, καθιστώντας τον αλγόριθμο αυτό ως την προκαθορισμένη επιλογή για πολλά προγράμματα. Όπως αναμενόταν, η μέθοδος αυτή παράγει μία καθαρή αλλά σχετικά παραμορφωμένη φωτογραφία όταν οι διαστάσεις αυξάνονται αρκετά. [1] 11

2.3 Η χρήση του αλγορίθμου Sinc στην παρεμβολή Ωστόσο, υπάρχουν και άλλοι, πιο αποτελεσματικοί ως προς την εμφάνιση της εικόνας εξόδου αλγόριθμοι. Μία τέτοια μέθοδος παρεμβολής που προσφέρει λιγότερο θολό και περισσότερο αληθοφανές αποτέλεσμα είναι η Sinc interpolation. Η συνάρτηση Sinc αποτελεί το ιδανικό χαμηλοπερατό φίλτρο (low-pass filter). Η συνάρτηση όμως αυτή είναι αόριστη στην έκτασή της, αφού εκτείνεται από το - στο + (βλ. Εικόνα 2.1) και για το λόγο αυτό δε χρησιμοποιείται άμεσα στην πράξη. Εικόνα 2.1 : Συνάρτηση Sinc Έτσι για να εφαρμόσουμε τη συνάρτηση αυτή, θέλουμε να περιορίσουμε το εύρος στο οποίο εκτείνεται ώστε να πετύχουμε ένα ρεαλιστικό φίλτρο. Ένας τρόπος να το πετύχουμε αυτό είναι να πολλαπλασιάσουμε τη συνάρτηση Sinc με μία συνάρτηση η οποία θα είναι μη μηδενική μόνο εντός ενός συγκεκριμένου ορίου. Μία τέτοια συνάρτηση αποκαλείται παράθυρο (window). Οι επιλογές σε συναρτήσεις παραθύρων είναι πολλές και πρακτικά κάθε συνάρτηση που ξεκινάει από το μηδέν φτάνει σε μία κορυφή και έπειτα καταλήγει πάλι στο μηδέν θεωρείται συνάρτηση παραθύρου και συνδέεται με κάποιου το όνομα. Αφόυ λοιπόν η συνάρτηση Sinc προσεγγίζει αργά το μηδέν αλλά ποτέ δεν το αγγίζει, πρέπει να την πολλαπλασιάσουμε με μία κατάλληλη συνάρτηση παραθύρου. Μία τέτοια συνάρτηση είναι η 2-lobed Lanczos. Η συνάρτηση αυτή ορίζεται ως εξής: ενώ η η γραφική της παράσταση έχει τη μορφή που φαίνεται στην Εικόνα 2.2. 12

Εικόνα 2.2: Γραφική παράσταση συνάρτησης Lanczos2(x) Άλλη μία συνάρτηση παραθύρου, με μεγαλύτερο εύρος παραθύρου ώστε να προσεγγίζει ακόμη καλύτερα τη συνάρτηση Sinc είναι η 3-lobed Lanczos και έχει τον παρακάτω ορισμό: ενώ η η γραφική της παράσταση έχει τη μορφή που φαίνεται στην Εικόνα 2.2 [3]. Εικόνα 2.3: Γραφική παράσταση συνάρτησης Lanczos3(x) Η συνάρτηση Lanczos έχει αποδειχτεί πως είναι ιδιαίτερα χρήσιμη για εφαρμογές γραφικών. Ας δούμε όμως λίγο πιο αναλυτικά τη λειτουργία του αλγορίθμου αυτού. Οποιοδήποτε φίλτρο που χρησιμοποιείται για την επεξεργασία σημάτων έχει «taps», τα οποία είναι διακριτές τιμές εισόδου που χρησιμοποιούνται για τον υπολογισμό της κάθε τιμής εξόδου. Όταν ένα φίλτρο βασίζεται σε μία συνάρτηση παραθύρου της μορφής Sinc τότε είναι βολικό να μιλάμε για τον 13

αριθμό των «lobes» της συνάρτησης Sinc που χρησιμοποιούνται. X=0 μέχρι X=π είναι ένα lobe, Χ=π μέχρι Χ=2π είναι ένα δεύτερο lobe και Χ=2π μέχρι Χ=3π είναι ένα τρίτο lobe κ.λπ. Επειδή όλες οι παραθυροτές συναρτήσεις της μορφής Sinc είναι συμμετρικές γύρω από το μηδέν, μιλάμε για τον αριθμό των lobes από τη μία πλευρά πέρα του μηδέν. Υπάρχει ίδιος αριθμός lobes από την άλλη πλευρά. Οπότε όταν αναφερόμαστε στη συνάρτηση Lanczos2 εννοούμε τη 2-lobe Lanczoswindowed συνάρτηση της μορφής Sinc. Στην πραγματικότητα υπάρχουν τέσσερα lobes, δύο σε κάθε μεριά πέρα από το μηδέν. Αντίστοιχα, όταν αναφερόμαστε στη συνάρτηση Lanczos3 εννοούμε τη 3-lobe Lanczos-windowed συνάρτηση της μορφής Sinc, η οποία στην πραγματικότητα έχει έξι lobes. Όταν λοιπόν θέλουμε να εφαρμόσουμε τη διεργασία Upsampling σε ένα μονοδιάστατο σήμα με τον αλγόριθμο Lanczos3, για τον υπολογισμό μίας τιμής εξόδου θα χρησιμοποιήσουμε έξι τιμές (δείγματα) του σήματος εισόδου. Όταν όμως αναφερόμαστε σε ένα σήμα δισδιάστατο, όπως μία εικόνα, τότε θα χρειαστούμε συνολικά για τον αλγόριθμο Lanczos 6x6 taps, δηλαδή 6 taps σε κάθε κατεύθυνση. Για τον υπολογισμό οπότε της τιμής ενός pixel της εικόνας εξόδου θα χρησιμοποιήσουμε 6x6 taps δηλαδή 6x6 pixels της εικόνας εισόδου. Ο αλγόριθμος λοιπόν χρησιμοποιεί τριάντα έξι pixels από την εικόνα εισόδου για κάθε pixel της εικόνας εξόδου. Ανεξάρτητα από το μέγεθος της εικόνας εξόδου, ο αριθμός των pixels της εικόνας εισόδου που χρησιμοποιούνται για την εύρεση της τιμής ενός pixel εξόδου είναι πάντα ο ίδιος. Αυτό φυσικά συμβαίνει για κάθε στοιχείο ενός pixel (R, G, B). [4] Κάποιοι έχουν συγκρίνει το φίλτρο Lanczos με άλλα απλούστερα φίλτρα ή άλλες εκδοχές σε μορφή παραθύρου της συνάρτησης sinc, βρίσκοντάς το "το καλύτερα συμβατό" σε σχέση με τα υπόλοιπα φίλτρα που υπάρχουν και χρησιμοποιούνται. Lanczos resampling λοιπόν, είναι μία μέθοδος παρεμβολής που χρησιμοποιείται για τον υπολογισμό νέων τιμών για οποιοδήποτε ψηφιακό σήμα. Η μέθοδος αυτή όπως αναφέραμε προηγουμένος συχνά χρησιμοποιείται και για την αλλαγή της ανάλυσης εικόνων. Στην περίπτωση αυτή η συνάρτηση Lanczos δείχνει ποια pixels της αρχικής εικόνας θα χρησιμοποιηθούν και σε ποια αναλογία για να καθορίσουν την τιμή του κάθε pixel της τελικής εικόνας. [6] 14

ΚΕΦΑΛΑΙΟ 3 Εισαγωγή στο πρόγραμμα GIMP 3.1 Το πρόγραμμα GIMP και η διεπαφή με το χρήστη Το GIMP, που σημαίνει GNU Image Manipulation Program, είναι ένα δωρεάν πρόγραμμα επεξεργασίας γραφικών και εικόνας. Μερικές χρήσεις του είναι η δημιουργία γραφικών, η αλλαγή διαστάσεων μιας φωτογραφίας, η διόρθωση του χρωματικού τόνου και της φωτεινότητας, καθώς και η αλλαγή μεταξύ διαφορετικών format εικόνων και πολλές άλλες. Το GIMP μπορεί επίσης να χρησιμοποιηθεί για δημιουργία κινούμενων εικόνων τύπου Gif. Το GIMP ξεκίνησε το 1995 από τον Spencer Kimball και τον Peter Mattis. Αποτελεί πλέον μέρος του GNU Project και διατίθεται με την GNU General Public License. Η εργαλειοθήκη GTK+, που αναπτύχθηκε αρχικά για το πρόγραμμα, έχει βρει χρήση σε πολλές ακόμα εφαρμογές, και αποτελεί σήμερα τη βάση γνωστών περιβαλλόντων εργασίας, όπως τα GNOME και Xfce. [7] Το GIMP διαθέτει ένα βασικό παράθυρο και διάφορα παράθυρα διαλόγων που χρησιμοποιούνται για τα εργαλεία που προσφέρει, για τις παλέτες χρωμάτων και άλλα. Αυτά τα παράθυρα και οι διάλογοι συνιστούν τη διεπαφή του GIMP με το χρήστη. Επειδή το GIMP χρησιμοποιεί πολλαπλά παράθυρα, ο χρήστης καλό θα είναι για τη δική του ευκολία να τοποθετεί τα παράθυρα αυτά σε μία λειτουργική θέση. Για να χτίσει τη διεπαφή του με το χρήστη, το GIMP χρησιμοποιεί το GIMP tool kit (GTK+). Το GTK+ σχεδιάστηκε για να αντικαταστήσει το Motif, ένα toolkit από το οποίο το GIMP ήταν εξαρτημένο. Αρχικά το GTK+ ήταν κομμάτι του πηγαίου κώδικα του GIMP, αλλά πλέον αποτελεί μία αυτόνομη βιβλιοθήκη. Ενώ αρχικά σχεδιάστηκε για να τρέχει σε λειτουργικά συστήματα τύπου Unix, πλέον το GIMP και το GTK+ μπορούν να εγκατασταθούν και στα to Microsoft Windows, Mac OS X και άλλα λειτουργικά συστήματα. Εξαιτίας του μεγέθους των αρχείων από τα οποία αποτελείται το GIMP, Το λειτουργικό σύστημα Ubuntu δε συμπεριλαμβάνει πλέον το GIMP, αλλά παραμένει διαθέσιμο για εγκατάσταση μέσω του package manager. Εικόνα 3.1: Wilber, η μασκότ του Gimp 15

Τα εργαλεία που χρησιμοποιούνται για να διαχειρίζονται εικόνες μπορούν να προσπελαστούν από το toolbox, μέσω των menu και των παραθύρων διαλόγων. Στα εργαλεία συμπεριλαμβάνονται φίλτρα, πινέλα ζωγραφικής, αλλά και μετατροπή του τύπου αποθήκευσης της εικόνας, επιλογή ενός μέρους της εικόνας και πολλά άλλα. [7] 3.2 Γενική δομή των εικόνων στο GIMP Μία εικόνα στο GIMP αποτελεί μία περίπλοκη δομή, η οποία αποτελείται από μία στοίβα επιπέδων και διάφορα άλλα αντικείμενα όπως μία μάσκα επιλογής, ένα σετ καναλιών, ένα σετ μονοπατιών, ένα ιστορικό «undo» κ.λπ. Το πιο βασικό χαρακτηριστικό όμως μιας εικόνας είναι ο τρόπος με τον οποίο απεικονίζεται το χρώμα στην εικόνα. Οι δύο πιο συνηθισμένες και συχνά χρησιμοποιούμενες μέθοδοι είναι οι RGB και grayscale.τα αρχικά της μεθόδου RGB προέρχονται από τις λέξεις red (κόκκινο) green (πράσινο) και blue (μπλε) και δηλώνουν ότι κάθε σημείο μίας εικόνας αναπαριστάται από ένα «κόκκινο» επίπεδο, ένα «πράσινο» επίπεδο και ένα «μπλε» επίπεδο, δημιουργώντας έτσι μία έγχρωμη εικόνα. Κάθε κανάλι χρώματος μπορεί να πάρει 256 διαφορετικές τιμές, υπάρχουν δηλαδή 256 πιθανά επίπεδα έντασης του κάθε χρώματος. Μία εικόνα της μορφής grayscale είναι μία εικόνα που τα χρώματά της αναπαρίστανται στη γκρι κλίμακα. Κάθε σημείο της αναπαριστάται από μία τιμή φωτεινότητας που κυμαίνεται από το 0 (μαύρο) μέχρι το 255 (άσπρο), με τις ενδιάμεσες τιμές να αναπαριστούν διαφορετικά επίπεδα του γκρι χρώματος. Η διαφορά λοιπόν μεταξύ μίας εικόνας που απεικονίζεται στη γκρι κλίμακα και μίας εικόνας RGB είναι ο αριθμός καναλιών χρωμάτων. Μια εικόνα στη γκρι κλίμακα έχει ένα κανάλι χρώματος ενώ μία RGB εικόνα έχει τρία. Στην πραγματικότητα, και οι RGB και οι grayscale εικόνες έχουν ένα επιπρόσθετο κανάλι χρώματος που αποκαλείται κανάλι alpha, το οποίο αντιπροσωπεύει τη διαφάνεια. Όταν η τιμή alpha σε μία δοσμένη περιοχή είναι μηδέν, το συγκεκριμένο επίπεδο εντελώς διαφανές, Δηλαδή μπορούμε να δούμε μέσα από αυτό, και το χρώμα στην περιοχή αυτή εξαρτάται από το τι υπάρχει κάτω από το επίπεδο αυτό. Όταν η τιμή του alpha είναι μέγιστη (255), το επίπεδο είναι εντελώς αδιαφανές και το χρώμα καθορίζεται μόνο από το χρώμα του συγκεκριμένου επιπέδου. Οι ενδιάμεσες τιμές του alpha αντιστοιχούν στους διάφορους βαθμούς διαφάνειας / αδιαφάνειας. Το χρώμα της περιοχής είναι μία αναλογία του χρώματος του επιπέδου και του χρώματος που βρίσκεται κάτω από το επίπεδο αυτό. [8] 3.3 Ανοίγοντας νέες και υπάρχουσες εικόνες Στο GIMP μπορούμε να επεξεργαστούμε εικόνες, όπως για παράδειγμα να τους αλλάξουμε μέγεθος, τις οποίες είτε έχουμε ήδη αποθηκευμένες στον υπολογιστή και θέλουμε να τις ανοίξουμε με το πρόγραμμα αυτό είτε τις δημιουργούμε εμείς ξεκινώντας από μία κενή εικόνα. Παρακάτω βλέπουμε τους τρόπους με τους οποίους μπορούμε να ενεργοποιήσουμε τις δύο αυτές διαδικασίες. 16

Χρησιμοποιώντας το διάλογο New Image, μπορούμε να δημιουργήσουμε μία νέα κενή εικόνα και να θέσουμε της ιδιότητές της. Η εικόνα αυτή θα εμφανιστεί σε ένα παράθυρο με όνομα «new image». Μπορούμε να έχουμε παραπάνω από μία εικόνα στις οθόνες μας ταυτόχρονα. Μπορούμε να βρούμε την εντολή δημιουργίας νέας εικόνας είτε μέσω του menubar επιλέγοντας File New, είτε χρησιμοποιώντας τη συντόμευση Ctrl+N από το πληκτρολόγιο. Στην Εικόνα 3.2 βλέπουμε το παράθυρο διαλόγου New Image.[9] Εικόνα 3.2: Ο διάλογος New Image Μπορούμε να θέσουμε το πλάτος και το ύψος που θέλουμε να έχει η νέα εικόνα. Οι προκαθορισμένες μονάδες μέτρησης είναι pixels, αλλά μπορούμε να διαλέξουμε μία άλλη μονάδα της επιλογής μας. Η νέα εικόνα που θα δημιουργήσουμε μπορεί αν είναι στη μορφή της επιλογής μας, δηλαδή σε μoρφή RGB είτε σε μορφή grayscale. Επιπλέον, μπορούμε να ανοίξουμε μία υπάρχουσα εικόνα η οποία είναι αποθηκευμένη στον υπολογιστή μας και την οποία θέλουμε να επεξεργαστούμε. Ο τρόπος με τον οποίο μπορούμε να το πετύχουμε αυτό είναι από το menubar. Επιλέγοντας Open File μπορούμε να ενεργοποιήσουμε το διάλογο «Open Image». Ο διάλογος αυτός φαίνεται στην Εικόνα 3.3. [10] 17

Εικόνα 3.3: Ο διάλογος Open Image 3.4 Resampling στο GIMP Η διαδικασία του resampling στο GIMP γίνεται μέσω της εντολής Scale Image. Η εντολή Scale Image αυξάνει ή μειώνει το φυσικό μέγεθος μίας εικόνας αλλάζοντας τον αριθμό των pixels που αυτή περιέχει. Αλλάζει το μέγεθος των περιεχομένων της εικόνας και μεταβάλλει ανάλογα και το μέγεθος του καμβά. Για να ενεργοποιήσουμε την εντολή αυτή επιλέγουμε από το menubar: Image Scale image. Μεταβάλλοντας το μέγεθος μιαs εικόνας ταυτόχρονα αλλάζουμε τον αριθμό των pixels (το μέγεθος της πληροφορίας) που περιέχει η εικόνα, οπότε επιρεάζουμε και το μέγεθος της μνήμης που απαιτεί η εικόνα. Αν αυξήσουμε το μέγεθος μίας εικόνας, το GIMP υπολογίζει την τιμή των επιπλέον pixels με παρεμβολή (interpolation), αλλά δεν προσθέτει κάποια επιπλέον λεπτομέρεια στην εικόνα. Όσο περισσότερο μεγεθύνουμε μία εικόνα, τόσο πιο θολό και παραμορφοποιημένο θα είναι το αποτέλεσμα. Η εμφάνιση μιας μεγεθυμένης εικόνας εξαρτάται από το είδος της παρεμβολής που θα χρησιμοποιήσουμε. Όταν κάνουμε κλικ στην εντολή Scale το κουτί του διαλόγου που εμφανίζεται δείχνει τις διαστάσεις της αρχικής εικόνας σε pixels (βλ. Εικόνα 3.4). Μπορούμε να θέσουμε το πλάτος και το ύψος που θάλουμε να δώσουμε στην εικόνα προσθέτοντας ή αφαιρώντας pixels. Αν η εικόνα του λουκέτου που υπάρχει δίπλα στα κουτιά του πλάτους και του ύψους είναι ενωμένη, τότε το πλάτος και το ύψος θα διατηρήσουν την ίδια αναλογία μεταξύ τους. Αν κάνουμε κλικ πάνω στην εικόνα αυτή και σπάσουμε το λουκέτο, τότε μπρούμε να θέσουμε το νέο ύψος και το νέο πλάτος της εικόνας ανεξάρτητα μεταξύ τους, αλλά στην περίπτωση αυτή το αποτέλεσμα της εικόνας θα διαστρευλωθεί. 18

Πίνακας 3.4: Ο διάλογος Scale Image Για να αλλάξουμε το μέγεθος της εικόνας, πρέπει είται να προσθέσουμε είτε να αφαιρέσουμε κάποια pixels. Το είδος της παρεμβολής που θα χρησιμοποιήσουμε για τη διαδικασία αυτή θα καθορίσει την ποιότητα του αποτελέσματος. Το GIMP προσγέρει μία λίστα από επιλογές για τα διαθέσιμα είδη παρεμβολής που μπορεί κάποιος να χρησιμοποιήσει. Οι επιλεογές αυτές είναι: Παρεμβολή None: Δε χρησιμοποιέιται καμία μέθοδος παρεμβολής. Τα πixels απλά μεγεθύνονται ή αφαιρούνται. Αυτή η μέθοδος είναι χαμηλής ποιότητας αλλά πολύ γρήγορη. Linear: Η μέθοδος αυτή είναι σχετικά γρήγορη αλλά ούτε αυτή προσφέρει ικανοποιητικά αποτελέσματα. Cubic: Η μέθοδος αυτή προσφέρει το καλύτερο αποτέλεσμα σε σχέση με τις δύο προηγούμενες μεθόδους αλλά είναι και αρκετά πιο αργή. Sinc (Lanczos 3): Η μέθοδος αυτή θεωρείται ότι προσφέρει το καλύτερο αποτέλεσμα αφού παρέχει φανερά λιγότερο θολό αποτέλεσμα σε σημαντικές αλλάγές μεγέθους αλλά είναι πιο αργή και από τις 3 προηγούμενες μεθόδους. [2] 19

ΚΕΦΑΛΑΙΟ 4 Γενική επισκόπηση της αρχιτεκτονικής CUDA. 4.1 Τι είναι η αρχιτεκτονική CUDA; Το Νοέμβριο του 2006 η NVIDIA έβγαλε στην παραγωγή την πρώτη DirectX 10 GPU την GeForce 8800 GTX. Η κάρτα αυτή ήταν η πρώτη κάρτα γραφικών που χτίστηκε με αρχιτεκτονική CUDA. Η αρχιτεκτονική αυτή συμπεριλάμβανε διάφορα νέα στοιχεία τα οποία σχεδιάστηκαν αυστηρά για υπολογισμούς GPU τα οποία καταργούσαν πολλούς από τους περιορισμούς που εμπόδιζαν τους προηγούμενους επεξεργαστές γραφικών από το να είναι χρήσιμοι για γενικού σκοπού υπολογισμούς. Ανόμοια με τις προηγούμενες γενιές καρτών γραφικών που διαχώριζαν τις πηγές υπολογισμού σε κορυφές και σε αποχρώσεις των pixels, η αρχιτεκτονική CUDA περιείχε και ένα κανάλι το οποίο επέτρεπε σε κάθε αριθμητική λογική μονάδα (ALU) πάνω στο chip να χρησιμοποιείται από ένα πρόγραμμα που εκτελεί γενικού σκοπού υπολογισμούς. Επειδή η NVIDIA στόχευε αυτή η νέα οικογένεια επεξεργαστών να χρησιμοποιηθεί για γενικού σκοπού υπολογισμούς, αυτές οι αριθμητικές λογικές μονάδες χτίστηκαν έτσι ώστε να συμμορφώνονται με τις απαιτήσεις της IEEE για μονής ακρίβειας floating-point αριθμούς και σχεδιάστηκαν ώστε να χρησιμοποιούν ένα σετ εντολών στοχευόμενο για γενικούς υπολογισμούς αντί για υπολογισμούς ειδικά για γραφικά. Επιπλέον, οι μονάδες εκτέλεσης στην GPU προσπελάσεις read και write στη μνήμη, όπως και πρόσβαση σε μία cache γνωστή ως shared memory. Όλα αυτά τα χαρακτηριστικά της αρχιτεκτονικής CUDA προστέθηκαν ώστε να δημιουργήσουν μία κάρτα γραφικών η οποία θα υπερτερούσε και στους υπολογισμούς εκτός από τις παραδοσιακές εργασίες των γραφικών. 4.2 Χρησιμοποιώντας την αρχιτεκτονική CUDA Η προσπάθεια της NVIDIA να παρέχει στους καταναλωτές ένα προϊόν για γραφικά αλλά και για υπολογισμούς δε μπορούσε να σταματήσει στην παραγωγή hardware που θα ενσωμάτωνε την αρχιτεκτονική CUDA. Ανεξάρτητα από το πόσα χαρακτηριστικά προστέθηκαν στα chips της NVIDIA, για να διευκολύνουν τους υπολογισμούς, εξακολουθούσε να μην υπάρχει τρόπος να προσπελάσουμε τα χαρακτηριστικά αυτά χωρίς τη χρήση OpenGL ή DirectX. Αυτό δεν απαιτούσε 20

απλά να συνεχίσουν οι καταναλωτές να «μεταμφιέζουν» τους υπολογισμούς σε προβλήματα γραφικών, αλλά εξακολουθούσαν να πρέπει να γράφουν τους υπολογισμούς σε μία γλώσσα προορισμένη για γραφικά όπως η GLSL ή η HLSL. Για να αγγίξει ο μέγιστο δυνατά αριθμό από developers, η NVIDIA πρόσθεσε στη γλώσσα C ένα αριθμό από λέξεις κλειδιά έτσι ώστε να συμπεριληφθούν σε αυτή κάποια από τα ειδικά χαρακτηριστικά της αρχιτεκτονικής CUDA. Λίγους μήνες αργότερα η NVIDIA έβγαλε στη δημοσιότητα ένα compiler για αυτή τη γλώσσα, τον CUDA C. Με αυτόν, η CUDA C έγινε η πρώτη γλώσσα ειδικά σχεδιασμένη από εταιρία Καρτών Γραφικών, που διευκολύνει τους υπολογισμούς γενικού σκοπού στις κάρτες γραφικών. Έτσι πλέον οι χρήστες δε χρειάζεται να έχουν την οποιαδήποτε γνώση από τις διεπαφές προγραμματισμού γραφικών OpenGL ή DirectX, ούτε απαιτείται να αναγκάσουν το πρόγραμμά τους να μοιάζει με εργασία γραφικών. [11] Οδηγούμενη από τις ακόρεστες απαιτήσεις της αγοράς για εφαρμογές αληθινού χρόνου (realtime), υψηλής ανάλυσης τρισδιάστατα γραφικά, η GPU έχει εξελιχθεί σε έναν υψηλού παραλληλισμού, πολυνηματικό, πολυπύρηνο επεξεργαστή με τεράστια υπολογιστική ιπποδύναμη και πολύ υψηλό εύρος ζώνης μνήμης (memory bandwidth), όπως φαίνεται και στην Εικόνα 4.1. 21

Εικόνα 4.1: Εντολές κινητής υποδιαστολής ανά δευτερόλεπτο και εύρος ζώνης για CPU και GPU 4.3 Ο παραλληλισμός στον πυρήνα της αρχιτεκτονικής CUDA Στον πυρήνα της CUDA υπάρχουν τρία επίπεδα αφαίρεσης μία ιεραρχία από ένα σύνολο νημάτων, κοινόχρηστοι χώροι μνήμης από τα νήματα και barrier για το συγχρονισμό των νημάτων που προσφέρονται στον προγραμματιστή ως ένα σετ με προεκτάσεις μίας γλώσσας. 22

προγραμματισμού. Αυτές οι αφαιρέσεις παρέχουν έναν υψηλής ποιότητας παραλληλισμό δεδομένων και παραλληλισμό νημάτων, ο οποίος είναι εμφωλευμένος σε έναν κοινό παραλληλισμό εργασιών και δεδομένων. Έτσι οδηγούν τον προγραμματιστή να χωρίσει το πρόβλημα σε υποπροβλήματα τα οποία μπορούν να λυθούν ανεξάρτητα μεταξύ τους άρα και παράλληλα και έπειτα σε μεγαλύτερα τελικά κομμάτια τα οποία μπορούν να λυθούν συνεργατικά παράλληλα. Μία τέτοια διάσπαση διατηρεί την εκφραστικότητα της γλώσσας με το να επιτρέπει στα νήματα να συνεργάζονται όταν λύνουν κάθε υποπρόβλημα και ταυτόχρονα καθιστά δυνατή την κλιμακωτή διαφάνεια καθώς κάθε υποπρόβλημα μπορεί να δρομολογηθεί έτσι ώστε να λυθεί σε οποιονδήποτε από τους διαθέσιμους πυρήνες επεξεργαστών. Για το λόγο αυτό, ένα μεταφρασμένο πρόγραμμα CUDA μπορεί να εκτελεστεί σε έναν οποιοδήποτε αριθμό από πυρήνες επεξεργαστών και μόνο το runtime system χρειάζεται να ξέρει τον αριθμό αυτό. Η αρχιτεκτονική CUDA και το σχετικό λογισμικό αναπτύχθηκαν με διάφορους στόχους: Να παρέχουν ένα μικρό σετ από προεκτάσεις σε κάποιες καθιερωμένες γλώσσες προγραμματισμού όπως η C που θα καθιστά δυνατή την άμεση υλοποίηση των παράλληλων αλγορίθμων. Με την CUDA και τη C για CUDA, οι προγραμματιστές μπορούν να επικεντρωθούν στη διαδικασία παραλληλισμού του αλγορίθμου αντί να ξοδεύουν χρόνο στην υλοποίησή του. Να υποστηρίζουν ετερογενείς υπολογισμούς όπου οι εφαρμογές χρησιμοποιούν και τη CPU και τη GPU. Τα σειριακά κομμάτια των αλγορίθμων θα εκτελούνται στον κεντρικό επεξεργαστή (CPU) και τα παράλληλα κομμάτια θα εκτελούνται στην κάρτα γραφικών (GPU). Οπότε η CUDA μπορεί εύκολα να εφαρμοστεί σε υπάρχουσες εφαρμογές. Η CPU και η GPU είναι ξεχωριστές συσκευές που έχουν το δικό τους χώρο μνήμης. Η διαμόρφωση αυτή επιτρέπει επιπλέον τους ταυτόχρονους υπολογισμούς στις συσκευές αυτές χωρίς ανταγωνισμό για τις πηγές μνήμης. Οι κάρτες γραφικών που διαθέτουν αρχιτεκτονική CUDA έχουν εκατοντάδες πυρήνες οι οποίοι μπορούν συγκεντρωτικά να εκτελούν χιλιάδες νήματα υπολογισμών. Κάθε πυρήνας διαθέτει κοινόχρηστες πηγές, συμπεριλαμβανομένων των καταχωρητών και περιοχών μνήμης. 4.4 Η ιεραρχία των νημάτων Η C for CUDA εκτείνει τη C επιτρέποντας στον προγραμματιστή να ορίσει συναρτήσεις C, που αποκαλούνται kernels, οι οποίοι όταν καλούνται εκτελούνται Ν φορές παράλληλα, από Ν διαφορετικά νήματα, σαν να καλούνται μόνο μία φορά όπως στις συνηθισμένες συναρτήσεις της C. Τα νήματα οργανώνονται σε μονοδιάστατα, δισδιάστατα ή τρισδιάστατα μπλοκ από νήματα. Αυτό παρέχει ένα φυσικό τρόπο να υλοποιηθούν οι υπολογισμοί κατά μήκος των στοιχείων σε μία δομή όπως ένας πίνακας, ένα διάνυσμα ή ένα πεδίο. Τα νήματα ενός μπλοκ μπορούν να συνεργαστούν μεταξύ τους μοιράζοντας δεδομένα μέσω κάποιας κοινόχρηστης μνήμης η οποία ονομάζεται shared memory και να συγχρονίζουν την εκτέλεσή τους με συντονισμένες προσπελάσεις μνήμης. Ο αριθμός των νημάτων ανά μπλοκ περιορίζεται από τις πηγές μνήμης ενός επεξεργαστή πυρήνα. Στις τωρινές κάρτες γραφικών, ένα μπλοκ από νήματα μπορεί συνήθως να περιέχει μέχρι 512 νήματα. 23

Ωστόσο, μία συνάρτηση πυρήνα (kernel) μπορεί να εκτελεστεί από πολλαπλά ίσου μεγέθους μπλοκ νημάτων, έτσι ώστε ο συνολικός αριθμός νημάτων να είναι ίσος με τον αριθμό των νημάτων ανά μπλοκ επί τον αριθμό των μπλοκ. Αυτά τα πολλαπλά μπλοκ νημάτων οργανώνονται σε μονοδιάστατο, δισδιάστατο ή τρισδιάστατο grid (πλέγμα) από μπλοκ νημάτων (βλ. Εικόνα 4.2). Ο αριθμός των μπλοκ νημάτων σε ένα grid τυπικά ορίζεται με βάση το μέγεθος των δεδομένων που είναι προς επεξεργασία αντί για τον αριθμό των επεξεργαστών σε ένα σύστημα, ο οποίος μπορεί να γίνει ιδιαίτερα μεγάλος. Εικόνα 4.2: Grid από μπλοκ νημάτων 24

4.5 Η ιεραρχία της μνήμης Τα CUDA νήματα μπορούν να προσπελαύνουν δεδομένα από διάφορους χώρους μνήμης κατά τη διάρκεια της εκτέλεσής τους. Κάθε νήμα έχει μία ιδιωτική μνήμη η οποία ονομάζεται local memory. Κάθε μπλοκ νημάτων έχει μία μνήμη που είναι ορατή από όλα τα νήματα του μπλοκ και έχει τον ίδιο χρόνο ζωής με το μπλοκ. Η μνήμη αυτή ονομάζεται shared memory. Τέλος όλα τα νήματα σε ένα grid έχουν πρόσβαση στη μνήμη που ονομάζεται global memory. Υπάρχουν επιπλέον δύο read-only κομμάτια μνήμης που είναι προσπελάσιμα από όλα τα νήματα: η constant και η texture μνήμη. Η global, η constant και η texture μνήμη είναι βέλτιστες για διαφορετικές χρήσεις της μνήμης. Το προγραμματιστικό μοντέλο της CUDA υποθέτει ένα σύστημα που αποτελείται από το χώρο στον οποίο τρέχει ο κώδικας που εκτελείται στη CPU και ονομάζεται host και το χώρο στον οποίο τρέχει ο κώδικας που εκτελείται στη GPU και ονομάζεται device, κάθε ένας από τους οποίους έχει τη δική του ξεχωριστή μνήμη. Οι kernes μπορούν να ενεργούν μόνο στη device μνήμη, οπότε παρέχονται συναρτήσεις για δέσμευση, αποδέσμευση και αντιγραφή της device μνήμης, όπως και για μεταφορά δεδομένων μεταξύ της host και της device μνήμης. Η device μνήμη μπορεί να δεσμευθεί είτε ως γραμμική μνήμη (linear memory) είτε ως CUDA arrays. Οι CUDA arrays είναι αδιαφανή κομμάτια μνήμης τα οποία είναι βέλτιστα για την αποθήκευση των textures. Η texture μνήμη είναι μία χαμηλής καθυστέρησης μνήμη που είναι πολύ γρηγορότερη από τη global μνήμη. Η CUDA υποστηρίζει ένα κομμάτι υλικού (hardware) που το χρησιμοποιεί η κάρτα γραφικών για τα γραφικά ώστε να προσπελαύνουν τη μνήμη αυτή. Το διάβασμα δεδομένων από την texture μνήμη αντί από την global μνήμη μπορεί να επιφέρει διάφορα οφέλη στη απόδοση. Η texture μνήμη είναι μία read-only μνήμη η οποία είναι προσπελάσιμη από όλα τα νήματα και μπορεί να διαβαστεί χρησιμοποιώντας CUDA arrays. Οι CUDA arrays μπορούν να είναι μονοδιάστατοι, δισδιάστατοι ή τρισδιάστατοι και μπορούν να διαβαστούν μόνο από τους kernels μέσω των texture αναφορών. Όπως φαίνεται στην Εικόνα 4.3, κάθε multiprocessor έχει μνήμη από κάθε έναν από τους επόμενους τέσσερις τύπους: Ένα σετ από 32-bit καταχωρητές ανά επεξεργαστή, Μία cache δεδομένων ή shared memory η οποία μοιράζεται από όλους τους πυρήνες επεξεργαστών Μία read-only cache, την constant cache η οποία μοιράζεται από όλους τους επεξεργαστές και επιταχύνει προσπελάσεις για διάβασμα από την costant μνήμη, η οποία είναι μία read-only περιοχή που βρίσκεται στη device μνήμη, Μία read-only cache, την texture cache η οποία μοιράζεται από όλους τους επεξεργαστές και επιταχύνει προσπελάσεις για διάβασμα από την texture μνήμη, η οποία είναι μία read-only περιοχή που βρίσκεται στη device μνήμη, Η local και η global μνήμη είναι περιοχές στις οποίες μπορούμε και να γράψουμε και να διαβάσουμε, βρίσκονται στη device μνήμη αλλά δεν έχουν cache. Ο αριθμός των ενεργών μπλοκ ανά επεξεργαστή εξαρτάται από το πόσους καταχωρητές ανά νήμα και πόση shared μνήμη ανά μπλοκ απαιτείται για μία συνάρτηση πυρήνα, αφού οι καταχωρητές των επεξεργαστών και η shared μνήμη χωρίζεται ανάμεσα σε όλα τα νήματα των ενεργών μπλοκ. Εάν δεν υπάρχουν διαθέσιμοι αρκετοί καταχωρητές ή shared μνήμη ανά επεξεργαστή ώστε να επεξεργαστούν τουλάχιστον ένα μπλοκ, τότε η κλήση της συνάρτησης πυρήνα θα αποτύχει. 25

Εικόνα 4.3: Το μοντέλο του hardware 4.5.1 Memory Bandwidth Το αποτελεσματικό εύρος ζώνης κάθε κομματιού μνήμης εξαρτάται σημαντικά από το μοντέλο που χρησιμοποιούμε για να προσπελάσουμε τα δεδομένα. Αφού η device μνήμη είναι πολύ υψηλότερης καθυστέρησης και χαμηλότερου εύρους ζώνης από την on-chip μνήμη, οι προσπελάσεις από τη device μνήμη θα πρέπει να μειωθούν. Ένα τυπικό προγραμματιστικό μοντέλο είναι να τοποθετούμε τα δεδομένα που έρχονται από τη device μνήμη στη shared. Με άλλα λόγια, για κάθε μπλοκ νημάτων: 26

Φορτώνουμε τα δεδομένα από τη device στη shared memory, Συγχρονίζουμε όλα τα νήματα του μπλοκ μεταξύ τους έτσι ώστε κάθε νήμα να μπορεί ασφαλώς να διαβάσει τις περιοχές τις shared μνήμης οι οποίες εγγράφηκαν από άλλα νήματα του ίδιου μποκ, Επεξεργαζόμαστε τις πληροφορίες στη shared memory, Συγχρονίζουμε ξανά αν είναι απαραίτητο για να σιγουρευτούμε ότι η shared memory έχει ενημερωθεί με τα αποτελέσματα, Γράφουμε να αποτελέσματα πίσω στη device memory. 4.5.2 Global Memory Το κομμάτι της global μνήμης δεν έχει cache, οπότε είναι ακόμη πιο σημαντικό να ακολουθήσουμε το σωστό μοντέλο πρόσβασης για να πάρουμε το μέγιστι εύρος ζώνης, ειδικά έχοντας υπόψη το πόσο ακριβές είναι οι προσπελάσεις στη device memory. Το εύρος ζώνης της global μνήμης χρησιμοποιείται πιο αποτελεσματικά όταν ταυτόχρονες προσπελάσεις μνήμης από όλα τα νήματα σε ένα μισό warp (κατά τη διάρκεια της εκτέλεσης μιας εντολής ανάγνωσης ή εγγραφής) μπορούν να είναι ενωμένες (coalesced) σε μία μονή μεταφορά μνήμης των 32, 64, ή 128 bytes. 4.5.3 Coalescing σε κάρτες γραφικών με Υπολογιστική Ικανότητα 1.0 και 1.1 Η προσπέλαση της global μνήμης από όλα τα νήματα ενός μισού warp είναι ενωμένη (coalesced) σε μία ή δύο μεταφορές μνήμης αν ικανοποιεί τις ακόλουθες συνθήκες: Τα νήματα πρέπει να προσπελαύνουν Είτε λέξεις των 4 bytes, που έχουν ως αποτέλεσμα μία μεταφορά μνήμης των 64 byte, Είτε λέξεις των 8 bytes, που έχουν ως αποτέλεσμα μία μεταφορά μνήμης των 128 byte, Είτε λέξεις των 16 bytes, που έχουν ως αποτέλεσμα μία μεταφορά μνήμης των 128 byte, Όλες οι 16 λέξεις πρέπει να βρίσκονται στο ίδιο κομμάτι μεγέθους ίσου με το μέγεθος της μνήμης που μεταφέρεται (ή δύο φορές το μέγεθος της μνήμης που μεταφέρουμε όταν προσπελαύμνουμε λέξεις των 16 byte) Τα νήματα πρέπει να μεταφέρουν τις λέξεις στη σειρά: Τα κ-οστό νήμα στο μισό warp πρέπει να προσπελαύνει την κ-οστή λέξη. Αν ένα μισό warp δεν ικανοποιεί όλες τις παραπάνω απαιτήσεις, τότε μία ξεχωριστή μεταφορά μνήμης χρησιμοποιείται για κάθε νήμα και η απόδοση μειώνεται. 4.5.4 Coalescing σε κάρτες γραφικών με Υπολογιστική Ικανότητα 1.2 και Υψηλότερη Οι προσπελάσεις στη global μνήμη από όλα τα νήματα ενός μίσού warp είναι ενωμένες (coalesced) σε μία μονή μεταφορά μνήμης εφόσον οι λέξεις που προσπελαύνονται από όλα τα νήματα βρίσκονται στο ίδιο κομμάτι μεγέθους ίσο με: 32 bytes αν όλα τα νήματα προσπελαύνουν λέξεις μεγέθους 1 byte, 64 bytes αν όλα τα νήματα προσπελαύνουν λέξεις μεγέθους 2-byte, 27

128 bytes αν όλα τα νήματα προσπελαύνουν λέξεις μεγέθους 8-byte. Η ένωση (coalescing) επιτυγχάνεται για οποιοδήποτε σύνολο από διευθύνσεις ζητείται από το μισό warp, συμπεριλαμβανομένων συνόλων όπου πολλαπλά νήματα προσπελαύνουν την ίδια διεύθυνση. Αυτό έρχεται σε αντίθεση με τις κάρτες γραφικών χαμηλότερης υπολογιστικής δυνατότητας (compute capability) όπου τα νήματα χρειάζεται να προσπελαύνουν τις λέξεις σειριακά. Σε διευθύνσεις λέξεων του μισού warp που ανήκουν σε n διαφορετικά κομμάτια, χρειάζονται n μεταφορές μνήμης (μία για κάθε κομμάτι), ενώ οι κάρτες χαμηλότερης υπολογιστικής συνατότητας θα απαιτούσαν 16 μεταφορές εφόσον το n είναι μεγαλύτερο της μονάδας. Συγκεκριμένα, αν τα νήματα προσπελαύνουν λέξεις των 16 byte, απαιτούνται τουλάχιστον δύο μεταφορές μνήμης. 4.5.6 Local Memory Όπως και το κομμάτι της global μνήμης, ομοίως και η local μνήμη δεν έχει cache, άρα οι προσπελάσεις μνήμης στη local περιοχή είναι το ίδιο ακριβές με τις προσπελάσεις στη global περιοχή μνήμης. Οι προσπελάσεις ωστόσο στη local μνήμη είναι πάντα ενωμένες (coalesced) αφού είναι εξ ορισμού ανά νήμα. 4.5.7 Shared Memory Επειδή είναι on-chip, η shared μνήμη είναι πολύ γρηγορότερη από τη local και τη global μνήμη. Συγκεκριμένα για όλα τα νήματα ενός warp, η προσπέλαση της μνήμης shared είναι το ίδιο γρήγορη με την προσπέλαση ενός καταχωρητή εφόσον δεν υπάρχουν bank conflicts μεταξύ των νημάτων, όπως θα περιγραφούν στη συνέχεια. Για να επιτευχθεί υψηλό εύρος ζώνης, η shared μνήμη διαιρείται σε ισομεγέθεις υπομονάδες μνήμης, οι οποίες αποκαλούνται called banks και μπορούν να προσπελαστούν ταυτόχρονα. Έτσι κάθε αίτημα εγγραφής ή ανάγνωσης που αποτελείται από n διευθύνσεις που ανήκουν σε n διαφορετικές banks μπορούν να εξυπηρετηθούν ταυτόχρονα can be serviced simultaneously, αποδίδοντας ένα αποτελεσματικό εύρος ζώνης το οποίο είναι n φορές υψηλότερο από το εύρος ζώνης μίας υπομονάδας. Ωστόσο, αν δύο διευθύνσεις ενός αιτήματος μνήμης ανήκουν στην ίδια bank, τότε λέμε ότι υπάρχει bank conflict και η προσπέλαση πρέπει να γίνει σειριακά. Το hardware διαχωρίζει ένα αίτημα μνήμης με bank conflicts σε όσα ξεχωριστά, χωρίς συγκρούσεις αιτήματα είναι απαραίτητο, μειώνοντας με τον τρόπο αυτό το εύρος ζώνης κατά ένα παράγοντα ίσο με τον αριθμό των ξεχωριστών αιτημάτων μνήμης. Στην περίπτωση της shared μνήμης, οι banks είναι οργανωμένες έτσι ώστε διαδοχικές λέξεις των 32 bit ανατίθενται σε διαδοχικές banks και κάθε bank έχει εύρος ζώνης ίσο με 32 bits ανά δύο κύκλους ρολογιού. Για κάρτες με υπολογιστική δυνατότητα 1.x, το μέγεθος του warp είναι 32 και ο αριθμός των banks είναι 16. Ένα αίτημα για προσπέλαση στη shared μνήμη για ένα warp χωρίζεται σε ένα αίτημα για το πρώτο μισό του warp και ένα αίτημα για το δεύτερο μισό του warp. Ως συνέπεια, δε μπορεί να υπάρξει bank conflict ανάμεσα σε ένα νήμα που ανήκει στο πρώτο μισό warp και ένα νήμα που ανήκει στο δεύτερο μισό του ίδιου warp. 28

Εικόνα 4.4: Μοντέλα προσπέλασης της shared μνήμης χωρίς bank conflicts Αριστερά: Γραμμική προσπέλαση με βήμα 32 bits. Δεξιά: Τυχαίος συνδυασμός. 29

Εικόνα 4.5: Μοντέλα προσπέλασης της shared μνήμης με bank conflicts 4.5.8 Texture Memory Τα texture κομμάτια μνήμης μπορούν να μπουν σε μία cache, την texture cache. Έτσι μία προσπέλαση της texture μνήμης κοστίζει όσο μία ανάγνωση από τη device μνήμη μόνο σε περίπτωση αστοχίας της cache, αλλιώς κοστίζει όσο ένα διάβασμα από την texture cache. Η texture cache είναι βέλτιστη για δισδιάστατες περιοχές μνήμης, έτσι ώστε τα νήματα που 30

ανήκουν στο ίδιο warp (32 νήματα) που διαβάζουν διευθύνσεις της texture μνήμης οι οποίες βρίσκονται κοντά μεταξύ τους θα πετύχουν καλύτερη απόδοση. 4.5.9 Constant Memory Μία ακόμη read-only μνήμη που είναι προσπελάσιμη από όλα τα νήματα είναι η constant μνήμη. Η μνήμη αυτή έχει επίσης μία cache έτσι ώστε ένα διάβασμα από την constant μνήμη να κοστίζει όσο ένα διάβασμα από τη device μνήμη μόνο σε περίπτωση αστοχίας της cache, αλλιώς κοστίζει όσο ένα διάβασμα από την constant cache. Για όλα τα νήματα ενός μισού warp (16 νήματα), το να διαβάσουν από την constant cache είναι το ίδιο γρήγορο όπως αν διάβαζαν από έναν καταχωρητή εφόσον όλα τα νήματα διαβάζουν την ίδια θέση μνήμης. 4.5.10 Registers (Καταχωρητές) Γενικά, η προσπέλαση ενός καταχωρητή δεν προσθέτει κανέναν επιπλέον κύκλο ρολογιού ανά εντολή, αλλά καθυστέρηση μπορεί να εμφανιστεί εξαιτίας εξαρτήσεων αναγνώσεων μετά από εγγραφές και bank conflicts στη μνήμη των καταχωρητών. Οι καθυστερήσεις που εισάγονται από εξαρτήσεις αναγνώσεων μετά από εγγραφές μπορούν να αγνοηθούν καθώς υπάρχουν τουλάχιστον 192 ενεργά νήματα ανά επεξεργαστή για να τις κρύψουν. Ο μεταφραστής και ο χρονοδρομολογητής νημάτων, οργανώνουν τις εντολές όσο πιο ευνοϊκά γίνεται ώστε να αποφευχθούν τα bank conflicts στη μνήμη των καταχωρητών. Πετυχαίνουν βέλτιστο αποτέλεσμα όταν ο αριθμός των νημάτων ανά μπλοκ είναι πολλαπλάσιο του 64. [12] 4.5.11 Page-Locked Host Memory Το σύστημα επιπλέον παρέχει συναρτήσεις για τη δέσμευση και αποδέσμευση μίας μνήμης που ονομάζεται free page-locked (γνωστή επίσης και ως pinned) host μνήμη. Η χρήση της μνήμης αυτής προσφέρει διάφορα πλεονεκτήματα: Το εύρος ζώνης μεταξύ μνήμης host και device είναι μεγαλύτερο εάν έχει δεσμευθεί σαν as page-locked. Οι αντιγραφές μεταξύ της page-locked host μνήμης and device μνήμης μπορούν να πραγματοποιηθούν ταυτόχρονα με την εκτέλεση συναρτήσεων πυρήνα (kernels) για κάποιες κάρτες γραφικών, όπως θα δούμε και στη συνέχεια. Σε κάποιες κάρτες γραφικών, η page-locked host μνήμη μπορεί να γίνει map στο χώρο διευθύνσεων της device μνήμης, εξαλείφοντας έτσι την ανάγκη για αντιγραφή στη device ή από τη device μνήμη. Παρ όλα αυτά, η page-locked host μνήμη είναι μία σπάνια πηγή, οπότε οι δεσμεύσεις θα αρχίσουν να αποτυγχάνουν πολύ νωρίτερα από τις δεσμεύσεις στην pageable μνήμη. Επιπροσθέτως, μειώνοντας την ποσότητα της φυσικής μνήμης που έχει διαθέσιμη το λειτουργικό σύστημα για paging, με τη δέσμευση μεγάλου μέρους από την page-locked μνήμη, μειώνουμε την απόδοση όλου του συστήματος. 4.5.12 Ασύγχρονη Παράλληλη Εκτέλεση Για να διευκολύνουν την παράλληλη εκτέλεση μεταξύ host και device, κάποιες συναρτήσεις είναι ασύγχρονες. Ο έλεγχος επιστρέφεται στο νήμα του host πριν να έχει ολοκληρωθεί η αιτούμενη 31