ΠΑΝΕΠΙΣΤΗΜΙΟ ΠΑΤΡΩΝ, ΠΟΛΥΤΕΧΝΙΚΗ ΣΧΟΛΗ ΤΜΗΜΑ ΜΗΧΑΝΙΚΩΝ ΗΛΕΚΤΡΟΝΙΚΩΝ ΥΠΟΛΟΓΙΣΤΩΝ ΚΑΙ ΠΛΗΡΟΦΟΡΙΚΗΣ ΔΙΠΛΩΜΑΤΙΚΗ ΕΡΓΑΣΙΑ. Νάκος Αλέξανδρος Α.Μ.

Σχετικά έγγραφα
ΕΘΝΙΚΟ ΜΕΤΣΟΒΙΟ ΠΟΛΥΤΕΧΝΕΙΟ

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

ΚΕΦΑΛΑΙΟ 5. Κύκλος Ζωής Εφαρμογών ΕΝΟΤΗΤΑ 2. Εφαρμογές Πληροφορικής. Διδακτικές ενότητες 5.1 Πρόβλημα και υπολογιστής 5.2 Ανάπτυξη εφαρμογών

Συνήθεις διαφορικές εξισώσεις προβλήματα οριακών τιμών

Εφαρμοσμένα Μαθηματικά ΙΙ

Matrix Algorithms. Παρουσίαση στα πλαίσια του μαθήματος «Παράλληλοι. Αλγόριθμοι» Γ. Καούρη Β. Μήτσου

QR είναι ˆx τότε x ˆx. 10 ρ. Ποιά είναι η τιµή του ρ και γιατί (σύντοµη εξήγηση). P = [X. 0, X,..., X. (n 1), X. n] a(n + 1 : 1 : 1)

Πιο συγκεκριμένα, η χρήση του MATLAB προσφέρει τα ακόλουθα πλεονεκτήματα.

Matrix Algorithms. Παρουσίαση στα πλαίσια του μαθήματος «Παράλληλοι Αλγόριθμοι» Γ. Καούρη Β. Μήτσου

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

Γραµµική Αλγεβρα. Ενότητα 2 : Επίλυση Γραµµικών Εξισώσεων. Ευστράτιος Γαλλόπουλος Τµήµα Μηχανικών Η/Υ & Πληροφορικής

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

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

ΓΡΑΜΜΙΚΗ ΑΛΓΕΒΡΑ (Εξ. Ιουνίου - 02/07/08) ΕΠΙΛΕΓΜΕΝΕΣ ΑΠΑΝΤΗΣΕΙΣ

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

Επιστημονικοί Υπολογισμοί (ή Υπολογιστική Επιστήμη)

i Throughput: Ο ρυθμός ολοκλήρωσης έργου σε συγκεκριμένο χρόνο

Προβλήματα, αλγόριθμοι, ψευδοκώδικας

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

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

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

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

5 ΕΙΣΑΓΩΓΗ ΣΤΗ ΘΕΩΡΙΑ ΑΛΓΟΡΙΘΜΩΝ

Μετρικές & Επιδόσεις. Κεφάλαιο V

Τεχνικές σχεδίασης προγραμμάτων, Προγραμματιστικά Περιβάλλοντα

Εισαγωγή στην Αριθμητική Ανάλυση

Παναγιώτης Ψαρράκος Αν. Καθηγητής

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

Μικροεπεξεργαστές. Σημειώσεις Μαθήματος Υπεύθυνος: Δρ Άρης Παπακώστας,

Γραµµική Αλγεβρα. Ενότητα 3 : ιανυσµατικοί Χώροι και Υπόχωροι. Ευστράτιος Γαλλόπουλος Τµήµα Μηχανικών Η/Υ & Πληροφορικής

Περιεχόμενα. Πρόλογος 3

ΑΕΠΠ Ερωτήσεις θεωρίας

4. Συντακτικό μιας γλώσσας είναι το σύνολο των κανόνων που ορίζει τις μορφές με τις οποίες μια λέξη είναι αποδεκτή.

Α Ν Α Λ Τ Η Α Λ Γ Ο Ρ Ι Θ Μ Ω Ν Κ Ε Υ Α Λ Α Ι Ο 5. Πως υπολογίζεται ο χρόνος εκτέλεσης ενός αλγορίθμου;

I. ΜΙΓΑΔΙΚΟΙ ΑΡΙΘΜΟΙ. math-gr

4.4 Μετατροπή από μία μορφή δομής επανάληψης σε μία άλλη.

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

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

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

Επίλυση Γραµµικών Συστηµάτων

Παραδείγματα Ιδιοτιμές Ιδιοδιανύσματα

Αλγόριθμος. Αλγόριθμο ονομάζουμε τη σαφή και ακριβή περιγραφή μιας σειράς ξεχωριστών οδηγιών βημάτων με σκοπό την επίλυση ενός προβλήματος.

Αριθμητική Ανάλυση και Εφαρμογές

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

ΠΑΝΕΠΙΣΤΗΜΙΟ ΘΕΣΣΑΛΙΑΣ ΤΜΗΜΑ ΠΟΛΙΤΙΚΩΝ ΜΗΧΑΝΙΚΩΝ ΤΟΜΕΑΣ ΥΔΡΑΥΛΙΚΗΣ ΚΑΙ ΠΕΡΙΒΑΛΛΟΝΤΙΚΗΣ ΤΕΧΝΙΚΗΣ. Διάλεξη 3: Περιγραφή αριθμητικών μεθόδων (συνέχεια)

Αριθμητική Ανάλυση και Εφαρμογές

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

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

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

Ερωτήσεις πολλαπλής επιλογής - Κεφάλαιο 2. Α1. Ο αλγόριθμος είναι απαραίτητος μόνο για την επίλυση προβλημάτων πληροφορικής

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

J-GANNO. Σύντοµη αναφορά στους κύριους στόχους σχεδίασης και τα βασικά χαρακτηριστικά του πακέτου (προέκδοση 0.9Β, Φεβ.1998) Χάρης Γεωργίου

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

Γραμμική Άλγεβρα και Μαθηματικός Λογισμός για Οικονομικά και Επιχειρησιακά Προβλήματα

ΟΜΑΔΑ Ε ΓΕΩΡΓΙΟΥ ΦΩΤΕΙΝΗ ΗΛΙΟΥΔΗ ΑΦΡΟΔΙΤΗ ΜΕΤΑΛΛΙΔΟΥ ΧΡΥΣΗ ΝΙΖΑΜΗΣ ΑΛΕΞΑΝΔΡΟΣ ΤΖΗΚΑΛΑΓΙΑΣ ΑΝΔΡΕΑΣ ΤΡΙΓΚΑΣ ΑΓΓΕΛΟΣ

ΤΕΤΥ Εφαρμοσμένα Μαθηματικά 1. Τελεστές και πίνακες. 1. Τελεστές και πίνακες Γενικά. Τι είναι συνάρτηση? Απεικόνιση ενός αριθμού σε έναν άλλο.

Κεφ. 2: Επίλυση συστημάτων εξισώσεων. 2.1 Επίλυση εξισώσεων

Επιστηµονικός Υπολογισµός Ι

FORTRAN και Αντικειμενοστραφής Προγραμματισμός

ΕΝΙΑΙΟ ΠΛΑΙΣΙΟ ΠΡΟΓΡΑΜΜΑΤΟΣ ΣΠΟΥΔΩΝ

Αριθμητική Ανάλυση και Εφαρμογές

Κεφάλαιο 2.3: Προγραμματισμός. Επιστήμη ΗΥ Κεφ. 2.3 Καραμαούνας Πολύκαρπος

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

WIRELESS SENSOR NETWORKS (WSN)

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

Αριθμητική Ανάλυση & Εφαρμογές

Q 12. c 3 Q 23. h 12 + h 23 + h 31 = 0 (6)

Παραδείγματα Απαλοιφή Gauss Απαλοιφή Gauss-Jordan Παραγοντοποίηση LU, LDU

Ειδικά θέματα Αλγορίθμων και Δομών Δεδομένων (ΠΛΕ073) Απαντήσεις 1 ου Σετ Ασκήσεων

Ιδιάζουσες τιμές πίνακα. y έχουμε αντίστοιχα τις σχέσεις : Αυτές οι παρατηρήσεις συμβάλλουν στην παραγοντοποίηση ενός πίνακα

Ενδεικτικές Ερωτήσεις Θεωρίας

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

Η ΜΕΘΟΔΟΣ PCA (Principle Component Analysis)

Ψευδοκώδικας. November 7, 2011

ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΣ Η/Υ Ακαδημαϊκό έτος ΤΕΤΡΑΔΙΟ ΕΡΓΑΣΤΗΡΙΟΥ #2

Επιστημονικοί Υπολογισμοί - Μέρος ΙΙΙ: Παράλληλοι Υπολογισμοί

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

Εισαγωγή στην επιστήμη των υπολογιστών

Βασίλειος Μαχαιράς Πολιτικός Μηχανικός Ph.D.

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

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

Δομές Ακολουθίας- Επιλογής - Επανάληψης. Δομημένος Προγραμματισμός

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

Αριθμητική εύρεση ριζών μη γραμμικών εξισώσεων

Εισαγωγή στην Επιστήμη των Υπολογιστών

Εισαγωγή Στις Αρχές Της Επιστήμης Των Η/Υ. Η έννοια του Προβλήματος - ΚΕΦΑΛΑΙΟ 2

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

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

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

ΜΑΣ 371: Αριθμητική Ανάλυση ΙI ΑΣΚΗΣΕΙΣ. 1. Να βρεθεί το πολυώνυμο Lagrange για τα σημεία (0, 1), (1, 2) και (4, 2).

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

ΜΕΜ251 Αριθμητική Ανάλυση

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

ΟΜΑΔΕΣ ΕΝΤΟΛΩΝ: ΙΔΙΟΤΗΤΕΣ ΚΑΙ ΛΕΙΤΟΥΡΓΙΕΣ

Γραµµική Αλγεβρα. Ενότητα 2 : Επίλυση Γραµµικών Εξισώσεων. Ευστράτιος Γαλλόπουλος Τµήµα Μηχανικών Η/Υ & Πληροφορικής

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

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

Κεφ. 2: Επίλυση συστημάτων αλγεβρικών εξισώσεων. 2.1 Επίλυση απλών εξισώσεων

Διάλεξη 04: Παραδείγματα Ανάλυσης

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

Transcript:

ΠΑΝΕΠΙΣΤΗΜΙΟ ΠΑΤΡΩΝ, ΠΟΛΥΤΕΧΝΙΚΗ ΣΧΟΛΗ ΤΜΗΜΑ ΜΗΧΑΝΙΚΩΝ ΗΛΕΚΤΡΟΝΙΚΩΝ ΥΠΟΛΟΓΙΣΤΩΝ ΚΑΙ ΠΛΗΡΟΦΟΡΙΚΗΣ ΔΙΠΛΩΜΑΤΙΚΗ ΕΡΓΑΣΙΑ Νάκος Αλέξανδρος Α.Μ.: 4502 Τριδιαγώνιοι Επιλυτές για συνεπεξεργαστές: Προσαρμόζοντας τον g-spike από CUDA για GPU σε OpenMP για τον πολυπύρηνο Intel Xeon Phi Επιβλέπων Καθηγητής, Ευστράτιος Γαλλόπουλος Συνεπιβλέπων Δρ. Ιωάννης Βενέτης Συνεξεταστής Καθηγητής, Χρήστος Κακλαμάνης Τμήμα Μηχανικών Η/Υ & Πληροφορικής Πανεπιστήμιο Πατρών Ιούνιος 2016

Ευχαριστίες Με την ολοκλήρωση της Διπλωματικής Εργασίας μου θα ήθελα να ευχαριστήσω την ομάδα του HPCLab του Πανεπιστημίου Πατρών, στην οποία είχα το προνόμιο να ανήκω. Ιδιαίτερα θα ήθελα να ευχαριστήσω τον επιβλέποντα καθηγητή μου Ευστράτιο Γαλλόπουλο, που μου έδωσε την ευκαιρία να συμμετάσχω σε δημοσιεύσεις και δραστηριότητες των μελών του εργαστηρίου HPCLab και πάνω από όλα για την υπομονετική και πολύτιμη βοήθεια και υποδείξεις του πάνω στην συγγραφή του τελικού κειμένου. Ακόμα θα ήθελα να ευχαριστήσω τους Δρ. Ιωάννη Βενέτη, Αλέξανδρο Κουρή και Νίκο Νικολουτσάκο για την συνεργασία μας τόσο στην εργασία [26], που αποτέλεσε και προσωπικό έναυσμα για την Διπλωματική Εργασία αυτή, όσο και στο φοιτητικό διαγωνισμό του συνεδρίου HiPC 2015, καθώς μέσω αυτών εξοικειώθηκα με το υπολογιστικό σύστημα Intel Xeon Phi που αφορά την παρούσα εργασία. Τέλος θα ήθελα να ευχαριστήσω την οικογένεια μου για την υποστήριξη τους καθ όλη την διάρκεια της ζωής μου και τον αδερφικό μου φίλο Αλέξανδρο Παπαδάκη, που αποτέλεσε εκτός των άλλων και αφορμή να επιλέξω τον καθηγητή Ευστράτιο Γαλλόπουλο ως επιβλέποντα της Διπλωματικής Εργασίας μου. Νάκος Αλέξανδρος Πάτρα, 2016 ~ 2 ~

Περίληψη Στην εργασία μελετάται η αποδοτική υλοποίηση αλγορίθμου για την επίλυση γενικών τριδιαγώνιων γραμμικών συστημάτων σε συνεπεξεργαστή Intel Xeon Phi. Το ενδιαφέρον για το ζήτημα αυτό οφείλεται στο ότι πολλές επιστημονικές εφαρμογές, καθώς και σύνθετοι υπολογιστικοί πυρήνες όπως ο υπολογισμός ιδιοτιμών, απαιτούν χρήση τριδιαγώνιων επιλυτών οι οποίοι θα πρέπει να παρέχουν αξιόπιστα αποτελέσματα και να εκμεταλλεύονται αποδοτικά την αρχιτεκτονική του εκάστοτε παράλληλου συστήματος. Η χρήση συνεπεξεργαστών στο High Performance Computing (HPC) έχει πλέον εδραιωθεί και σχεδόν κάθε νέο υπερυπολογιστικό σύστημα στηρίζεται στην μεγάλη επεξεργαστική τους ισχύ καθώς και στα ενεργειακά τους πλεονεκτήματα σε σύγκριση με τις κλασικές κεντρικές μονάδες επεξεργασίας. Οι συνεπεξεργαστές αναμένεται να αποτελέσουν τον «ακρογωνιαίο λίθο» των υπερυπολογιστικών συστημάτων για τα επόμενα χρόνια και συνεπώς η ανάπτυξη λογισμικού για την αποδοτική χρήση τους αποτελεί ίσως μια από τις πιο σημαντικές προκλήσεις στον χώρο του HPC. Τόσο ο Intel Xeon Phi όσο και οι Μονάδες Επεξεργασίας Γραφικών (Graphics Processing Units ή GPUs) ανήκουν στις many-core αρχιτεκτονικές, οι οποίες παρέχουν μεγάλο πλήθος υπολογιστικών νημάτων στο επίπεδο υλικού. Για την επίτευξη υψηλής επίδοσης σε αυτές τις αρχιτεκτονικές απαιτείται προσεκτική επιλογή αλγορίθμου και ανάπτυξη λογισμικού, που να λαμβάνει υπόψη όλες τις δυνατότητες αλλά και τους περιορισμούς τις εκάστοτε αρχιτεκτονικής. Στην εργασία παρουσιάζεται λεπτομερώς ο αλγόριθμος g-spike για την επίλυση γενικών τριδιαγώνιων γραμμικών συστημάτων, καθώς επίσης και περιγραφή της υλοποίησης του αλγορίθμου για τον Intel Xeon Phi με στόχο την εξαγωγή συμπερασμάτων σχετικά με τις δυνατότητες αποδοτικής αξιοποίησης του νέου αυτού υπολογιστικού συστήματος για ένα σημαντικό γραμμοαλγεβρικό υπολογισμό που μπορεί να αποτελέσει πυρήνα πολλών εφαρμογών. Καθότι η εργασία αφορά αναπροσαρμογή υλοποίησης του g-spike σε CUDA για GPUs σε υλοποίηση για τον Intel Xeon Phi με χρήση OpenMP, θα παρουσιαστεί ακόμα το προγραμματιστικό μοντέλο CUDA της NVIDIA καθώς και οι ομοιότητες και διαφορές στις προσεγγίσεις των αντίστοιχων υλοποιήσεων του αλγορίθμου. Τέλος θα παρουσιαστούν αξιολογήσεις των πειραματικών δεδομένων για παραλλαγές της υλοποίησης για τον Intel Xeon Phi, καθώς και συγκρίσεις των υλοποιήσεων αυτών με υπάρχοντες επιλυτές. ~ 3 ~

Περιεχόμενα 1 ΕΙΣΑΓΩΓΗ... 5 1.1 ΠΕΡΑΙΤΕΡΩ ΕΡΓΑΣΙΕΣ... 8 2 Ο ΑΛΓΟΡΙΘΜΟΣ G-SPIKE... 9 2.1 ΓΕΝΙΚΗ ΠΕΡΙΓΡΑΦΗ... 9 2.2 ΠΡΟΕΠΕΞΕΡΓΑΣΙΑ... 10 2.3 ΠΑΡΑΓΟΝΤΟΠΟΙΗΣΗ... 10 2.3.1 Περιστροφές Givens... 11 2.3.2 Βήμα [i] - Τριγωνοποίηση διαγώνιων πλοκάδων... 11 2.3.3 Βήμα [ii] - Ανάκτηση Πλήρους Τάξης... 12 2.3.4 Βήμα [iii] - Δημιουργία των Spikes... 13 2.4 ΜΕΤΕΠΕΞΕΡΓΑΣΙΑ... 15 2.5 ΑΛΓΟΡΙΘΜΙΚΗ ΠΕΡΙΓΡΑΦΗ... 17 3 ΑΡΧΙΤΕΚΤΟΝΙΚΗ XEON PHI... 18 4 XEON PHI ΚΑΙ GPU: ΣΥΓΚΡΙΣΕΙΣ ΚΑΙ ΠΑΡΑΤΗΡΗΣΕΙΣ... 23 4.1 ΠΡΟΓΡΑΜΜΑΤΙΣΤΙΚΑ ΜΟΝΤΕΛΑ... 24 5 ΑΝΑΛΥΣΗ ΤΗΣ ΥΛΟΠΟΙΗΣΗΣ ΓΙΑ ΤΟΝ XEON PHI... 29 5.1 ΑΠΑΙΤΗΣΕΙΣ ΜΝΗΜΗΣ... 30 5.2 ΤΜΗΜΑΤΟΠΟΙΗΣΗ ΤΟΥ ΣΥΣΤΗΜΑΤΟΣ... 31 5.3 ΑΝΑΔΙΑΤΑΞΗ ΤΩΝ ΔΕΔΟΜΕΝΩΝ ΤΟΥ ΣΥΣΤΗΜΑΤΟΣ... 32 5.4 ΠΑΡΑΓΟΝΤΟΠΟΙΗΣΗ... 33 5.4.1 Βήμα [i] - Τριγωνοποίηση διαγώνιων πλοκάδων... 33 5.4.2 Βήμα [ii] - Ανάκτηση πλήρους τάξης... 34 5.4.3 Βήμα [iii] - Δημιουργία των Spikes... 34 5.5 ΜΕΤΕΠΕΞΕΡΓΑΣΙΑ... 35 6 ΠΕΙΡΑΜΑΤΙΚΑ ΑΠΟΤΕΛΕΣΜΑΤΑ... 36 6.1 ΑΡΙΘΜΗΤΙΚΗ ΕΥΣΤΑΘΕΙΑ ΥΛΟΠΟΙΗΣΗΣ... 36 6.2 ΣΥΓΚΡΙΣΗ ΜΕΤΑΞΥ ΤΩΝ G-SPIKE ΥΛΟΠΟΙΗΣΕΩΝ ΓΙΑ ΤΟΝ XEON PHI... 37 6.3 ΠΕΡΙΠΤΩΣΗ ΙΔΙΑΖΟΥΣΩΝ ΠΛΟΚΑΔΩΝ... 40 6.4 ΚΛΙΜΑΚΟΣΙΜΟΤΗΤΑ ΥΛΟΠΟΙΗΣΗΣ... 41 6.5 ΣΥΓΚΡΙΣΗ ΜΕΤΑΞΥ ΤΟΥ G-SPIKE ΚΑΙ ΔΙΑΘΕΣΙΜΩΝ ΥΛΟΠΟΙΗΣΕΩΝ... 44 6.6 ΥΛΟΠΟΙΗΣΗ ΤΟΥ G-SPIKE ΓΙΑ ΠΟΛΛΑΠΛΑ ΔΕΞΙΑ ΜΕΛΗ... 46 7 ΣΥΜΠΕΡΑΣΜΑΤΑ... 48 ~ 4 ~

1 Εισαγωγή Ο τομέας της έρευνας και ανάπτυξης λογισμικού υψηλών επιδόσεων (High Performance Computing) προσελκύει το ενδιαφέρον πολλών ερευνητών και επιστημόνων καθώς υπάρχει μια συνεχής και αδήριτη ανάγκη για την επίλυση ολοένα μεγαλύτερων και περιπλοκότερων προβλημάτων με τη χρήση ηλεκτρονικού υπολογιστή. Κατά συνέπεια, απαιτείται ολοένα και μεγαλύτερη υπολογιστική ισχύς, κάτι που ωθεί επιλεγμένες εταιρίες Η/Υ να σχεδιάζουν και να αναπτύσσουν νέα συστήματα «υπερυπολογιστών». Παρόλες τις προόδους στην ανάπτυξη λογισμικού «φιλικού προς τον χρήστη» τα υπερυπολογιστικά συστήματα εξακολουθούν και δυσκολεύουν τους χρήστες. Αυτά τα συστήματα απαιτούν σημαντική προσπάθεια και εμπειρία στην ανάπτυξη λογισμικού που να αξιοποιεί στο μεγαλύτερο βαθμό τις δυνατότητες τους. Η συγγραφή τέτοιου λογισμικού απαιτεί καλή γνώση της εκάστοτε αρχιτεκτονικής του υλικού και τη σωστή επιλογή αλγορίθμου βάσει των αναγκών της εφαρμογής που υλοποιείται. Ένα σημαντικό συστατικό των σύγχρονων υπερυπολογιστικών συστημάτων είναι οι συνεπεξεργαστές (coprocessors). Πρόκειται για συστήματα με ιστορία εξέλιξης πολλών ετών που έχουν σαν στόχο να συμπληρώσουν τις δυνατότητες της κεντρικής επεξεργαστικής μονάδας. Για παράδειγμα, η ιδέα της χρήσης «μονάδων ειδικού σκοπού» (special purpose units) και «συνδεδεμένων επεξεργαστών» (attached processors) για εξειδικευμένους ταχείς υπολογισμούς είναι παλιά. Δείτε για παράδειγμα το βιβλίο [17]. Οι δυνατότητες που προσφέρουν σε ένα σύστημα, συμπληρώνοντας αυτές μιας κεντρικής μονάδας επεξεργασίας, είναι ουσιαστικά η μεγάλη επιτάχυνση εκτέλεσης κώδικα, κάτι το οποίο επιτυγχάνουν μέσω της υψηλής παραλληλίας σε επίπεδο αρχιτεκτονικής. Η χρήση συνεπεξεργαστών είναι ευρέως διαδεδομένη σήμερα, είτε αυτό αφορά μεγάλα υπερυπολογιστικά συστήματα είτε την επιτάχυνση εκτέλεσης χρονοβόρων υπολογιστικών πυρήνων σε ένα καθημερινό ηλεκτρονικό υπολογιστή, π.χ. για την επεξεργασία γραφικών. Η αρχιτεκτονική των σύγχρονων συνεπεξεργαστών είναι η λεγόμενη many-core αρχιτεκτονική γιατί σε αντίθεση με τις multi-core αρχιτεκτονικές, που βρίσκουμε σε μια σύγχρονη CPU, ο αριθμός των πυρήνων ξεπερνά κατά πολύ τους 4 ή 6 (π.χ. ο Intel Xeon E7-8893 v4 [15]) και μπορεί να φτάσει τις μερικές χιλιάδες (π.χ. η NVIDIA Tesla K40 [16]). Αυτό έχει ως συνέπεια το ότι για την αξιοποίηση τους απαιτείται η χρήση κώδικα που είναι παραλληλοποιήσιμος σε πολύ μεγαλύτερο βαθμό από τους κώδικες που μπορούν να εκτελεστούν αποδοτικά σε multi-core τοπικά συστήματα, καθώς η χρήση είτε σειριακού είτε κώδικα που δεν μπορεί να παραλληλοποιηθεί αποδοτικά θα απέδιδε χειρότερα από ότι σε μία CPU. Τα περισσότερα υπερυπολογιστικά συστήματα βασίζονται σε μεγάλο βαθμό τόσο στην επεξεργαστική ισχύ, όσο και στο γεγονός ότι έχουν σχετικά χαμηλή κατανάλωση ενέργειας. Στο χώρο των συνεπεξεργαστών έχουν επικρατήσει οι μονάδες επεξεργασίας γραφικών (GPUs) και κυρίως η NVIDIA (εφεξής απλά NVIDIA) με την προγραμματιστική διεπαφή CUDA. Παρόλα αυτά το 2010 η Intel έδωσε την δική της απάντηση με τον συνεπεξεργαστή Intel Xeon Phi (χάριν συντομίας θα αναφέρεται εφεξής ως «Xeon Phi») ο οποίος είχε τελείως διαφορετική προσέγγιση στην αρχιτεκτονική του και συνεπώς και στο προγραμματιστικό του μοντέλο. Καθώς κοινό στοιχείο των συνεπεξεργαστών για την αποδοτική τους χρήση αποτελεί η ανάγκη ο κώδικας προς εκτέλεση να προσφέρει δυνατότητες εκτεταμένης παραλληλοποίησης, ο προγραμματιστής θα πρέπει να είναι ~ 5 ~

προσεκτικός τόσο κατά την επιλογή κατάλληλου αλγορίθμου όσο και κατά την υλοποίηση του αλγορίθμου αυτού για την εκάστοτε αρχιτεκτονική. Στον τομέα της ανάπτυξης λογισμικού υψηλών επιδόσεων, ζωτικής σημασίας είναι η χρήση αποδοτικών υπολογιστικών πυρήνων. Μια σημαντική κατηγορία αυτών είναι κώδικες που υλοποιούν γραμμοαλγεβρικές πράξεις, από τις πιο στοιχειώδεις (όπως αυτοί των διαφόρων υλοποιήσεων του API BLAS) ως και ποιο σύνθετες (όπως των βιβλιοθηκών LAPACK, ScaLAPACK [1], Elemental [19], PETSc [24] και Trilinos [25]). Για αυτό και άλλωστε για κάθε νέα τεχνολογική ανάπτυξη στον τομέα υλικού συχνά απαιτείται αναπροσαρμογή ή και ανάπτυξη νέας βιβλιοθήκης λογισμικού για την όσο πιο αποδοτική εκτέλεση τέτοιων πράξεων. Στην κατηγορία αυτή ανήκουν και οι επιλυτές γραμμικών συστημάτων. Μια σημαντική κατηγορία αυτών των επιλυτών είναι οι «επιλυτές ζώνης» (banded solvers) και ειδική περίπτωση αυτών είναι οι «τριδιαγώνιοι επιλυτές», δηλαδή αλγόριθμοι και υλοποιήσεις τους για την επίλυση γραμμικών συστημάτων όπου το μητρώο των συντελεστών του συστήματος έχει τριδιαγώνια μορφή. Για την επίλυση συστημάτων ζώνης σε πολυπύρηνες αρχιτεκτονικές, ειδική περίπτωση των οποίων αποτελούν τα τριδιαγώνια συστήματα, έχει προταθεί ο αλγόριθμος Spike (βλέπε [2,6]). Ο αλγόριθμος διαμοιράζει τον υπολογιστικό φόρτο που απαιτείται για την επίλυση του συστήματος σε υπολογιστικές μονάδες οι οποίες θα λειτουργούν αυτόνομα. Περιγράφεται σε υψηλό αφαιρετικό επίπεδο, ορίζοντας 2 στάδια εκτέλεσης τα οποία είναι αυτόνομα και μπορούν να υλοποιηθούν με διαφορετικούς τρόπους. Έτσι μπορούμε να τα προσαρμόσουμε κάθε φορά, τόσο με βάση την καλύτερη αξιοποίηση της αρχιτεκτονικής του υπολογιστικού συστήματος όσο και με βάση τα χαρακτηριστικά του προβλήματος που εμείς θέλουμε να λύσουμε. Οι τριδιαγώνιοι επιλυτές χρησιμοποιούνται σε πολλούς αλγορίθμους και επιστημονικές εφαρμογές (βλέπε [23] σελ. 126-159), καθώς υπάρχουν πολλές περιπτώσεις τριδιαγώνιων συστημάτων όσο και περιπτώσεις όπου το μητρώο είναι σχεδόν τριδιαγώνιο και η λύση μπορεί να υπολογιστεί, μετά από κατάλληλη αναδιαμόρφωση του, βάσει επαναληπτικών κλήσεων σε τριδιαγώνιο επιλυτή και επιμέρους διορθώσεων. Σε πολλές περιπτώσεις τα μητρώα αυτά έχουν ιδιότητες όπως είναι η διαγώνια κυριαρχία ή συμμετρία και θετική ορισιμότητα, κάτι που επιτρέπει την χρήση ακόμα πιο εξειδικευμένων αλγορίθμων οι οποίοι αξιοποιούν τις ιδιότητες αυτές τόσο για την ταχύτερη επίλυση των συστημάτων όσο και για την βελτιστοποίηση του σφάλματος της επίλυσης (βλέπε π.χ. τις σχετικές αναφορές στις μεθόδους Cyclic Reduction, Recursive Doubling και παραλλαγές τους στο κεφάλαιο 3 του [6]). Στη διπλωματική αυτή μας ενδιαφέρει η επίλυση γενικών τριδιαγώνιων συστημάτων, για τα οποία δεν μπορούμε εκ των προτέρων να υποθέσουμε κάποιες από τις παραπάνω ιδιότητες που επιτρέπουν τη χρήση πιο εξειδικευμένων επιλυτών 1. Εμείς συγκεκριμένα θα ασχοληθούμε με επιλυτή γενικού τριδιαγώνιου συστήματος. Το ενδιαφέρον μας για το θέμα ξεκίνησε με αφορμή την εργασία [11] η οποία αφορά την υλοποίηση γενικού τριδιαγώνιου επιλυτή για GPUs. Ο αλγόριθμος που χρησιμοποιήθηκε είχε «Spike-like» χαρακτηριστικά, χώριζε επομένως το σύστημα σε πλοκάδες τις οποίες επίλυε αυτόνομα. Το πρόβλημα του αλγορίθμου είναι πως εφόσον η τμηματοποίηση δεν λαμβάνει υπόψη τα χαρακτηριστικά κάθε υπομητρώου επί της διαγωνίου, κάποιο από αυτά θα μπορούσε να είναι ιδιάζον και η μέθοδος να αστοχήσει. Αυτό αποτέλεσε έμπνευση για την δουλειά που έγινε στην εργασία [7] και η οποία στην συνέχεια αποτέλεσε εφαλτήριο για την εργασία 1 Για να είμαστε ακριβείς, στον επιλυτή που παρουσιάζουμε θα θεωρήσουμε ότι το τριδιαγώνιο μητρώο είναι μη αναγώγιμο (irreducible). Η υπόθεση αυτή όμως είναι διαφορετικού τύπου καθώς απαιτεί μόνον έναν εύκολο έλεγχο και σε περίπτωση που το μητρώο αποδειχθεί αναγώγιμο, μίαν εύκολη προσαρμογή του επιλυτή. ~ 6 ~

[26] η οποία παρουσιάστηκε στο συνέδριο ParCo 2015 [27]. Η συμμετοχή μου στην εργασία [26], αποτέλεσε προσωπικό έναυσμα αρκετών από των ιδεών που παρουσιάζονται στα κεφάλαια 4 και 5, που αφορούν το κομμάτι της υλοποίησης. Η παρούσα διπλωματική, με βάση το θεωρητικό υπόβαθρο και τις τεχνικές υλοποίησης που χρησιμοποιήθηκαν για την ολοκλήρωση της [7], επεκτείνει το θέμα περαιτέρω παρουσιάζοντας δύο αντίστοιχες υλοποιήσεις του αλγορίθμου για το σύστημα Xeon Phi, ενώ ακόμα επιλύει τα προβλήματα της υλοποίησης της [26] και απαντά σε πολλά ερωτήματα τα οποία δεν διερευνήθηκαν επαρκώς σε αυτή. Ο αλγόριθμος με τον οποίο θα ασχοληθούμε στην παρούσα Διπλωματική Εργασία βασίζεται σε μία πρώιμη εκδοχή του «πολυαλγορίθμου» Spike 2 που αποτελεί σήμερα μία από τις σημαντικότερες μεθόδους επίλυσης μεγάλων γενικών γραμμικών συστημάτων με σύνθετα «κατά πλοκάδες τριδιαγώνια» μητρώα (block tridiagonal systems) και γενικότερα με δομή ζώνης (banded linear systems). Βλέπε [2,6,30] καθώς και την ενότητα 4.5 του συγγράμματος [29] που αποτελεί βασική αναφορά στην περιοχή των υπολογισμών μητρώων. Όπως εξηγήθηκε στην [7], όπου επανεξετάστηκε και υλοποιήθηκε για πρώτη φορά μέσω CUDA για μονάδες επεξεργασίας γραφικών (GPUs) ο πρωτοποριακός αυτός αλγόριθμος, η μέθοδος Spike σχεδιάστηκε για την βελτίωση της αριθμητικής ευστάθειας ενός παράλληλου τριδιαγώνιου επιλυτή που παρουσιάστηκε από τους A.H. Sameh και D.J. Kuck στην [3]. Παραπέμπουμε στο κεφάλαιο 3 της μονογραφίας [6] για περισσότερες πληροφορίες. Η πρώιμη εκδοχή του [3] σχεδιάστηκε εκ νέου και υλοποιήθηκε, με το όνομα g-spike, για μονάδες επεξεργασίας γραφικών (GPUs) (εργασία [7]), με χρήση της προγραμματιστικής διεπαφής CUDA. Συγκεκριμένα η Διπλωματική Εργασία αφορά στην σχεδίαση και υλοποίηση αναπροσαρμογών του g- spike, για την αποδοτική του εκτέλεση στο υπολογιστικό σύστημα Xeon Phi με χρήση OpenMP και του Intel C++ Compiler. Θα αναφερθούμε αναλυτικά στα χαρακτηριστικά της αρχιτεκτονικής του Xeon Phi τα οποία έχουν άμεσο αντίκτυπο στο προγραμματιστικό μοντέλο που κανείς θα πρέπει να χρησιμοποιήσει για την αποδοτική χρήση του συστήματος και θα παρουσιαστούν δύο προσεγγίσεις της υλοποίησης του g-spike για τον Xeon Phi. Ακόμα θα συγκρίνουμε την αρχιτεκτονική των GPUs και του Xeon Phi με στόχο την ανάδειξη των διαφορών του προγραμματιστικού μοντέλου που πρέπει να ακολουθείται για το κάθε σύστημα και θα παρουσιαστεί ένας τρόπος «παντρέματος» των δύο υπολογιστικών μοντέλων με στόχο την πιο αποδοτική και εύκολη μεταφορά κώδικα από το ένα σύστημα στο άλλο. Τέλος θα συγκρίνουμε την ταχύτητα εκτέλεσης του g-spike στον Xeon Phi με υπάρχουσες υλοποιήσεις επιλυτών τριδιαγώνιων και ταινιακών συστημάτων για τον Xeon Phi. Οι μέχρι στιγμής διαθέσιμες υλοποιήσεις για τον Xeon Phi είναι αυτές της βιβλιοθήκης MKL [12] και περιλαμβάνουν υλοποιήσεις των συναρτήσεων των βιβλιοθηκών LAPACK [13] και ScaLAPACK [14]. Συγκεκριμένα πρόκειται για τις συναρτήσεις pdgbsv και pddtsv της ScaLAPACK για γενικά ταινιακά συστήματα και τριδιαγώνια συστήματα με διαγώνια κυριαρχία αντίστοιχα, ενώ από την LAPACK έχουμε την συνάρτηση dgtsv για γενικά τριδιαγώνια συστήματα, που είναι ακριβώς η ίδια περίπτωση για την οποία ο g-spike απευθύνεται προσφέροντας μια παράλληλη και αριθμητικά ευσταθή προσέγγιση. Πολύ γνωστές βιβλιοθήκες για την αποδοτική επίλυση γραμμοαλγεβρικών προβλημάτων είναι επίσης η MAGMA [18] και Elemental [19], καμία εκ των δύο όμως δεν διαθέτει συναρτήσεις ειδικά για την επίλυση τριδιαγώνιων ή γενικότερων ταινιακών συστημάτων (βλέπε [20], [21]). Συγκεκριμένα και οι δύο βιβλιοθήκες επικεντρώνονται κυρίως στην 2 Αναφέρεται και ως «πλαίσιο Spike (Spike framework). ~ 7 ~

επίλυση πυκνών γραμμικών συστημάτων και άλλων πυκνών γραμμοαλγεβρικών προβλημάτων και εκ των δύο μόνον η MAGMA έχει σχεδιαστεί για την αποδοτική χρήση συνεπεξεργαστών, όπως GPUs και (μόλις πρόσφατα) του Xeon Phi. Θα πρέπει να σημειώσουμε επίσης ότι παρότι η MAGMA υποστηρίζει την χρήση συνεπεξεργαστών, είναι αμφίβολο το αν ποτέ θα υπάρξει τριδιαγώνιος ή έστω ταινιακός επιλυτής στην βιβλιοθήκη αυτή, καθότι χρησιμοποιεί υβριδικό μοντέλο εκτέλεσης το οποίο είναι κατάλληλο για προβλήματα υπολογιστικής έντασης (compute intensive) και μπορούν να επωφεληθούν τόσο από την εκτέλεση στην CPU όσο και από την εκτέλεση στους συνεπεξεργαστές, με το κόστος μεταφοράς των δεδομένων να είναι μικρό συγκριτικά με το υπολογιστικό όφελος. Τέλος αξίζει να σημειωθεί η υλοποίηση SPIKE [22] με υπεύθυνους τους ίδιους τους δημιουργούς του αλγόριθμου SPIKE, Eric Polizzi και Ahmed Sameh. Αποτελέσματα της υλοποίησης αυτής δεν παρουσιάζονται στην εργασία 3, καθότι είναι σχεδιασμένη για ταινιακά συστήματα σχετικά μεγάλου εύρους ζώνης, για την επίλυση των οποίων εκτελείτε μία επαναληπτική μέθοδος επιδιόρθωσης της επίλυσης, ενώ επιπλέον δεν έχει υλοποιηθεί με γνώμονα συστήματα όπως είναι ο Xeon Phi. 1.1 Περαιτέρω εργασίες Η εργασία [26] αφορά την πρώτη προσπάθεια αναπροσαρμογής του g-spike (σε CUDA) για την αποδοτική του εκτέλεση στο υπολογιστικό σύστημα Xeon Phi, στην οποία είχα το προνόμιο να συμμετάσχω 4. Η εργασία αυτή αποτέλεσε την πρώτη μου συμμετοχή σε δημοσίευση, καθώς και την πρώτη μου επαφή με το σύστημα Xeon Phi. Η υλοποίηση που παρουσιάζεται στην παρούσα Διπλωματική Εργασία, καθώς και τα αποτελέσματα αυτής, θα παρουσιαστούν επίσης και στο συνέδριο PMAA 2016 [23] με ομιλητή τον Δρ. Ιωάννη Βενέτη. 3 Ευχαριστώ τον καθηγητή Eric Polizzi που ανταποκρίθηκε αμέσως στο αίτημά μου και έστειλε τους σχετικούς κώδικες. 4 Θα ήθελα να ευχαριστήσω τον Δρ. Ιωάννη Βενέτη και τον επιβλέποντα καθηγητή μου Ευστράτιο Γαλλόπουλο για την ευκαιρία να συμμετάσχω για πρώτη φορά σε δημοσίευση. ~ 8 ~

2 Ο αλγόριθμος g-spike Ο αλγόριθμος g-spike υλοποιήθηκε για την επίλυση τριδιαγώνιων γραμμικών συστημάτων και χρησιμοποιεί περιστροφές Givens κατά την φάση παραγοντοποίησης. Μια πιο εκτεταμένη αναφορά στην οικογένεια των αλγορίθμων spike καθώς και την δυνατότητα επίλυσης του ελαττωμένου συστήματος με τη χρήση αναδρομής υπάρχει στο βιβλίο [6] καθώς και στην εργασία [3] που ήταν η αφετηρία των μεθόδων αυτών. Ο αλγόριθμος g-spike, στη μορφή που παρουσιάζουμε εδώ, και η υλοποίηση του σε περιβάλλον CUDA για GPUs αποτέλεσε το θέμα της διπλωματικής εργασίας [4] και του άρθρου [7]. 2.1 Γενική περιγραφή Έστω γραμμικό σύστημα Ax = f όπου Α R n n τριδιαγώνιο μητρώο, f R n το διάνυσμα δεξιού μέλους και x R n το διάνυσμα αγνώστων. Υποθέτουμε ότι το Α είναι αντιστρέψιμο καθώς και μη αναγώγιμο (τα στοιχεία στην 1 η υπο- και υπερδιαγώνιο είναι αρκούντος μακριά από το μηδέν). Στο Σχήμα 1 παρουσιάζεται ένα τέτοιο σύστημα. Θεωρούμε παράλληλο σύστημα με p μονάδες επεξεργασίας/πυρήνες, όπου υποθέτουμε ότι p << n. Ο αλγόριθμος χωρίζεται σε 3 βασικά στάδια: 1) Προεπεξεργασία: Το σύστημα χωρίζεται σε p τμήματα μεγέθους m j m j, όπου j = 1 p και κάθε τμήμα ανατίθεται σε ένα πυρήνα. 2) Παραγοντοποίηση: Το σύστημα παραγοντοποιείται στη μορφή AP μ = DS. Αρχικά το μητρώο μετατρέπεται σε «σχεδόν» άνω τριγωνική μορφή μέσω παραγοντοποίησης QR με χρήση περιστροφών Givens. Με αυτόν τον τρόπο δίνεται η δυνατότητα «ανάκτησης πλήρους τάξης» των άνω τριγωνικών μητρώων R j μέσω πολλαπλασιασμού με κατάλληλο μητρώο P μ. 3) Μετεπεξεργασία: Γίνεται εξαγωγή του ελαττωμένου συστήματος, το οποίο αναδιατάσσεται σε τριδιαγώνια μορφή και επιλύεται είτε μέσω αναδρομικού αλγορίθμου είτε σειριακά. Τέλος ανακτάται η πλήρης λύση μέσω πίσω αντικατάστασης. α 1,1 α 1,2 ξ 1 φ 1 α 2,1 α 2,2 α 2,3 ξ 2 φ 2 = a n 1,n ( α n,n 1 α n,n ) ( ξ n ) ( φ n ) Σχήμα 1: Τριδιαγώνιο σύστημα Ax = f ~ 9 ~

2.2 Προεπεξεργασία Το σύστημα τμηματοποιείται όπως φαίνεται στο Σχήμα 2, όπου στην τυπική περίπτωση p είναι το πλήθος των πυρήνων και κάθε τμήμα ανατίθεται σε ένα πυρήνα. Οι υπο- και υπερ-διαγώνιες πλοκάδες είναι B j = a jm,jm+1 e m e 1 T και C j+1 = a jm+1,jm e 1 e m T, όπου e 1, e m είναι διανύσματα της τυπικής βάσης, δηλαδή οι στήλες 1 και m του ταυτοτικού μητρώου I m αντίστοιχα. Επομένως τα υπομητρώα B j και C j+1 περιέχουν ένα μόνο μη μηδενικό στοιχείο στην κάτω αριστερά και πάνω δεξιά γωνία αντίστοιχα. Στη βιβλιογραφία [6] η τμηματοποίηση αυτή χαρακτηρίζεται συχνά ως τμηματοποίηση Spike. Όπως αναφέραμε υποθέτουμε ότι το μητρώο Α είναι αντιστρέψιμο, αλλά αυτό δεν μας εγγυάται την αντιστρεψιμότητα των A i, i = 1 p πλοκάδων. Το σύνολο των μη-αντιστρέψιμων πλοκάδων Α i θα το ονομάσουμε Δ. A 1 B 1 C 2 A 2 B p 1 ( C p A p ) x 1 x 2 f 1 f ( ) = ( 2 ), x p f p Σχήμα 2: Τμηματοποιημένο τριδιαγώνιο σύστημα 2.3 Παραγοντοποίηση Σε αυτό το στάδιο το μητρώο A παραγοντοποιείται στην μορφή AP μ = DS, η οποία παρουσιάζεται στο αντίστοιχο υποκεφάλαιο «iii) Δημιουργία των Spikes». Η παραγοντοποίηση πραγματοποιείται σε 3 επιμέρους βήματα: i. Μετατροπή των διαγώνιων πλοκάδων σε άνω τριγωνική μορφή μέσω ορθογώνιων μετασχηματισμών με χρήση περιστροφών Givens. Πρόκειται για την παραγοντοποίηση QR των υπομητρώων που βρίσκονται κατά μήκος της διαγωνίου και τα οποία θα ονομάζουμε χάριν συντομίας «διαγώνια υπομητρώα», παρόλο που δεν είναι διαγώνιας μορφής. Στο τέλος αυτού του βήματος βάσει της πρότασης 1 που αναφέρουμε στο αντίστοιχο υποκεφάλαιο, αποκαλύπτεται η τάξη κάθε «διαγώνιου υπομητρώου». Όπως θα δούμε επίσης, λόγω της προϋπόθεσης ότι το Α είναι μη αναγώγιμο και αντιστρέψιμο, η τάξη κάθε «διαγώνιου υπομητρώου» είναι m i ή m i 1. ii. Εφαρμογή κατάλληλου μετασχηματισμού για την ανάκτηση πλήρους τάξης των «διαγώνιων υπομητρώων» εκείνων που κατά την διάρκεια του βήματος i αποκαλύφθηκε πως έχουν τάξη m i 1. iii. Δημιουργία των spikes λύνοντας τα συστήματα R i v i = v i και R i w i = w. i ~ 10 ~

2.3.1 Περιστροφές Givens Μητρώα περιστροφών Givens ονομάζονται μητρώα της μορφής: I k 1 c k s k G k (ξ k, ξ k+1 ) =, ( s k c k I n k 1) όπου c k = ξ k ξ 2 2 k +ξ k+1, s k = ξ k+1 ξ 2 2 k +ξ k+1 Σχήμα 3: Μητρώο περιστροφών Givens, k = 1,, n 1. Εκ κατασκευής τα μητρώα αυτά είναι ορθογώνια. Όπως θα δούμε σε κάθε βήμα k = 1,2,, m 1 της παραγοντοποίησης ενός τριδιαγώνιου υπομητρώου με περιστροφές Givens, το στοιχείο ξ k+1 θα είναι η τιμή που βρίσκεται στην υποδιαγώνιο και η οποία θα μηδενιστεί μετά την εφαρμογή της περιστροφής G k (ξ k, ξ k+1 ). Θα γράφεται ως G k όταν οι τιμές (ξ k, ξ k+1 ) είναι προφανείς. Εφαρμόζοντας διαδοχικά τις περιστροφές αυτές στο τριδιαγώνιο μητρώο A, αυτό τροποποιείται σε άνω τριγωνική μορφή. Εν τέλει προκύπτει η παραγοντοποίηση A = QR με Q = G k G k 1 G 1 και R άνω τριγωνικό μητρώο που έχει προέλθει από το A μετά το μετασχηματισμό. Όπως έχει παρατηρηθεί στη βιβλιογραφία χρειάζεται ιδιαίτερη προσοχή στην υλοποίηση του εν λόγω υπολογισμού για την αποφυγή σφαλμάτων υπερχείλισης [5]. 2.3.2 Βήμα [i] - Τριγωνοποίηση διαγώνιων πλοκάδων Σχήμα 4: Στα αριστερά παρουσιάζεται το τριδιαγώνιο μητρώο αμέσως μετά την εφαρμογή περιστροφών Givens και στα δεξιά το ίδιο μητρώο μετά την ανάκτηση πλήρους τάξης της πρώτης πλοκάδας ~ 11 ~

Η διαδικασία που περιγράφεται στο υποκεφάλαιο 2.3.1 εφαρμόζεται ανεξάρτητα σε κάθε πυρήνα στο υπομητρώο που του αντιστοιχεί. Στο Σχήμα 4 δίνεται παράδειγμα χρησιμοποιώντας «διαγράμματα Wilkinson» για την ανάθεση των μη μηδενικών τιμών του μητρώου. Στο παράδειγμα αυτό το μέγεθος του αρχικού μητρώου είναι n = 12 και έχει γίνει τμηματοποίηση σε p = 3 τμήματα ίσου μεγέθους m = 4 το καθένα και το τελικό μητρώο που προκύπτει είναι της μορφής που παρουσιάζεται. Στα αριστερά του σχήματος βλέπουμε το σύστημα αμέσως μετά την εφαρμογή των περιστροφών Givens, τα μηδενικά στο κάτω δεξιό άκρο της διαγωνίου στις πλοκάδες σημαίνει ότι το αντίστοιχο «διαγώνιο υπομητρώο» είναι μη-αντιστρέψιμο. Στα δεξιά βλέπουμε την ανάκτηση πλήρους τάξης του πρώτου «διαγώνιου υπομητρώου» προσθέτοντας τα στοιχεία της 5 ης στήλης, κάτι το οποίο εκτελείται στο επόμενο βήμα που περιγράφεται στο υποκεφάλαιο 2.3.3. Οι παρακάτω προτάσεις είναι κρίσιμες για να γίνει κατανοητή η λειτουργία του g-spike [3, 4, 6]: Πρόταση 1. [3] Έστω αντιστρέψιμο τριδιαγώνιο μητρώο A τάξης n = pm. Έστω η τμηματοποιημένη μορφή του σε κατά πλοκάδες τριδιαγώνια μορφή αποτελούμενη από p πλοκάδες μεγέθους m η κάθε μία και υπομητρώα τάξης 1 εκτός της διαγωνίου. Τότε όλα τα διαγώνια υπομητρώα A i, i = 2.. p 1 είναι τάξης τουλάχιστον m 2, ενώ για i = 1, p έχουν τάξη τουλάχιστον m 1. Αν το μητρώο είναι και μη-αναγώγιμο τότε όλα τα διαγώνια υπομητρώα θα είναι τάξης τουλάχιστον m 1, και επίσης το συνημίτονο c m 1 της τελευταίας περιστροφής Givens θα είναι μη μηδενικό. Πρόταση 2. [3] Έστω τριδιαγώνιο μητρώο A μεγέθους m, μη-αναγώγιμο και ιδιάζον. Τότε εφαρμόζοντας οποιουδήποτε είδους παραγοντοποίηση QR η τελευταία γραμμή του R θα είναι μηδενική και το στοιχείο (R) m,m = 0 θα είναι το μόνο μηδενικό στοιχείο στη διαγώνιο του R. Εάν εφαρμοστεί QR μέσω περιστροφών Givens τότε το R θα είναι άνω τριγωνικό και ταινιακό με εύρος ζώνης ίσο με 3. Για το σύστημα εισόδου υποθέτουμε ότι το μητρώο είναι μη-αναγώγιμο. Αν δεν είναι τότε μπορεί να προηγηθεί έλεγχος και το πρόβλημα να μοιραστεί σε μικρότερα υποπροβλήματα που στη συνέχεια θα επιλυθούν αυτόνομα. Στα πλαίσια αυτής της εργασίας θεωρούμε ότι το μητρώο εισόδου είναι μηαναγώγιμο. Υπογραμμίζουμε όμως ότι οι παραπάνω προτάσεις αναφέρονται σε αριθμητική άπειρης ακρίβειας, καθώς στην πράξη λόγω της αριθμητικής κινητής υποδιαστολής είναι αναμενόμενο ότι το στοιχείο (R j ) m,m δεν θα είναι ακριβώς μηδέν ακόμα και όταν το A i είναι ιδιάζον. Αντί αυτού θεωρούμε ότι θα είναι κάποιο πολύ μικρό κατά απόλυτη τιμή στοιχείο. Έτσι ο έλεγχος για τη μη-αντιστρεψιμότητα του R j πραγματοποιείται με βάση κάποιο κατώφλι κοντά στο μηδέν σε σχέση με την αριθμητική ακρίβεια κινητής υποδιαστολής της μηχανής. 2.3.3 Βήμα [ii] - Ανάκτηση Πλήρους Τάξης Όπως είδαμε στο Σχήμα 4, το πρώτο υπομητρώο του μητρώου εδώ αποκαλύφθηκε ότι είναι ιδιάζον μετά την παραγοντοποίηση QR (δεξιά στο σχήμα). Η ανάκτηση πλήρους τάξης πραγματοποιήθηκε προσθέτοντας την αμέσως επόμενη στήλη δεξιά του μηδενικού στοιχείου, στην στήλη του στοιχείου αυτού (αριστερά στο σχήμα). Το στοιχείο (R j ) m,m (που βρίσκεται στα δεξιά του μηδενικού στοιχείου και ~ 12 ~

το οποίο προστίθεται σε αυτό) αποδεικνύεται ότι θα είναι μη μηδενικό λόγω της πρότασης 1, που παρουσιάστηκε στην προηγούμενη ενότητα. Συνεπώς η υπόθεση ανάκτησης τάξης μέσω αυτής της μεθόδου είναι ορθή. Στο συγκεκριμένο παράδειγμα το σύνολο των μη-αντιστρέψιμων «διαγώνιων υπομητρώων» είναι Δ = {Α 1, Α 3 }. Σημειώνονται δύο σημαντικές παρατηρήσεις: i) Η μετατροπή αυτή δεν επηρεάζει την ειδική δομή του μητρώου, το οποίο παραμένει άνω τριγωνικό και ζώνης. ii) Τα στοιχεία που προστίθενται βρίσκονται εκτός του R, που σημαίνει ότι δεν υπάρχει γραμμική εξάρτηση μεταξύ των στηλών του R 1 μετά από αυτή την τάξης-2 διατάραξη. Η τάξη της διατάραξης αντιστοιχεί στο πλήθος των μη-αντιστρέψιμων «διαγώνιων υπομητρώων». Για την αποφυγή φαινομένων καταστροφικής απαλοιφής, γίνεται πολλαπλασιασμός της στήλης που προστίθεται με το πρόσημο του στοιχείου (R 1 ) m,m. Η μέθοδος αυτή γενικεύεται για κάθε ιδιάζουσα διαγώνια πλοκάδα, πλην της τελευταίας, στην παρακάτω πρόταση. Πρόταση 3. Έστω τριδιαγώνιο, αντιστρέψιμο και μη-αναγώγιμο μητρώο A που έχει υποστεί την κατά πλοκάδες QR παραγοντοποίηση με χρήση περιστροφών Givens που περιγράψαμε στο βήμα (i) (τριγωνοποίηση διαγώνιων πλοκάδων) και τέτοιο ώστε το A p να είναι αντιστρέψιμο. Έστω Δ = {j (R j ) m,m = 0, j p} το σύνολο των μη-αντιστρέψιμων διαγώνιων πλοκάδων του μητρώου. Τότε αν θέσουμε P μ = I n + υπομητρώα». {j Δ} e jm+1 e jm, το μητρώο AP μ θα έχει αντιστρέψιμα «διαγώνια Ειδική περίπτωση αποτελεί το τελευταίο «διαγώνιο υπομητρώο» να είναι ιδιάζον και στο επόμενο υποκεφάλαιο «Δημιουργία των Spikes» αναφερόμαστε στον τρόπο διαχείρισης αυτής της περίπτωσης. 2.3.4 Βήμα [iii] - Δημιουργία των Spikes Σχήμα 5: Παραγοντοποίηση τριδιαγώνιου μητρώου Α στην μορφή DS ~ 13 ~

Σχήμα 6: (a): Παραγοντοποιημένο μητρώο στη γενική περίπτωση (b): Παραγοντοποιημένο μητρώο όταν η τελευταία πλοκάδα είναι ιδιάζον Σκοπός του βήματος αυτού είναι η παραγοντοποίηση του μητρώου στη μορφή AP μ = DS, όπως βλέπουμε και στο Σχήμα 5. Το D αποτελείται από τις διαγώνιες πλοκάδες του A μετά τη διατάραξη από το μητρώο P μ. Το μητρώο S είναι το Spike μητρώο, αλλά σε αντίθεση με τον Spike αλγόριθμο για συστήματα ζώνης, τα Spikes w, v είναι διανύσματα και όχι μητρώα επειδή το A είναι τριδιαγώνιο μητρώο. Σε αυτό το βήμα θεωρούμε ότι έχουν προηγηθεί τα προηγούμενα δύο, δηλαδή έχουν προηγηθεί οι παρακάτω πράξεις: i) Ξεκινώντας από το σύστημα Ax = f, παραγοντοποίηση A = QR Rx = Q T f Rx = g. ii) Ανάκτηση πλήρους τάξης RP μ P μ 1 x = g R x = g. Το μητρώο R έχει τη δομή που φαίνεται δεξιά στο Σχήμα 4. Και το αντίστοιχο γραμμικό σύστημα του παραδείγματος αυτού μπορεί να γραφεί ως: R 1 u 1 0 ( w 2 R 2 u ) ( x 1 2 x 2 ) = ( g 1 g 2 ) 0 w 3 R x 3 3 g 3 Για να πάρει την τελική μορφή που θέλουμε αρκεί να λύσουμε για τις εξισώσεις που περιέχονται σε κάθε γραμμή πλοκάδων του συστήματος τρία επιμέρους γραμμικά συστήματα: R j [v j, w j, y j ] = [v, j w, j g j ], j = 2 p 1 R [v 1 1, y 1 ] = [v, 1 g 1 ] R [w p p, y p ] = [w p, g p ] ~ 14 ~

Με τον τρόπο αυτό έχει ολοκληρωθεί η παραγοντοποίηση AP μ = DS. Σημειώνεται ότι για την τελευταία περίπτωση η παραπάνω διαδικασία είναι αδύνατο να πραγματοποιηθεί αν το R p είναι ιδιάζον. Για την αντιμετώπιση αυτού του προβλήματος υπάρχει ειδικός χειρισμός. Λόγω της πρότασης 1, το (R p ) 1:m 1,1:m 1 είναι πλήρους τάξης (m 1) άρα είναι αντιστρέψιμο. Αυτό σημαίνει ότι μπορούμε να εφαρμόσουμε τη σχέση R [w p p, y p ] = [w p, g p ] για τις πρώτες m 1 γραμμές του συστήματος. Σε αυτή την περίπτωση θα πρέπει να λύσουμε με ένα ακόμη δεξί μέλος, το διάνυσμα που αποτελείται από τα πρώτα m 1 στοιχεία της στήλης m του R p. Με αυτό τον τρόπο θα προκύψει ένα ακόμη spike στο σύστημα, χωρίς βέβαια να επηρεάζει με κάποιο τρόπο τα επόμενα βήματα του αλγορίθμου g-spike. Το τελικό μητρώο S που προκύπτει έχει δομή όπως φαίνεται στο Σχήμα 6. 2.4 Μετεπεξεργασία Μετά την εκτέλεση των δύο προηγούμενων σταδίων το σύστημα έχει πλέον την μορφή Sx = y. Το μητρώο S έχει την δομή που είδαμε στο προηγούμενο σχήμα και η οποία είναι ουσιαστικά το ταυτοτικό μητρώο I με την ύπαρξη διανυσμάτων στα αριστερά και στα δεξιά κάθε διαγώνιας πλοκάδας (με εξαίρεση την πρώτη και την τελευταία πλοκάδα). Τα διανύσματα αυτά ονομάζονται spikes και θα αναγράφονται ως w ή v ανάλογα με το αν βρίσκονται στα αριστερά ή στα δεξιά των πλοκάδων αντίστοιχα. Λόγω της δομής του S το πρόβλημα της επίλυσης του συστήματος Sx = y μπορεί να μειωθεί στην επίλυση ενός πολύ μικρότερου συστήματος S x = y, το οποίο είναι ένα πολύ βασικό στοιχείο της μεθοδολογίας Spike [2]. Εξάγουμε το μειωμένο αυτό σύστημα λαμβάνοντας υπόψη μόνο την πρώτη και τελευταία γραμμή της κάθε πλοκάδας του συστήματος, όπως περιγράφεται και από την παρακάτω σχέση: x i = [ x i (t) x i x i (b) ], y i = [ y i (t) y i y i (b) ], w i = [ ~ 15 ~ w i (t) w i w i (b) ], v i = [ Η δομή του μειωμένου συστήματος φαίνεται στο Σχήμα 7, όπου βλέπουμε τη δομή του συστήματος S x = y. Στη διαγώνιο υπάρχουν μόνο μονάδες. Τα στοιχεία w i (t), vi (t), xi (t), yi (t) υποδηλώνουν τα top στοιχεία των αντίστοιχων διανυσμάτων (για αυτό και η χρήση του λατινικού χαρακτήρα t) στο σύστημα Sx = y, ενώ τα w i (b), vi (b), xi (b), yi (b) υποδηλώνουν τα bottom στοιχεία αντίστοιχα (για αυτό και η χρήση του λατινικού χαρακτήρα b). Το μητρώο S είναι «ψυχολογικά» τριδιαγώνιο. Αρκεί μια αντιμετάθεση στηλών για να αναχθεί σε τριδιαγώνια μορφή όπως βλέπουμε και από το Σχήμα 8. Ως τριδιαγώνιο το μειωμένο σύστημα μπορεί να επιλυθεί με αναδρομικές κλήσεις του αλγόριθμου g-spike, έως ότου το τελικό μειωμένο σύστημα να είναι αρκετά μικρό ώστε να επιλύεται πιο αποδοτικά με σειριακό τρόπο. Μόλις επιστραφεί η μερική λύση x εφαρμόζεται πίσω αντικατάσταση για την ανάκτηση της πλήρους λύσης x, με τον τρόπο που περιγράφει το παρακάτω σύστημα: v i (t) v i v i (b) ]

(t) x 1 = y 1 v 1 x 2, { (t) (b) x j = y j v j x j+1 wj x j 1, j = 2, p Η περίπτωση της πλήρως λύσης για x p (περίπτωση για την τελευταία πλοκάδα) ανακτάται με τον ίδιο τρόπο όπως και για τα x j με j = 2 p 1, καθώς το υπομητρώο A p μπορεί να είναι ιδιάζον και άρα όπως δείξαμε προηγουμένως θα υπάρχει δεξί spike v p. Στην περίπτωση που το A p είναι αντιστρέψιμο οι τιμές του v p θα είναι μηδενικές και δεν θα επηρεάσουν τη λύση, συνεπώς ο τύπος ισχύει σε κάθε περίπτωση. Τελευταίο βήμα αποτελεί η αναίρεση της διαδικασίας ανάκτησης πλήρους τάξης που εφαρμόστηκε στο στάδιο παραγοντοποίησης. Αυτό επιλύεται βάσει της σχέσης x = P μ x. Σχήμα 7: Μειωμένο σύστημα S x = y Σχήμα 8: Τριδιαγώνιο μειωμένο σύστημα (a): Περίπτωση όπου το υπομητρώο A p είναι αντιστρέψιμο (b): Περίπτωση όπου το υπομητρώο A p είναι ιδιάζον ~ 16 ~

2.5 Αλγοριθμική περιγραφή g-spike algorithm Require: Τριδιαγώνιο μητρώο Α και δεξί μέλος f Ensure: Λύση για το γραμμικό σύστημα Ax = f {Στάδιο 1 Προεργασία} 1: Θεωρώντας μη-αναγωγιμότητα για το Α, το σύστημα τμηματοποιείται σε διαγώνιες πλοκάδες {Στάδιο 2 Παραγοντοποίηση} 2: Για κάθε j = 1,, p: 3: i) Παραγοντοποίηση QR με εφαρμογή περιστροφών Givens: Υπολογισμός των τελεστών περιστροφής G i (j) για i = 1,, m 1 και ii) iii) εφαρμογή Q T (j) j = G m 1 G (j) 1 στη μπλοκ-γραμμή j για τη δημιουργία άνω τριγωνικού μητρώου ζώνης R j = Q T j A j, τα διανύσματα g j = Q T j g j για j = 1,, p, τα διανύσματα w j = a jm+1,jm Q T j e 1 για j = 2,, p και τα διανύσματα v j = a jm,jm+1 Q j T e m για j = 1,, p 1. Κάθε μητρώο R j έχει μήκος ζώνης 3. Ανάκτηση Πλήρους Τάξης: Αν εντοπιστεί ιδιάζον μητρώο R j τότε ανακτάται πλήρης τάξη μέσω της σχέσης αυτής RP μ P 1 μ x = g R x = g, προκύπτουν οπότε νέα αντιστρέψιμα διαγώνια R j (όπου R j = R j αν το R j ήταν αντιστρέψιμο). Δημιουργία των Spikes: Τυπικά πολλαπλασιάζεται κάθε μπλοκ-γραμμή με (R j ) 1, στην πράξη λύνουμε το σύστημα των εξισώσεων: R j [v j, w j, y j ] = [v, j w, j g j ], j = 2 p 1 R [v 1 1, y 1 ] = [v, 1 g 1 ] R [w p p, y p ] = [w, p g p ] {Στάδιο 3 Μετεπεξεργασία: Επίλυση του συστήματος Spike Sx = y, ανάκτηση του x} i) Εξαγωγή του ελαττωμένου συστήματος S. Το σύστημα είναι αντιστρέψιμο και μπορεί να έρθει μέσω αναδιάταξης στηλών σε τριδιαγώνια μορφή. Ανάλογα το μέγεθος του μπορεί να επιλυθεί είτε καλώντας αναδρομικά τον αλγόριθμο g-spike, είτε σειριακά με κάποια ευσταθή μέθοδο όπως μέσω παραγοντοποίησης QR με χρήση περιστροφών Givens. ii) Εφαρμογή πίσω αντικατάστασης και ανάκτηση της πλήρους λύσης x, όπως περιγράφεται στο παρακάτω σύστημα: x 1 = y 1 v 1 x (t) 2, { x j = y j v j x (t) j+1 w j x (b) j 1, j = 2, p iii) Αναίρεση της ανάκτησης πλήρους τάξης μέσω της σχέσης x = P μ x. ~ 17 ~

3 Αρχιτεκτονική Xeon Phi Σχήμα 9: (από [8]) Συνδεσμολογία πάνω στον διασυνδετικό δακτύλιο του Xeon Phi Σχήμα 10: (από [9]) Αρχιτεκτονική ενός επεξεργαστικού πυρήνα του Xeon Phi Ένας συνεπεξεργαστής στόχο έχει να συμβάλει στην επεξεργαστική ισχύ ενός συστήματος, δουλεύοντας παράλληλα με την κεντρική μονάδα επεξεργασίας (CPU). Καθότι οι νέες γενιές επεξεργαστών είναι πολυπύρηνες (multicore) και διαθέτουν πληθώρα μονάδων επεξεργασίας πέραν των επεξεργαστικών τους πυρήνων (για επεξεργασία γραφικών π.χ.) η ύπαρξη συνεπεξεργαστών που διαθέτουν παρόμοια αρχιτεκτονική δεν θα είχε αξία. Τα συστήματα αυτά λοιπόν, στόχο έχουν να «συμπληρώσουν» τις δυνατότητες των CPUs και αυτό το επιτυγχάνουν μέσω της παραλληλίας σε πολύ ~ 18 ~

υψηλό επίπεδο (many-core). Οι αρχιτεκτονικές αυτές όχι μόνο διαθέτουν μεγάλο αριθμό πυρήνων (για τις GPU μπορεί να μιλάμε για χιλιάδες πυρήνες), αλλά διαθέτουν και την κατάλληλη αρχιτεκτονική όσο αναφορά τον χειρισμό της μνήμης, έτσι ώστε να επιτυγχάνεται η όσο καλύτερη αξιοποίηση της κατά την εκτέλεση παραλληλοποιημένου κώδικα. Η χρήση συνεπεξεργαστών επιταχύνει σημαντικά πολλές υπολογιστικά ακριβές εφαρμογές, καθώς μεγάλος αριθμός υπολογιστικών πυρήνων μπορεί υλοποιηθεί ώστε να εκτελείται σε αυτούς με σημαντικά μικρότερους χρόνους εκτέλεσης και με σημαντικά μικρότερη κατανάλωση ενέργειας. Ο συνεπεξεργαστής Xeon Phi, στην χρήση του οποίου βασίζεται η παρούσα διπλωματική, αποτελεί την «απάντηση» της Intel στο χώρο των συνεπεξεργαστών στον οποίο είχαν επικρατήσει οι μονάδες επεξεργασίας γραφικών (GPUs). Η προσέγγιση αυτού τόσο σε επίπεδο αρχιτεκτονικής όσο και σε επίπεδο προγραμματιστικού μοντέλου είναι τελείως διαφορετική και συνεπώς παρουσιάζει ιδιαίτερο ενδιαφέρον. Το γεγονός ότι το προγραμματιστικό μοντέλο είναι παρόμοιο με αυτό που χρησιμοποιείται για την αποδοτική συγγραφή παραλληλοποιημένου κώδικα σε μία σύγχρονη CPU, αποτελεί έναν ακόμα σημαντικό λόγο να επιλέξει κανείς τον συνεπεξεργαστή Xeon Phi. O Xeon Phi καθώς και κάποιες οικογένειες GPUs, όπως η σειρά Tesla της NVIDIA, απευθύνονται κυρίως για High Performance Computing (HPC) και βασικός τους στόχος είναι η επίτευξη μεγάλης επεξεργαστικής ισχύος με χαμηλή κατανάλωση ενέργειας. Μέχρι στιγμής οι συνεπεξεργαστές Xeon Phi διαθέτουν έως και 61 επεξεργαστικούς πυρήνες, κάθε ένας εκ των οποίων διαθέτει μία μονάδα διανυσματικής επεξεργασίας (vector processing unit) μήκους 512 bit, 2 επίπεδα κρυφής μνήμης και παρέχει έως και 4 νήματα εκτέλεσης. Οι επεξεργαστικοί πυρήνες διασυνδέονται μέσω ενός δακτυλίου αμφίδρομης κατεύθυνσης μεγάλου εύρους ζώνης και οι κρυφές τους μνήμες παραμένουν πλήρως συνεκτικές χάρις ένα καθολικό κατάλογο ετικετών. Τέλος διαθέτουν έως και 16GB RAM για χρήση από το ίδιο το σύστημα για διεργασίες που διαχειρίζονται μεγάλο όγκο δεδομένων, όπως οι υπολογιστικοί πυρήνες για εκτέλεση γραμμοαλγεβρικών πράξεων που μελετάμε. Στο Σχήμα 9 παρουσιάζεται η δομή και οι διασυνδέσεις πάνω στον δακτύλιο, ενώ στο Σχήμα 10 παρουσιάζεται η αρχιτεκτονική ενός επεξεργαστικού πυρήνα του Xeon Phi. Για την ευκολότερη και καλύτερη αξιοποίηση του συστήματος η Intel παρέχει πληθώρα προγραμματιστικών εργαλείων και βιβλιοθηκών. Όπως μεταγλωττιστές για τη Fortran, C, C++ και τις βιβλιοθήκες για χρήση MPI και OpenMP, καθώς επίσης και την MKL βιβλιοθήκη που περιέχει πληθώρα γραμμοαλγεβρικών και άλλων μαθηματικών συναρτήσεων ειδικά σχεδιασμένες προς εκτέλεση από τα συστήματα της Intel. Ο Xeon Phi προσφέρει 3 μοντέλα εκτέλεσης γνωστά ως offload λειτουργία εκτέλεσης, native λειτουργία εκτέλεσης και τέλος συμμετρική λειτουργία εκτέλεσης η οποία πρόκειται ουσιαστικά για υβριδική λειτουργία εκτέλεσης των προηγούμενων δύο. 1) Offload λειτουργία: Γνωστό και ως ετερογενές προγραμματιστικό μοντέλο, πρόκειται ουσιαστικά για μοντέλο εκτέλεσης κατά το οποίο η CPU του συστήματος «στέλνει» τμήματα κώδικα και δεδομένων στον Xeon Phi προς εκτέλεση. Με τον τρόπο αυτό η εκτέλεση ξεκινά στην CPU και εκεί ανάλογα αποφασίζεται αν και ποια τμήματα κώδικα και δεδομένων θα αναλάβει ο Xeon Phi, ~ 19 ~

ενώ μπορεί παράλληλα η CPU να συνεχίσει την εκτέλεση κάποιου άλλου τμήματος. Αυτός ο τρόπος λειτουργίας είναι αντίστοιχος με αυτόν άλλων συνεπεξεργαστών, όπως οι GPUs. 2) Native λειτουργία: Ο Xeon Phi χρησιμοποιεί λειτουργικό σύστημα Linux micro και εμφανίζεται ως δευτερεύων σύστημα πάνω στο κυρίως, σαν ένας επιπλέον επεξεργαστικός κόμβος. Για να τρέξει κώδικας στη λειτουργία αυτή θα πρέπει να μεταγλωττιστεί με την κατάλληλη παράμετρο, με τον τρόπο αυτό ο κώδικας ξεκινά και τρέχει απευθείας πάνω στον Xeon Phi. 3) Συμμετρική λειτουργία: Σε αυτήν την λειτουργία οι διεργασίες της εφαρμογής τρέχουν και στα δύο συστήματα. Συνήθως επικοινωνούν μέσω κάποιας διεπαφής μηνυμάτων όπως το MPI. Για την παρούσα διπλωματική η υλοποίηση και οι μετρήσεις πραγματοποιήθηκαν στο συνεπεξεργαστή Intel Xeon Phi 3120A του εργαστηρίου πληροφοριακών συστημάτων υψηλών επιδόσεων (HPCLab) του Πανεπιστημίου Πατρών, που διαθέτει 6GB Ram και 57 επεξεργαστικούς πυρήνες. Χρησιμοποιήθηκε ο Intel C++ Compiler και η βιβλιοθήκη OpenMP. Οι μετρήσεις έγιναν σε offload λειτουργία, καθότι αποτελεί το πιο συνηθισμένο και χρήσιμο προγραμματιστικό μοντέλο για την χρήση συνεπεξεργαστών, με εξαίρεση την χρήση της ScaLAPACK [1] οι οποία έγινε σε native λειτουργία. Αυτό έγινε καθώς η ScaLAPACK χρησιμοποιεί MPI, το οποίο περιορίζει τα προγραμματιστικά μοντέλα που μπορούν να χρησιμοποιηθούν σε αυτά της native και συμμετρικής λειτουργίας. Καθότι στην συμμετρική λειτουργία η εκτέλεση γίνεται τόσο με την χρήση του Xeon Phi όσο και της CPU, δεν αποτελεί καλό προγραμματιστικό μοντέλο για τη σύγκριση μεταξύ υλοποιήσεων στον Xeon Phi. Για την αξιοποίηση των πόρων του συστήματος που μόλις περιγράψαμε, είναι σαφές ότι πρέπει να χρησιμοποιηθούν πολλαπλά νήματα επεξεργασίας, καθώς η μονάδα διανυσματικής επεξεργασίας (vector processing unit) που διαθέτει ο κάθε πυρήνας. Για την υλοποίηση χρησιμοποιήθηκε η βιβλιοθήκη OpenMP για τη δημιουργία και διαχείριση των νημάτων επεξεργασίας, καθώς επίσης και ειδικές δομές που υποστηρίζει ο Intel compiler και με τις οποίες ο προγραμματιστής παρέχει πληροφορίες σχετικά με το ποιοι βρόχοι δέχονται χρήση διανυσματικής επεξεργασίας. Ακόμα αυτές οι δομές μπορούν να χρησιμοποιηθούν για να παράσχει ο προγραμματιστής επιπλέον πληροφορίες στον μεταφραστή (compiler), σχετικές με την διευθυνσιοδότηση και προσπέλαση των πινάκων που χρησιμοποιούνται στο βρόχο κατά την εκτέλεση αυτού. Αυτές οι πληροφορίες οδηγούν τον μεταφραστή στην παραγωγή βελτιστοποιημένου κώδικα για την χρήση διανυσματικής επεξεργασίας, σύμφωνα με προκαθορισμένες δομές που αξιοποιούν αυτές τις πληροφορίες. Για παράδειγμα η πληροφορία ότι ο βρόχος προσπελαύνει αποκλειστικά συναυξητικές διευθύνσεις μνήμης ξεκινώντας από διευθύνσεις που είναι πολλαπλάσιο του 64 είναι ιδιαίτερα χρήσιμη στην παραγωγή γρήγορου κώδικα για τη διανυσματική επεξεργασία και η εγγύηση προς τον compiler ότι αυτό ισχύει έχει ιδιαίτερα θετική επίδραση στην ταχύτητα της υλοποίησης. Αυτό συμβαίνει γιατί η cache line έχει μέγεθος 64 bytes πράγμα που σημαίνει ότι η διεύθυνση μνήμης της πρώτης θέσης της είναι κάποιο πολλαπλάσιο του 64 και το μήκος της μονάδας διανυσματικής επεξεργασίας είναι επίσης 64 bytes που σημαίνει ότι μπορούν να γίνουν πράξεις απευθείας πάνω στα δεδομένα διαδοχικών cache line, χωρίς χρονοβόρες διαδικασίες όπως είναι η χρήση masking ή περαιτέρω έλεγχοι που απαιτούνται κατά την χρήση της μονάδας υπό άλλες συνθήκες. Σε περίπτωση που δεν τηρείται η εγγύηση αυτή που δώσαμε στον μεταφραστή, θα υπάρξει σφάλμα κατάτμησης (segmentation fault) κατά την εκτέλεση του κώδικα στο σημείο αυτό και συνεπώς ο προγραμματιστής θα πρέπει να είναι ιδιαίτερα προσεκτικός στην χρήση τέτοιων δομών. Ένα άλλο ~ 20 ~

χρήσιμο παράδειγμα είναι η εγγύηση που δίνουμε στον compiler ότι δεν υπάρχουν εξαρτήσεις μεταξύ των δεδομένων διαδοχικών εκτελέσεων ενός βρόχου, σε περίπτωση που δεν το αναφέρουμε και ο μεταφραστής δεν είναι σε θέση να το αναγνωρίσει μόνος αυτό τότε δεν γίνεται χρήση διανυσματικής επεξεργασίας που ειδάλλως θα ήταν εφικτή, ενώ σε περίπτωση που η εγγύηση που δώσαμε δεν ισχύει τα αποτελέσματα εκτέλεσης του κώδικα θα είναι λανθασμένα. Με βάση όσα έχουμε πει ως τώρα για το σύστημα Xeon Phi, είναι προφανές το ότι για να πετύχουμε καλή απόδοση με χρήση πολλαπλών νημάτων, καθώς και για να γίνει ικανοποιητική χρήση των VPUs (vector processing units), είναι επιθυμητό ο αλγόριθμος τον οποίο υλοποιούμε να απαρτίζεται από τμήματα με αυτόνομες υπολογιστικά πράξεις και να μπορούμε όσο το δυνατόν να ρυθμίζουμε το επίπεδο παραλληλίας που θέλουμε. Έτσι μπορούμε να παραλληλοποιούμε τον κώδικα μας βάσει διαφορετικών αρχιτεκτονικών, ακόμα και αυτών που θα συναντήσουμε σε μελλοντικά συστήματα. Παρότι η χρήση VPUs προσφέρει ακόμα ένα επίπεδο παραλληλίας, συναντά κανείς συχνά προβλήματα στη χρήση τους λόγο της μικρότερης «ευελιξίας» στην συγγραφή αποδοτικού κώδικα σε σχέση με τη χρήση νημάτων. Παρότι διανυσματική επεξεργασία (vectorization) στον Xeon Phi με χρήση του Intel Compiler μπορεί να πραγματοποιηθεί σε βρόχους που περιέχουν συνθήκες if, όπως ακόμα και σε περιπτώσεις διασκελισμού των θέσεων πινάκων που προσπελάζονται, τέτοιες περιπτώσεις μπορεί να μειώσουν σημαντικά την επίδοση. Επιπλέον η διανυσματική επεξεργασία βρόχου δεν είναι εφικτή, αν στο εσωτερικό του καλούνται συναρτήσεις οι οποίες είτε δεν έχουν μεταγλωττιστεί κατάλληλα για την υποστήριξη διανυσματικής επεξεργασίας είτε η διανυσματική επεξεργασία σε αυτές δεν είναι εφικτή λόγο της δομής της συνάρτησης. Σε γενικές γραμμές για την αποδοτική εκτέλεση κώδικα με χρήση διανυσματικής επεξεργασίας στον Xeon Phi, θα πρέπει να προσπελάζονται συναυξητικές διευθύνσεις μνήμης για τον κάθε πίνακα και να αποφεύγονται οι συνθήκες if στο εσωτερικό των βρόχων. Ακόμα ιδιαίτερης σημασίας είναι η πρώτη διεύθυνση του κάθε πίνακα που προσπελαύνεται στο βρόχο να είναι πολλαπλάσια του 64 για τους λόγους που έχουν αναφερθεί και πιο πάνω. Αυτή η ανάγκη «στοίχισης» με διευθύνσεις που είναι πολλαπλάσια του 64 για αποδοτικότερη διανυσματική επεξεργασία ονομάζεται «64 bytes alignment». Για να αξιοποιηθεί αυτή η ιδιότητα, δημιουργείται πολλές φορές η ανάγκη «γεμίσματος» των γραμμών ενός μητρώου, δεσμεύοντας απλά περισσότερη μνήμη για αυτές ώστε το πλήθος των bytes να είναι πολλαπλάσιο του 64. Αυτή η τεχνική είναι γνωστή ως «line padding». Αντίστοιχες padding τεχνικές χρησιμοποιούνται σε διάφορες δομές αποθήκευσης δεδομένων, ανάλογα με τον τρόπο που προσπελαύνονται τα δεδομένα κατά την εκτέλεση του διανυσματοποιημένου βρόχου. Η χρήση νημάτων για παραλληλία επηρεάζεται από τις if συνθήκες στο βαθμό που επηρεάζεται και ο σειριακός κώδικας. Ακόμα οι περισσότερες συναρτήσεις μπορούν να εκτελεστούν παράλληλα από διαφορετικά νήματα, εκτός κάποιων εξαιρέσεων συναρτήσεων που η κατάσταση τους αλλάζει σε κάθε τους εκτέλεση, μέσω των τιμών κάποιων καθολικών μεταβλητών που χρησιμοποιούν. Τέλος η ύπαρξη διασκελισμού στα δεδομένα δεν έχει ιδιαίτερη επίπτωση στην εκτέλεση των νημάτων, εφόσον ο διασκελισμός αυτός δεν οδηγεί και σε κακή χρήση της κρυφής μνήμης. Αν λοιπόν όλα τα δεδομένα μίας cache line τα επεξεργάζεται το ίδιο νήμα και αυτό γίνεται χωρίς να χρειαστεί να προσπελάσει πάνω από μία φορά την κύρια μνήμη για τα δεδομένα της cache line αυτής, ο διασκελισμός δεν θα έχει ιδιαίτερη επίπτωση στον χρόνο εκτέλεσης του νήματος. ~ 21 ~

Παρότι γενικά η χρήση νημάτων φαίνεται να παρέχει και μεγάλη επεξεργαστική ικανότητα και μεγάλη ευελιξία, υπάρχουν 2 βασικοί λόγοι για τη χρήση διανυσματικής επεξεργασίας. Ένας λόγος είναι ότι η χρήση διανυσματικής επεξεργασίας μειώνει σημαντικά την κατανάλωση ισχύος, καθώς τα νήματα σε επίπεδο υλικού για επεξεργαστικούς πυρήνες όπως στον Xeon Phi απαιτούν αρκετό επιπλέον υλικό και η χρήση αυτού τόσο για την εκτέλεση πράξεων όσο και για τον έλεγχο της ροής εκτέλεσης αυξάνει σημαντικά την κατανάλωση. Ο δεύτερος λόγος έχει να κάνει με τα εξής. Παρόλο που ο Xeon Phi παρέχει ως και 4 νήματα εκτέλεσης σε επίπεδο υλικού ανά πυρήνα, θεωρούμε γενικά ότι το κάθε νήμα έχει ξεχωριστή κρυφή μνήμη (ένα νήμα ανά πυρήνα). Επιπλέον η δημιουργία, συγχρονισμός και η διαμοίραση επεξεργαστικού φόρτου στα νήματα είναι σχετικά χρονοβόρες διαδικασίες. Συνεπώς το να χρησιμοποιούμε πολλά νήματα για μικρό πλήθος δεδομένων και στην χειρότερη περίπτωση δεδομένων που ανήκουν στις ίδιες cache lines της κύριας μνήμης, μπορεί εν τέλει να καταλήξει να έχει χειρότερη απόδοση από την σειριακή εκτέλεση. Αντίθετα αν οι διευθύνσεις μνήμης που προσπελάζονται είναι συναυξητικές και ακόμα καλύτερα αν είναι 64 bytes aligned, η διανυσματική επεξεργασία πετυχαίνει πολύ καλύτερες επιδόσεις και είναι ένα είδος παραλληλισμού πάνω σε δεδομένα που βρίσκονται στην ίδια κρυφή μνήμη. Όσον αφορά στη χρήση νημάτων στον Xeon Phi, θα πρέπει κανείς να είναι ιδιαίτερα προσεκτικός στην αποφυγή «κρίσιμων τμημάτων» κώδικα, είτε αυτό αφορά εγγραφές σε κοινές θέσεις μνήμης μεταξύ των νημάτων είτε σε ακόμα χειρότερη περίπτωση αυτό αφορά συναρτήσεις οι οποίες δεν είναι σχεδιασμένες να καλούνται παράλληλα από διαφορετικά νήματα. Αν και τέτοια τμήματα είναι πολλές φορές αναπόφευκτα, η χρήση τους η οποία μπορεί να μην είναι καταστροφική στην εκτέλεση ενός κώδικα από μία σύγχρονη CPU δεν σημαίνει ότι θα έχει την αντίστοιχη συμπεριφορά και στον Xeon Phi. Τόσο το πολύ μεγαλύτερο επίπεδο παραλληλίας, όσο και το γεγονός ότι κάθε πυρήνας του Xeon Phi έχει αρκετά μικρότερη επεξεργαστική ισχύ συγκριτικά με τους πυρήνες μίας σύγχρονης CPU, έχουν ως συνέπεια την πολύ μικρότερη ανοχή του Xeon Phi σε τέτοιου είδους τμημάτων κώδικα. Για την αποδοτική συγγραφή κώδικα λοιπόν, είναι απαραίτητο ο προγραμματιστής να διαθέτει γνώση και εμπειρία πάνω στην αποφυγή «κρίσιμων τμημάτων» όσο αυτό είναι δυνατόν. Δεύτερον είναι πολύ σημαντική η επιλογή κατάλληλου αλγορίθμου από τον προγραμματιστή. Θα πρέπει να επιλεχθεί αλγόριθμος που να παρέχει πολύ υψηλό επίπεδο παραλληλίας και ο οποίος να διαθέτει και την κατάλληλη αριθμητική ευστάθεια σύμφωνα με τις απαιτήσεις της εφαρμογής. ~ 22 ~

4 Xeon Phi και GPU: Συγκρίσεις και παρατηρήσεις Έχουμε ήδη μιλήσει για την αρχιτεκτονική του Xeon Phi και παρατηρούμε ότι ουσιαστικά πρόκειται για ένα system on chip, το οποίο υλοποιεί ένα δακτύλιο μεγάλου εύρους ζώνης που διασυνδέει πολλούς επεξεργαστικούς πυρήνες. Η αρχιτεκτονική των πυρήνων αυτών είναι παρόμοια με μιας CPU και ουσιαστικά το σύστημα βασίζεται στην αποδοτική υλοποίηση της επικοινωνίας μεταξύ των πυρήνων, καθώς και στις μονάδες διανυσματικής επεξεργασίας μεγάλου μήκους που ο κάθε πυρήνας διαθέτει. Η αρχιτεκτονική μιας GPU όμως διαφέρει ριζικά από αυτήν μιας CPU. Λόγω της εξειδίκευσης της για διεργασίες που αφορούν εντατικούς υπολογισμούς (compute intensive), πάνω στην επεξεργασία κάποιου όγκου δεδομένων, ακολουθώντας παρόμοια ροή προγράμματος το μεγαλύτερο μέρος του υλικού αφιερώνεται στην υλοποίηση μεγάλου αριθμού αριθμητικών και λογικών μονάδων (ALU), ενώ τα μεγέθη και περιπλοκότητα των μονάδων ελέγχου ροής προγράμματος και της κρυφής μνήμης είναι σημαντικά πιο περιορισμένα. Αυτό φαίνεται και από το Σχήμα 11. Σχήμα 11: (από [10]) Το αριστερό τμήμα αφορά μία CPU ενώ το δεξί μία GPU Παρουσιάζονται τα σχετικά μεγέθη κάθε στοιχείου της αρχιτεκτονικής του εκάστοτε συστήματος πάνω στο chip Βασικό στοιχείο της αρχιτεκτονικής των GPUs αποτελεί ο Streaming Multiprocessor (SM) και πρόκειται ουσιαστικά για ένα σύστημα χρονοπρογραμματισμού και ελέγχου της ροής προγράμματος για μια «ομάδα» απλών από άποψη αρχιτεκτονικής επεξεργαστικών πυρήνων. Οι πυρήνες που ανήκουν σε αυτήν την «ομάδα» διαμοιράζονται πόρους όπως καταχωρητές και κρυφή μνήμη. Επιπλέον οι επεξεργαστικοί πυρήνες που αναλαμβάνουν νήματα τα οποία ανήκουν στο ίδιο warp (ορολογία της CUDA για την πιο στοιχειώδης ομαδοποίηση νημάτων σε μια GPU) ακολουθούν την ίδια ροή προγράμματος, όμως σε περιπτώσεις εντολών διακλάδωσης μόνο οι πυρήνες που ικανοποιούν την σχέση της εντολής συνεχίζουν την ροή εκτέλεσης ενώ οι υπόλοιποι περιμένουν μέχρι να συνεχιστεί η φυσιολογική ροή προγράμματος. Αντίστοιχα κάποιοι πυρήνες του warp μπορεί να μείνουν ανενεργοί είτε λόγω απαίτησης μικρότερου αριθμού νημάτων από ότι είναι το μέγεθος ενός warp είτε λόγο πρόωρου τερματισμού συγκεκριμένων νημάτων. Η λογική χρήσης αυτή θυμίζει single instruction multiple data stream (SIMD), καθότι κάθε πυρήνας επεξεργάζεται διαφορετικά δεδομένα αλλά όλοι έχουν παρόμοια ροή εκτέλεσης. Στο Σχήμα 12 βλέπουμε την αρχιτεκτονική ενός SM, καθώς και το γεγονός ότι μια GPU αποτελείται από πολλά τέτοια συστήματα. ~ 23 ~

Σχήμα 12: (από [10]) Αρχιτεκτονική μίας σύγχρονης GPU. Στα αριστερά βλέπουμε την αρχιτεκτονική του κάθε SM από τους οποίους αποτελείται, ενώ στα δεξιά την αρχιτεκτονική κάθε πυρήνα από τους οποίους ο SM αποτελείται Η επικοινωνία μεταξύ των SM καθώς και ο χρονοπρογραμματισμός και διαμοιρασμός του υπολογιστικού φόρτου αφορά την αρχιτεκτονική της εκάστοτε GPU και δεν θα μπούμε αναφερθούμε σε περαιτέρω λεπτομέρειες για τις αρχιτεκτονικές αυτές. Μπορούμε όμως ήδη να δούμε το επίπεδο παραλληλίας σε επίπεδο υλικού που επιτυγχάνεται και τι θυσιάζεται για να επιτευχθεί αυτό. Με λίγα λόγια μια GPU θυσιάζει το latency για όσο μεγαλύτερο throughput γίνεται. 4.1 Προγραμματιστικά μοντέλα Στην ενότητα αυτή θα επικεντρωθούμε στα προγραμματιστικά μοντέλα των συστημάτων Xeon Phi και GPU, συγκεκριμένα για GPU θα αναφερθούμε στο προγραμματιστικό μοντέλο CUDA της NVIDIA. Θα προσπαθήσουμε να συγκρίνουμε τα δύο αυτά μοντέλα, καθώς και να αναφέρουμε πιο λεπτομερώς ποια είναι τα σημεία που θα πρέπει κάποιος να προσέξει όταν κάνει μια υλοποίηση που αφορά τα συστήματα αυτά. Αρχικά όσον αναφορά στον Xeon Phi θα πρέπει να αναφέρουμε ότι παρόλο που παρέχει ως και 4 νήματα εκτέλεσης και είναι σχεδιασμένος να αποδίδει καλύτερα με τουλάχιστον 2 νήματα ανά υπολογιστικό πυρήνα (core), για την αποδοτική συγγραφή κώδικα είναι πιο χρήσιμο να θεωρούμε ότι ~ 24 ~

κάθε νήμα έχει ξεχωριστή κρυφή μνήμη (1 νήμα ανά core). Αυτό σημαίνει ότι έχουμε καλή απόδοση όταν κάθε νήμα επεξεργάζεται δεδομένα που βρίσκονται μόνο στην δική του κρυφή μνήμη και πιο συγκεκριμένα οι εγγραφές σε μια cache line από διαφορετικά νήματα προκαλούν σημαντική επιβράδυνση της εκτέλεσης του κώδικα. Αντιθέτως στο προγραμματιστικό μοντέλο CUDA, έχουμε 2 βασικές δομές στις οποίες διαχωρίζουμε τα νήματα που ορίζουμε για την εκτέλεση του κώδικα. Η πρώτη αποκαλείται CUDA block και πρόκειται για την απεικόνιση των νημάτων σε ένα τρισδιάστατο πίνακα και η δεύτερη CUDA Grid και πρόκειται για την απεικόνιση των όμοιων διαστάσεων CUDA blocks σε ένα τρισδιάστατο πίνακα. Στο μοντέλο αυτό τα νήματα που ανήκουν στο ίδιο CUDA block θεωρούμε ότι διαθέτουν κοινή κρυφή μνήμη και αυτό γιατί τα νήματα στο ίδιο CUDA block εκτελούνται στον ίδιο Streaming Multiprocessor (SM) και συνεπώς χρησιμοποιούν τμήμα της κρυφής μνήμης που αυτός διαθέτει. Ένα ακόμα σημαντικό στοιχείο στην εγγραφή κώδικα με χρήση CUDA είναι πως για την αποδοτική προσπέλαση της DRAM (καθολικής μνήμης), θα πρέπει τα νήματα στο ίδιο CUDA block να προσπελαύνουν ταυτόχρονα συναυξητικές διευθύνσεις στην μνήμη (coalesced memory access patterns). Με βάση τα όσα είπαμε για το μοντέλο CUDA καταλαβαίνει κανείς ότι εφόσον κάθε νήμα αναλαμβάνει κάποιο τμήμα του αρχικού συστήματος Ax = f, αν κρατήσουμε την αρχική δομή του συστήματος στην μνήμη τότε τα νήματα στο ίδιο CUDA block θα προσπελαύνουν την DRAM ανά βήμα m, όπου m το μέγεθος του τμήματος που το κάθε νήμα αναλαμβάνει. Αυτός ο τρόπος προσπέλασης της μνήμης όμως δεν είναι αποδοτικός σύμφωνα με όσα αναφέραμε. Για αυτό το λόγο στην εκδοχή του αλγορίθμου για GPU [4] τα δεδομένα αναδιατάχθηκαν έτσι ώστε όσα χρειάζεται κάθε νήμα σε κάθε βήμα εκτέλεσης του, να βρίσκονται σε διαδοχικές θέσεις μνήμης μεταξύ τους για κάθε νήμα που ανήκει στο ίδιο CUDA block. Θα πρέπει να αναφέρουμε ότι η τεχνική αυτή υιοθετήθηκε από την αντίστοιχη υλοποίηση της εργασίας [11]. Η αναδιάταξη των δεδομένων αυτή φαίνεται και από το Σχήμα 13. Σχήμα 13: Μορφή αποθήκευσης του μητρώου στην μνήμη πριν (στο πάνω μέρος) και μετά την αναδιάταξη (στο κάτω μέρος). Αφορά τα δεδομένα που αντιστοιχούν σε ένα CUDA block ~ 25 ~