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

Σχετικά έγγραφα
ΤΕΧΝΙΚΕΣ ΑΥΞΗΣΗΣ ΤΗΣ ΑΠΟΔΟΣΗΣ ΤΩΝ ΥΠΟΛΟΓΙΣΤΩΝ I

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

Instruction Execution Times

ΚΥΠΡΙΑΚΗ ΕΤΑΙΡΕΙΑ ΠΛΗΡΟΦΟΡΙΚΗΣ CYPRUS COMPUTER SOCIETY ΠΑΓΚΥΠΡΙΟΣ ΜΑΘΗΤΙΚΟΣ ΔΙΑΓΩΝΙΣΜΟΣ ΠΛΗΡΟΦΟΡΙΚΗΣ 19/5/2007

EE512: Error Control Coding

HOMEWORK 4 = G. In order to plot the stress versus the stretch we define a normalized stretch:

2 Composition. Invertible Mappings

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

Εγκατάσταση λογισμικού και αναβάθμιση συσκευής Device software installation and software upgrade

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

Section 8.3 Trigonometric Equations

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

CMOS Technology for Computer Architects

[1] P Q. Fig. 3.1

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

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

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

ΚΥΠΡΙΑΚΗ ΕΤΑΙΡΕΙΑ ΠΛΗΡΟΦΟΡΙΚΗΣ CYPRUS COMPUTER SOCIETY ΠΑΓΚΥΠΡΙΟΣ ΜΑΘΗΤΙΚΟΣ ΔΙΑΓΩΝΙΣΜΟΣ ΠΛΗΡΟΦΟΡΙΚΗΣ 6/5/2006

Assalamu `alaikum wr. wb.

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

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

Εισαγωγή στους Ηλεκτρονικούς Υπολογιστές

Capacitors - Capacitance, Charge and Potential Difference

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

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

Κεφάλαιο 1 Αφαιρετικότητα και Τεχνολογία Υπολογιστών (Computer Abstractions and Technology)

Homework 3 Solutions

the total number of electrons passing through the lamp.

CHAPTER 25 SOLVING EQUATIONS BY ITERATIVE METHODS

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

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

Σχολή Μηχανικής και Τεχνολογίας. Πτυχιακή διατριβή

Ανάπτυξη διαδικτυακής διαδραστικής εκπαιδευτικής εφαρμογής σε λειτουργικό σύστημα Android


ΤΕΧΝΟΛΟΓΙΚΟ ΠΑΝΕΠΙΣΤΗΜΙΟ ΚΥΠΡΟΥ ΣΧΟΛΗ ΜΗΧΑΝΙΚΗΣ ΚΑΙ ΤΕΧΝΟΛΟΓΙΑΣ. Πτυχιακή εργασία

ΚΥΠΡΙΑΚΟΣ ΣΥΝΔΕΣΜΟΣ ΠΛΗΡΟΦΟΡΙΚΗΣ CYPRUS COMPUTER SOCIETY 21 ος ΠΑΓΚΥΠΡΙΟΣ ΜΑΘΗΤΙΚΟΣ ΔΙΑΓΩΝΙΣΜΟΣ ΠΛΗΡΟΦΟΡΙΚΗΣ Δεύτερος Γύρος - 30 Μαρτίου 2011

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

Μεταπτυχιακή διατριβή. Ανδρέας Παπαευσταθίου

Potential Dividers. 46 minutes. 46 marks. Page 1 of 11

Εικονική Μνήμη (virtual memory)

Πώς μπορεί κανείς να έχει έναν διερμηνέα κατά την επίσκεψή του στον Οικογενειακό του Γιατρό στο Ίσλινγκτον Getting an interpreter when you visit your

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

The challenges of non-stable predicates

Τελική Εξέταση, Απαντήσεις/Λύσεις

Phys460.nb Solution for the t-dependent Schrodinger s equation How did we find the solution? (not required)

GPU. CUDA GPU GeForce GTX 580 GPU 2.67GHz Intel Core 2 Duo CPU E7300 CUDA. Parallelizing the Number Partitioning Problem for GPUs

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

ΤΕΧΝΟΛΟΓΙΚΟ ΠΑΝΕΠΙΣΤΗΜΙΟ ΚΥΠΡΟΥ ΣΧΟΛΗ ΓΕΩΠΟΝΙΚΩΝ ΕΠΙΣΤΗΜΩΝ ΚΑΙ ΕΠΙΣΤΗΜΗΣ ΚΑΙ ΤΕΧΝΟΛΟΓΙΑΣ ΠΕΡΙΒΑΛΛΟΝΤΟΣ. Πτυχιακή εργασία

ΤΕΧΝΟΛΟΓΙΚΟ ΠΑΝΕΠΙΣΤΗΜΙΟ ΚΥΠΡΟΥ ΣΧΟΛΗ ΜΗΧΑΝΙΚΗΣ ΚΑΙ ΤΕΧΝΟΛΟΓΙΑΣ. Πτυχιακή εργασία ΟΛΙΣΘΗΡΟΤΗΤΑ ΚΑΙ ΜΑΚΡΟΥΦΗ ΤΩΝ ΟΔΟΔΤΡΩΜΑΤΩΝ ΚΥΚΛΟΦΟΡΙΑΣ

3.4 SUM AND DIFFERENCE FORMULAS. NOTE: cos(α+β) cos α + cos β cos(α-β) cos α -cos β

Section 7.6 Double and Half Angle Formulas

TMA4115 Matematikk 3

Block Ciphers Modes. Ramki Thurimella

Right Rear Door. Let's now finish the door hinge saga with the right rear door

ΤΕΧΝΟΛΟΓΙΚΟ ΠΑΝΕΠΙΣΤΗΜΙΟ ΚΥΠΡΟΥ ΣΧΟΛΗ ΓΕΩΤΕΧΝΙΚΩΝ ΕΠΙΣΤΗΜΩΝ ΚΑΙ ΔΙΑΧΕΙΡΙΣΗΣ ΠΕΡΙΒΑΛΛΟΝΤΟΣ. Πτυχιακή εργασία

Εθνικό Μετσόβιο Πολυτεχνείο Σχολή Ηλεκτρολόγων Μηχανικών - Μηχανικών Υπολογιστών. Αρχιτεκτονική Υπολογιστών Νεκτάριος Κοζύρης.

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

ΕΘΝΙΚΟ ΜΕΤΣΟΒΙΟ ΠΟΛΥΤΕΧΝΕΙΟ ΔΙΑΤΜΗΜΑΤΙΚΟ ΠΡΟΓΡΑΜΜΑ ΜΕΤΑΠΤΥΧΙΑΚΩΝ ΣΠΟΥΔΩΝ ΥΠΟΛΟΓΙΣΤΙΚΗ ΜΗΧΑΝΙΚΗ. ΜΕΤΑΠΤΥΧΙΑΚΗ ΕΡΓΑΣΙΑ του Οικονόμου Μάριου

Chapter 4 (1) Αξιολόγηση και κατανόηση της απόδοσης

Math 6 SL Probability Distributions Practice Test Mark Scheme

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

ΕΙΣΑΓΩΓΗ στους Η/Υ. Δρ. Β Σγαρδώνη. Τμήμα Τεχνολογίας Αεροσκαφών ΤΕΙ ΣΤΕΡΕΑΣ ΕΛΛΑΔΑΣ. Χειμερινό Εξάμηνο

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

Reminders: linear functions

(1) Describe the process by which mercury atoms become excited in a fluorescent tube (3)

ΤΕΧΝΟΛΟΓΙΚΟ ΠΑΝΕΠΙΣΤΗΜΙΟ ΚΥΠΡΟΥ ΣΧΟΛΗ ΓΕΩΤΕΧΝΙΚΩΝ ΕΠΙΣΤΗΜΩΝ ΚΑΙ ΔΙΑΧΕΙΡΙΣΗΣ ΠΕΡΙΒΑΛΛΟΝΤΟΣ. Πτυχιακή εργασία

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

Concrete Mathematics Exercises from 30 September 2016

Finite Field Problems: Solutions

9.09. # 1. Area inside the oval limaçon r = cos θ. To graph, start with θ = 0 so r = 6. Compute dr

Συστήματα σε Ολοκληρωμένα Κυκλώματα

Ηλεκτρονικός οδηγός για τους φοιτητές ενός Α.Ε.Ι.

ΚΒΑΝΤΙΚΟΙ ΥΠΟΛΟΓΙΣΤΕΣ

Γιπλυμαηική Δπγαζία. «Ανθπυποκενηπικόρ ζσεδιαζμόρ γέθςπαρ πλοίος» Φοςζιάνηρ Αθανάζιορ. Δπιβλέπυν Καθηγηηήρ: Νηθφιανο Π. Βεληίθνο

CHAPTER 48 APPLICATIONS OF MATRICES AND DETERMINANTS

The Simply Typed Lambda Calculus

4.6 Autoregressive Moving Average Model ARMA(1,1)

Chapter 4 ( ή 1 στο βιβλίο σας)

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

ΠΑΝΕΠΙΣΤΗΜΙΟ ΘΕΣΣΑΛΙΑΣ ΤΜΗΜΑ ΠΟΛΙΤΙΚΩΝ ΜΗΧΑΝΙΚΩΝ ΤΟΜΕΑΣ ΥΔΡΑΥΛΙΚΗΣ ΚΑΙ ΠΕΡΙΒΑΛΛΟΝΤΙΚΗΣ ΤΕΧΝΙΚΗΣ. Ειδική διάλεξη 2: Εισαγωγή στον κώδικα της εργασίας

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

Approximation of distance between locations on earth given by latitude and longitude

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

Προχωρηµένα Θέµατα Αρχιτεκτονικής

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

derivation of the Laplacian from rectangular to spherical coordinates

ΚΥΠΡΙΑΚΗ ΕΤΑΙΡΕΙΑ ΠΛΗΡΟΦΟΡΙΚΗΣ CYPRUS COMPUTER SOCIETY ΠΑΓΚΥΠΡΙΟΣ ΜΑΘΗΤΙΚΟΣ ΔΙΑΓΩΝΙΣΜΟΣ ΠΛΗΡΟΦΟΡΙΚΗΣ 24/3/2007

Modbus basic setup notes for IO-Link AL1xxx Master Block

DESIGN OF MACHINERY SOLUTION MANUAL h in h 4 0.

Shmei sveic Perigrafik c Statisvtik c

Πέτρος Γ. Οικονομίδης Πρόεδρος και Εκτελεστικός Διευθυντής

Κτίρια nζεβ και προσομοίωση με την χρήση του energy+

C.S. 430 Assignment 6, Sample Solutions

HISTOGRAMS AND PERCENTILES What is the 25 th percentile of a histogram? What is the 50 th percentile for the cigarette histogram?

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

ΕΘΝΙΚΟ ΜΕΤΣΟΒΙΟ ΠΟΛΥΤΕΧΝΕΙΟ ΣΧΟΛΗ ΠΟΛΙΤΙΚΩΝ ΜΗΧΑΝΙΚΩΝ. «Θεσμικό Πλαίσιο Φωτοβολταïκών Συστημάτων- Βέλτιστη Απόδοση Μέσω Τρόπων Στήριξης»

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

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

Math221: HW# 1 solutions

ΤΕΧΝΟΛΟΓΙΚΟ ΠΑΝΕΠΙΣΤΗΜΙΟ ΚΥΠΡΟΥ ΣΧΟΛΗ ΕΠΙΣΤΗΜΩΝ ΥΓΕΙΑΣ ΤΜΗΜΑ ΝΟΣΗΛΕΥΤΙΚΗΣ. Πτυχιακή εργασία

Transcript:

ΕΘΝΙΚΟ ΜΕΤΣΟΒΙΟ ΠΟΛΥΤΕΧΝΕΙΟ ΣΧΟΛΗ ΗΛΕΚΤΡΟΛΟΓΩΝ ΜΗΧΑΝΙΚΩΝ ΚΑΙ ΜΗΧΑΝΙΚΩΝ ΥΠΟΛΟΓΙΣΤΩΝ ΤΟΜΕΑΣ ΤΕΧΝΟΛΟΓΙΑΣ ΠΛΗΡΟΦΟΡΙΚΗΣ ΚΑΙ ΥΠΟΛΟΓΙΣΤΩΝ ΕΡΓΑΣΤΗΡΙΟ ΥΠΟΛΟΓΙΣΤΙΚΩΝ ΣΥΣΤΗΜΑΤΩΝ Υλοποίηση και βελτιστοποίηση αλγορίθμων για πολυπύρηνα συστήματα και επιταχυντές ΔΙΠΛΩΜΑΤΙΚΗ ΕΡΓΑΣΙΑ του Γιώργου Δ. Ζαχαριάδη Επιβλέπων: Νεκτάριος Κοζύρης Καθηγητής Ε.Μ.Π. Αθήνα, Ιούλιος 2014

ΕΘΝΙΚΟ ΜΕΤΣΟΒΙΟ ΠΟΛΥΤΕΧΝΕΙΟ ΣΧΟΛΗ ΗΛΕΚΤΡΟΛΟΓΩΝ ΜΗΧΑΝΙΚΩΝ ΚΑΙ ΜΗΧΑΝΙΚΩΝ ΥΠΟΛΟΓΙΣΤΩΝ ΤΟΜΕΑΣ ΤΕΧΝΟΛΟΓΙΑΣ ΠΛΗΡΟΦΟΡΙΚΗΣ ΚΑΙ ΥΠΟΛΟΓΙΣΤΩΝ ΕΡΓΑΣΤΗΡΙΟ ΥΠΟΛΟΓΙΣΤΙΚΩΝ ΣΥΣΤΗΜΑΤΩΝ Υλοποίηση και βελτιστοποίηση αλγορίθμων για πολυπύρηνα συστήματα και επιταχυντές ΔΙΠΛΩΜΑΤΙΚΗ ΕΡΓΑΣΙΑ του Γιώργου Δ. Ζαχαριάδη Επιβλέπων: Νεκτάριος Κοζύρης Καθηγητής Ε.Μ.Π. Εγκρίθηκε από την τριμελή επιτροπή την 25 η Ιουλίου 2014... Νεκτάριος Κοζύρης Καθηγητής Ε.Μ.Π.... Νικόλαος Παπασπύρου Αν. Καθηγητής Ε.Μ.Π.... Γεώργιος Γκούμας Λέκτορας Ε.Μ.Π. Αθήνα, Ιούλιος 2014

... Γεώργιος Δ. Ζαχαριάδης Διπλωματούχος Ηλεκτρολόγος Μηχανικός και Μηχανικός Υπολογιστών Ε.Μ.Π. Copyright Γεώργιος Δ. Ζαχαριάδης, 2014. Με επιφύλαξη παντός δικαιώματος. All rights reserved. Απαγορεύεται η αντιγραφή, αποθήκευση και διανομή της παρούσας εργασίας, εξ ολοκλήρου ή τμήματος αυτής, για εμπορικό σκοπό. Επιτρέπεται η ανατύπωση, αποθήκευση και διανομή για σκοπό μη κερδοσκοπικό, εκπαιδευτικής ή ερευνητικής φύσης, υπό την προϋπόθεση να αναφέρεται η πηγή προέλευσης και να διατηρείται το παρόν μήνυμα. Ερωτήματα που αφορούν τη χρήση της εργασίας για κερδοσκοπικό σκοπό πρέπει να απευθύνονται προς τον συγγραφέα. Οι απόψεις και τα συμπεράσματα που περιέχονται σε αυτό το έγγραφο εκφράζουν τον συγγραφέα και δεν πρέπει να ερμηνευθεί ότι αντιπροσωπεύουν τις επίσημες θέσεις του Εθνικού Μετσόβιου Πολυτεχνείου.

Περίληψη Τα τελευταία χρόνια, το τοπίο σ τα σ ύγχρονα σ υσ τήματα παράλληλης επεξεργασ ίας έχει αλλάξει σ ε μεγάλο βαθμό. Η βελτίωσ η των υπολογισ τικών επιδόσ εων έχει επέλθει από τη σ ημαντική αύξησ η των επεξεργασ τικών πυρήνων και όχι από την αύξησ η της σ υχνότητας λειτουργίας, όπως σ υνέβαινε σ χεδόν τις δύο τελευταίες δεκαετίες. Συνεπώς, σ τις μέρες μας οι πολυπύρηνοι επεξεργασ τές (multicore) φιλοξενούν μέχρι και 12 ή 15 πυρήνες ανά επεξεργασ τή. Επιπλέον, αρχιτεκτονικές επιταχυντών (manycore) σ αν τις κάρτες γραφικών, οι οποίες ενσ ωματώνουν πολλούς απλούσ τερους επεξεργασ τικούς πυρήνες, προσ φέρουν πολύ υψηλές υπολογισ τικές δυνατότητες και σ ημαντικές ευκαιρίες για εφαρμογές παράλληλου προγραμματισ μού. Ομως, η δυσ κολία σ τον προγραμματισ μό τους και τα διαφορετικά προγραμματισ τικά μοντέλα που ακολουθούν, αποτελούν μεγάλη πρόκλησ η για τους προγραμματισ τές. Σκοπός της παρούσ ας διπλωματικής εργασ ίας είναι η υλοποίησ η και η βελτισ τοποίησ η των αλγορίθμων Floyd Warshall και LU Decomposition σ ε σ υσ τήματα πολυπύρηνων επεξεργασ τών, σ ε κάρτες γραφικών της εταιρίας Nvidia και σ τη νέα manycore αρχιτεκτονική της εταιρίας Intel (Many Integrated Core). Στόχος είναι τόσ ο η αντιμετώπισ η των προκλήσ εων που παρουσ ιάζονται, όσ ο και η σ ύγκρισ η και η αξιολόγησ η των παραπάνω διαφορετικών αρχιτεκτονικών. Λέξεις Κλειδιά Πολυπύρηνοι επεξεργασ τές, Υπολογισ μοι Γενικού Σκοπού σ ε Κάρτες Γραφικών (GPGPU), Κάρτα Γραφικών (GPU), CUDA, αρχιτεκτονική Nvidia Fermi, αρχιτεκτονική Nvidia Kepler, Intel Many Integrated Core (MIC), Intel Xeon Phi, Floyd Warshall, LU Decomposition

Abstract In recent years, the landscape of modern parallel processing systems has changed greatly. Advancement in computer performance has been coming through hardware parallelism instead of from the clock-rate increases that we enjoyed for roughly 20 years. As a result, multicore processors have taken us from one core per processor up to 12 or 15 cores per processor today. Moreover, manycore architectures like GPU accelerators, which incorporate many simpler processor cores, offer very high computational capabilities and significant opportunities for parallel programming. However, the difficulties in programming such devices and their unfamiliar programming models present a major challenge for developers. The purpose of the current diploma thesis is the implementation and optimization of Floyd Warshall and LU Decomposition algorithms on multicore architectures, Nvidia GPUs and Intel s new manycore architecture (Many Integrated Core). The goal is to address the challenges presented and to compare and evaluate all these different architectures. Keywords Multicore, Manycore, General Purpose computing on GPUs (GPGPU), Graphics Processing Unit (GPU), CUDA, Nvidia Fermi, Nvidia Kepler, Intel Many Integrated Core (MIC), Intel Xeon Phi, Floyd Warshall, LU Decomposition

Ευχαρισ τίες Η παρούσ α διπλωματική εργασ ία εκπονήθηκε σ το Εργασ τήριο Υπολογισ τικών Συσ τημάτων της Σχολής Ηλεκτρολόγων Μηχανικών και Μηχανικών Υπολογισ τών του Εθνικού Μετσ όβιου Πολυτεχνείου, υπό την επίβλεψη του Καθηγητή Ε.Μ.Π. Νεκτάριου Κοζύρη. Αρχικά, θα ήθελα να ευχαρισ τήσ ω τον καθηγητή μου κ. Κοζύρη τόσ ο για την ευκαιρία που μου έδωσ ε να έρθω σ ε επαφή με τον επισ τημονικό τομέα των υπολογισ τικών σ υσ τημάτων όσ ο και για τις γνώσ εις και την έμπνευσ η που μου προσ έφερε κατά τη διάρκεια των σ πουδών μου. Στη σ υνέχεια, θα ήθελα να ευχαρισ τήσ ω ιδιαιτέρως τον Λέκτορα Γιώργο Γκούμα και την Υποψήφια Διδάκτωρ Νικέλα Παπαδοπούλου για την καθοδήγησ ή τους και τις πολύτιμες σ υμβουλές τους κατά την εκπόνησ η της παρούσ ας διπλωματικής εργασ ίας. Επίσ ης, θα ήθελα να ευχαρισ τήσ ω θερμά την οικογένειά μου και τους φίλους μου για την αμέρισ τη σ υμπαράσ τασ η και την υποσ τήριξή τους όλα αυτά τα χρόνια. Τέλος, θα ήθελα να ευχαρισ τήσ ω την εταιρία Nvidia για την πρόσ βασ η που μου παρείχε σ το HPC Cluster της. Γιώργος Ζαχαριάδης

Περιεχόμενα Περίληψη............................................... 5 Abstract................................................ 7 Ευχαρισ τίες............................................. 9 Κεφάλαιο 1. Εισ αγωγικά.................................... 13 1.1. Η παραλληλία πριν τους επεξεργασ τές πολλαπλών πυρήνων................. 13 1.1.1. Παραλληλισ μός σ ε επίπεδο bit (Bit Level Parallelism)............... 14 1.1.2. Παραλληλισ μός σ ε επίπεδο εντολής (Instruction Level Parallelism)........ 14 1.1.3. Παραλληλισ μός σ ε επίπεδο νημάτων (Thread Level Parallelism).......... 15 1.1.4. Παραλληλισ μός σ ε επίπεδο δεδομένων (Data Level Parallelism).......... 17 1.2. Αιτίες της σ τροφής προς τους επεξεργασ τές πολλαπλών πυρήνων............. 19 1.2.1. Power wall....................................... 19 1.2.2. ILP wall........................................ 22 1.2.3. Memory wall..................................... 23 1.3. Από τις Multicore σ τις Manycore αρχιτεκτονικές...................... 24 1.3.1. Κάρτες Γραφικών................................... 24 1.3.2. Intel MIC....................................... 28 1.4. Σκοπός και δομή της διπλωματικής εργασ ίας......................... 29 Κεφάλαιο 2. Παράλληλος Προγραμματισ μός....................... 31 2.1. Προγραμματισ μός σ ε πολλούς επεξεργασ τές......................... 31 2.1.1. Αρχιτεκτονικές Μοιραζόμενης Μνήμης....................... 32 2.1.2. OpenMP........................................ 34 2.2. Προγραμματισ μός σ ε Κάρτες Γραφικών........................... 41 2.2.1. Προγραμματισ τικό μοντέλο CUDA.......................... 41 2.2.2. Αρχιτεκτονική Fermi................................. 45 2.2.3. Αρχιτεκτονική Kepler................................. 51 2.2.4. Γλώσ σ α προγραμματισ μού CUDA C........................ 53 2.3. Προγραμματισ μός σ ε Intel Xeon Phi............................ 56 2.3.1. Αρχιτεκτονική του Xeon Phi............................. 56 2.3.2. Μοντέλο εκτέλεσ ης.................................. 59 2.4. Πειραματικός Εξοπλισ μός - Πλατφόρμες Δοκιμών..................... 61 2.4.1. Συσ τήματα πολλαπλών επεξεργασ τών........................ 61 2.4.2. Κάρτες Γραφικών................................... 64 2.4.3. Intel Xeon Phi.................................... 64 Κεφάλαιο 3. Αλγόριθμοι.................................... 67 3.1. Floyd - Warshall........................................ 67 3.1.1. Ορισ μοί........................................ 67

12 Περιεχόμενα 3.1.2. Τρόποι αναπαράσ τασ ης γράφων........................... 67 3.1.3. Το πρόβλημα..................................... 68 3.1.4. Ο αλγόριθμος..................................... 69 3.2. LU decomposition (Παραγοντοποίησ η LU)......................... 70 3.2.1. Ο αλγόριθμος..................................... 70 Κεφάλαιο 4. Υλοποίησ η αλγορίθμου Floyd-Warshall................. 73 4.1. Yλοποίησ η σ ε σ υσ τήματα πολλαπλών επεξεργασ τών..................... 73 4.1.1. Σειριακή υλοποίησ η................................. 77 4.1.2. Αναδρομική υλοποίησ η................................ 80 4.1.3. Tiled υλοποίησ η................................... 84 4.1.4. Συγκεντρωτικά αποτελέσ ματα............................ 91 4.2. Yλοποίησ η σ ε κάρτες γραφικών................................ 94 4.2.1. Global Memory υλοποίησ η............................. 95 4.2.2. Global Memory υλοποίησ η χωρίς περιορισ μό μνήμης κάρτας γραφικών...... 102 4.2.3. Shared Memory υλοποίησ η............................. 105 4.2.4. Shared Memory υλοποίησ η χωρίς περιορισ μό μνήμης κάρτας γραφικών...... 109 4.2.5. Συγκεντρωτικά αποτελέσ ματα............................ 114 4.3. Υλοποίησ η σ τον Intel Xeon Phi............................... 116 4.4. Συμπεράσ ματα......................................... 120 Κεφάλαιο 5. Υλοποίησ η αλγορίθμου LU Decomposition................ 123 5.1. Yλοποίησ η σ ε σ υσ τήματα πολλαπλών επεξεργασ τών.................... 123 5.1.1. Σειριακή υλοποίησ η................................. 123 5.1.2. Αναδρομική υλοποίησ η................................ 125 5.1.3. Tiled υλοποίησ η................................... 128 5.1.4. Συγκεντρωτικά αποτελέσ ματα............................ 131 5.2. Yλοποίησ η σ ε κάρτες γραφικών................................ 133 5.2.1. Global Memory υλοποίησ η.............................. 134 5.3. Υλοποίησ η σ τον Intel Xeon Phi............................... 136 5.4. Συμπεράσ ματα......................................... 139 Κεφάλαιο 6. Συμπεράσ ματα.................................. 143 Λίσ τα Σχημάτων.......................................... 145 Λίσ τα Πινάκων........................................... 149 Συντομογραφία........................................... 151 Βιβλιογραφία............................................ 153

Κεφάλαιο 1 Εισ αγωγικά Ο όρος «παράλληλη επεξεργασ ία» ήταν ανέκαθεν σ ημαντικός για την επισ τήμη των υπολογισ τών και σ υνεχίζει να σ υγκεντρώνει μεγάλο μέρος της έρευνας. Παλαιότερα, ήταν ταυτισ μένος μόνο με μεγάλους υπερυπολογισ τές (supercomputers). Στις μέρες μας, έχει αρχίσ ει να γίνεται όλο και πιο δημοφιλής σ ε πολλούς τομείς εκτός αυτού της επισ τήμης των υπολογισ τών. Αιτία για όλα αυτά είναι η ευρύτατη χρήσ η επεξεργασ τών που διαθέτουν πολλαπλούς πυρήνες σ ε προσ ωπικούς υπολογισ τές και άλλες ηλεκτρονικές σ υσ κευές της καθημερινότητας. Τα περισ σ ότερα προβλήματα μπορούν να διαιρεθούν σ ε μικρότερα τμήματα/υποπροβλήματα. Ο βαθμός της διαίρεσ ης εξαρτάται κυρίως από τη φύσ η του προβλήματος και των δεδομένων. Αυτό το χαρακτηρισ τικό εκμεταλλεύεται η παράλληλη επεξεργασ ία. Προσ παθεί με τη χρησ ιμοποίησ η πολλών επεξεργασ τικών μονάδων, που επικοινωνούν μεταξύ τους υπό καθεσ τώς σ υνεργασ ίας, να επιλύσ ει μεγάλα προβλήματα σ ε μικρότερο χρόνο [3]. Αποτελεί ένα αρκετά δύσ κολο εγχείρημα καθώς έρχεται αντιμέτωπη με πολλαπλά ζητήματα. Από την πλευρά του υλικού (hardware) μερικά από αυτά είναι ο αριθμός, η ισ χύς και η πολυπλοκότητα των επεξεργασ τικών μονάδων, ο τρόπος με τον οποίο θα επικοινωνούν και θα σ υνεργάζονται μεταξύ τους. Επίσ ης, σ ημαντικό ζήτημα είναι η ενέργεια που καταναλώνουν τόσ ο οι επεξεργασ τικές μονάδες, όσ ο και τα υπόλοιπα δομικά σ τοιχεία που απαιτούνται για την αποδοτική επικοινωνία και σ υνεργασ ία τους. Φυσ ικά, όλα τα προηγούμενα από μόνα τους δεν έχουν κανένα νόημα χωρίς τη σ υμβολή του προγραμματισ τή (software). Προκειμένου να εκμεταλλευτεί σ το έπακρο το 100% των δυνατοτήτων που του παρέχει το hardware, πρέπει να κατανοήσ ει τον τρόπο λειτουργίας και σ υγχρονισ μού των μονάδων επεξεργασ ίας και τον τρόπο που επικοινωνούν με τη μνήμη. Το έργο του για την κατασ κευή ενός αποδοτικού παράλληλου προγράμματος παραμένει δύσ κολο, παρά τις προόδους που έχουν σ υντελεσ τεί τα τελευταία χρόνια. 1.1. Η παραλληλία πριν τους επεξεργαστές πολλαπλών πυρήνων Η ιδέα του παραλληλισ μού προϋπάρχει σ χεδόν από την εποχή της ανάπτυξης των πρώτων επεξεργασ τών. Χρειάσ τηκαν πολλά σ τάδια βελτισ τοποιήσ εων για την εκμετάλλευσ η της παραλληλίας σ ε επίπεδο ενός επεξεργασ τικού πυρήνα πριν φτάσ ουμε σ τους πολυπύρηνους επεξεργασ τές που γνωρίζουμε σ ήμερα. Στη σ υνέχεια, θα αναφερθούν επιγραμματικά τα σ τάδια αυτά, τα οποία παρουσ ιάζονται σ το Σχήμα 1.1.

14 Κεφάλαιο 1. Εισ αγωγικά Instruction Level Parallelism Bit Level Parallelism Pipeline Superscalar OoO Execution Thread Level Parallelism Data Level Parallelism (SSE, AVX) Σχ. 1.1: Στάδια εκμετάλλευσ ης παραλληλισ μού σ ε επίπεδο ενός επεξεργασ τικού πυρήνα 1.1.1. Παραλληλισ μός σ ε επίπεδο bit (Bit Level Parallelism) Από τη δεκαετία του 70 μέχρι περίπου τα μέσ α της δεκαετίας του 80, η αύξησ η των επιδόσ εων των επεξεργασ τών ερχόταν μέσ ω της αύξησ ης του μήκους λέξης (word). Αρχικά, οι επεξεργασ τές 4-bit έδωσ αν τη θέσ η τους σ ε επεξεργασ τές 8-bit, οι οποίοι σ τη σ υνέχεια αντικατασ τάθηκαν από επεξεργασ τές 16-bit. Με κάθε διπλασ ιασ μό του μήκους λέξης, μειώνεται ο αριθμός των εντολών που απαιτούνται για τον υπολογισ μό της ίδιας πράξης. Τελικά, σ τις αρχές του 1980 παρουσ ιάσ τηκαν επεξεργασ τές με μέγεθος λέξης 32-bit. Παρέμειναν σ ε αυτό το μέγεθος για αρκετά χρόνια μέχρι τις αρχές του 2000 όπου παρουσ ιάσ τηκαν οι πρώτοι επεξεργασ τές ευρείας χρήσ ης με μέγεθος λέξης 64-bit. Υπήρχαν ήδη επεξεργασ τές 64-bit που απευθύνονταν κυρίως για επισ τημονικές εφαρμογές και μεγάλα υπολογισ τικά σ υσ τήματα. Πέρα από λόγους επιδόσ εων, σ ημαντική αφορμή για τη μετάβασ η από τα 32-bit σ τα 64-bit ήταν η ανάγκη για μεγαλύτερο χώρο διευθύνσ εων καθώς το όριο των 2 32 (4 GB) δεν ήταν πια αρκετό. [2] 1.1.2. Παραλληλισ μός σ ε επίπεδο εντολής (Instruction Level Parallelism) Ενας δεύτερος τρόπος παραλληλισ μού που άρχισ ε να εφαρμόζεται από τα μέσ α της δεκαετίας του 80 ήταν σ ε επίπεδο εντολής (ILP). Η ιδέα είναι να εκτελούνται εντολές παράλληλα, όσ ο αυτό είναι δυνατό. Υπήρξαν αρκετές βελτιώσ εις και καινοτομίες μέχρι να φτάσ ουμε σ τους σ ημερινούς επεξεργασ τές. Τεχνική Σωλήνωσ ης (Pipelining) Οταν εισ έρχεται μια εντολή σ τον επεξεργασ τή διέρχεται από αρκετά σ τάδια μέχρι να ολοκληρωθεί η εκτέλεσ ή της. Καθένα από αυτά τα σ τάδια απαιτεί ένα κύκλο ρολογιού. Πριν την εφαρμογή της τεχνικής της σ ωλήνωσ ης, η εντολή που ήταν προς εκτέλεσ η σ ε κάποιο σ τάδιο του επεξεργασ τή μονοπωλούσ ε και τα υπόλοιπα σ τάδια μέχρι να ολοκληρωθεί. Συνεπώς, η ταχύτητα ολοκλήρωσ ης εντολών ανά κύκλο ρολογιού ήταν πάρα πολύ μικρή. Με την τεχνική της σ ωλήνωσ ης, σ τόχος είναι σ ε κάθε κύκλο ρολογιού να εισ έρχεται μια νέα εντολή προς εκτέλεσ η ώσ τε ανά πάσ α σ τιγμή να χρησ ιμοποιούνται όλα τα σ τάδια του επεξεργασ τή (από διαφορετικές εντολές). Με αυτό τον τρόπο, η ταχύτητα ολοκλήρωσ ης εντολών ανά κύκλο ρολογιού αυξάνεται σ ημαντικά.

1.1. Η παραλληλία πριν τους επεξεργασ τές πολλαπλών πυρήνων 15 Υπερβαθμωτοί Επεξεργασ τές (Superscalar) Με τον καιρό, όσ ο εξελισ σ όταν ο τομέας της τεχνολογίας των υλικών και οι τεχνολογίες κατασ κευής ολοκληρωμένων κυκλωμάτων, τόσ ο αυξανόταν ο αριθμός των τρανζίσ τορ ανά μονάδα επιφάνειας υλικού. Συνεπώς, κατέσ τη δυνατή η ενσ ωμάτωσ η περισ σ ότερων λειτουργικών μονάδων (functional units) σ τον επεξεργασ τή. Με αυτό τον τρόπο, μπορούσ ε να εκτελεί περισ σ ότερες από μια εντολές κατά τη διάρκεια ενός κύκλου ρολογιού, εκδίδοντας πολλαπλές εντολές, που είναι ανεξάρτητες μεταξύ τους, σ τις πολλαπλές λειτουργικές μονάδες. Οι εντολές οι οποίες έχουν εξαρτήσ εις μεταξύ τους εκτελούνται σ ειριακά. Οι επεξεργασ τές αυτοί ονομάζονται Υπερβαθμωτοί Επεξεργασ τές. Εκτέλεσ η εντολών εκτός σ ειράς (Out-of-Order execution) Στη σ υνέχεια, οι επεξεργασ τές που βασ ίζονται σ ε υπερβαθμωτές αρχιτεκτονικές αρχίζουν να υποσ τηρίζουν μια νέα καινοτομία, η οποία είναι η εκτέλεσ η εντολών εκτός σ ειράς. Οι εντολές σ υνεχίζουν να εισ έρχονται σ το pipeline σ ειριακά (in-order issue) αλλά σ τη σ υνέχεια η εκτέλεσ ή τους παύει να είναι σ ειριακή και χρησ ιμοποιείται δυναμική δρομολόγησ η (dynamic scheduling). Με αυτό τον τρόπο, αν μια εντολή δεν είναι έτοιμη προς εκτέλεσ η (π.χ. περιμένει κάποιο όρισ μα από την κύρια μνήμη) ενώ μια επόμενη ανεξάρτητη εντολή είναι έτοιμη, τότε εκείνη εκτελείται. Ετσ ι, αποφεύγεται η αναμονή (stall), που σ ε αντίθετη περίπτωσ η θα ήταν αναγκασ τική. Εδώ να σ ημειωθεί ότι, παρά την εκτέλεσ η εντολών εκτός σ ειράς, τα αποτελέσ ματα των εντολών παραδίδονται σ ειριακά (in-order commit), με την ίδια σ ειρά με την οποία εισ ήλθαν οι εντολές σ το pipeline. 1.1.3. Παραλληλισ μός σ ε επίπεδο νημάτων (Thread Level Parallelism) Μετά την καθιέρωσ η των βελτισ τοποιήσ εων που αναφέρθηκαν προηγουμένως, η εμπειρία έδειξε ότι, παρά την εκτέλεσ η εντολών εκτός σ ειράς και της υποθετικής εκτέλεσ ης εντολών (speculative execution) με βάσ η κάποιον προβλέπτη διακλαδώσ εων (branch predictor), δεν ήταν δυνατή η πλήρης εκμετάλλευσ η όλων των πόρων του επεξεργασ τή. Ενα νήμα δεν μπορεί να παρέχει τον απαραίτητο παραλληλισ μό σ ε επίπεδο εντολών ώσ τε να χρησ ιμοποιούνται όλοι οι επεξεργασ τικοί πόροι σ το μέγισ το δυνατόν. Σε περιπτώσ εις όπως η καθυσ τέρησ η λόγω μεταφοράς δεδομένων από την κύρια μνήμη ή κάποια λανθασ μένη πρόβλεψη διακλάδωσ ης, η αναμονή (stall) είναι αναπόφευκτη. Συνεπώς, οι προσ πάθειες κατευθύνθηκαν σ την εκμετάλλευσ η του παραλληλισ μού σ ε επίπεδο νημάτων (TLP). Η κυριότερη τεχνική είναι η τεχνική SMT (Simultaneous Multithreading). Ο επεξεργασ τής μπορεί να εκτελεί ταυτόχρονα περισ σ ότερα του ενός νήματα. Με αυτό τον τρόπο, αν ένα νήμα οδηγηθεί σ ε κατάσ τασ η αναμονής, τότε μπορεί να εκτελεσ τεί κάποιο άλλο ώσ τε να μη μείνουν οι υπολογισ τικές μονάδες του επεξεργασ τή ανεκμετάλλευτες. Η εναλλαγή των νημάτων πρέπει να γίνεται όσ ο το δυνατόν πιο γρήγορα.

resources every cycle. Instead, SMT is always executing instructions from multiple multithreading threads, leaving it up to the hardware to associate instruction slots and renamed (SMT) A version of multithreading registers with their proper threads. that lowers the cost Figure 6.5 conceptually illustrates the differences in a processor s ability to exploit of multithreading by superscalar resources for the following processor configurations. The top portion shows 16 Κεφάλαιο 1. Εισ αγωγικά utilizing the resources needed for multiple issue, dynamically scheduled Issue slots microarchitecture. Thread A Thread B Thread C Thread D Time Time Issue slots SMT FIGURE 6.5 How four threads use the issue slots of a superscalar processor in different approaches. The four threads at the top show how each would execute running alone on a standard Σχ. 1.2: Τρόπος εκτέλεσ ης τεσ σ άρων ανεξάρτητων νημάτων σ ε υπερβαθμωτό επεξεργασ τή που υποσ τηρίζει SMT would [4] execute running together in three multithreading options. The horizontal dimension represents the superscalar processor without multithreading support. The three examples at the bottom show how they instruction issue capability in each clock cycle. The vertical dimension represents a sequence of clock cycles. An empty (white) box indicates that the corresponding issue slot is unused in that clock cycle. The shades of gray and color correspond to four different threads in the multithreading processors. The additional pipeline Hyper-Threading Technology is feasible for platforms ranging from mobile processors Χαρακτηρισ τικό start-up effects παράδειγμα for coarse multithreading, εφαρμογής which της are not τεχνικής illustrated in του this SMT figure, would είναιlead η τεχνολογία to further loss της Intel in throughput for coarse multithreading. to servers. Its introduction into market segments other than servers is gated only by the που ονομάζεται Hyper-Threading availability Technology and prevalence (HTT). of threaded Συγκεκριμένα applications τμήματα and workloads του επεξεργασ τή in these markets. υπάρχουν σ ε παραπάνω από ένα αντίτυπα (όσ α και τα νήματα που υποσ τηρίζει) ώσ τε να διατηρείται η αρχιτεκτονική κατάσ τασ η (architectural state) κάθε νήματος και να γίνεται γρήγορα η Although existing operating systems and application codes will run correctly on a processor with Hyper-Threading Technology, some relatively simple code practices εναλλαγή μεταξύ τους, όπωςare φαίνεται recommended σ το Σχήμα to get 1.3. the optimum Πρωτοπαρουσ ιάσ τηκε benefit from Hyper-Threading το 2002 αρχικά Technology. σ τους επεξεργασ τές της σ ειράς Xeon και σ τη σ υνέχεια σ τους επεξεργασ τές της σ ειράς Pentium 4 υποσ τηρίζοντας 2 νήματα. tions make Μετέπειτα, use of about χρησ ιμοποιήθηκε 35 percent of the σ εinternal αρκετούς processor επεξεργασ τές execution της resources. The Hyper-Threading Technology does not deliver multiprocessor scaling. Typically, applica- εταιρίας. Η αύξησ η των επιδόσ εων idea behind πουhyper-threading προσ φέρει εξαρτάται Technology απόis το to enable είδος better των προγραμμάτων processor usage and to που εκτελούνται και φτάνει μέχρι achieve και about το 30% 50 percent σ ε σ υγκεκριμένα utilization of resources. σ ενάρια. [5] Architecture State Adv. Programmable Interrupt Contol CPU On-Die Cache Architecture State Adv. Programmable Interrupt Contol Processor Execution Resource A processor with Hyper-Threading Technology may provide a performance gain of 30 percent when executing multithreaded operating system and application code over that of a comparable Intel architecture processor without Hyper-Threading Technology. When placed in a multiprocessorbased system, the increase in computing power generally scales linearly as the number of physical processors in a system is increased; although as in any multiprocessor system, the scalability of performance is highly dependent on the nature of the application. System Bus Figure 5 Architecture of processor with Hyper-Threading Technology. Σχ. 1.3: Αρχιτεκτονική επεξεργασ τή που Dual υποσ τηρίζει Processor Hyper-Threading Hyper-Threading Technology [5] Technology Cache Cache On-Die Cache Architecture State Architecture State Architecture State Architecture State

1.1. Η παραλληλία πριν τους επεξεργασ τές πολλαπλών πυρήνων 17 1.1.4. Παραλληλισ μός σ ε επίπεδο δεδομένων (Data Level Parallelism) Ενας άλλος τρόπος αύξησ ης της επεξεργασ τικής ισ χύος των επεξεργασ τών αποτελεί ο παραλληλισ μός σ ε επίπεδο δεδομένων, δηλαδή η εκτέλεσ η σ τον ίδιο κύκλο ρολογιού της ίδιας εντολής σ ε περισ σ ότερα δεδομένα. Αυτή η τεχνική προϋπάρχει από τα πρώτα χρόνια ανάπτυξης των υπολογισ τών και χρησ ιμοποιείται σ ε ειδικούς επεξεργασ τές επισ τημονικού σ κοπού που ονομάζονται Vector Processors ή ελληνισ τί Διανυσ ματικοί Επεξεργασ τές. SISD SIMD MIMD Instructions Data Results Σχ. 1.4: Αρχιτεκτονικές SISD, SIMD και MIMD Σε αυτό το σ ημείο κρίνεται απαραίτητο να αναφερθεί ο διαχωρισ μός των αρχιτεκτονικών υπολογισ τών με βάσ η την ταξινόμησ η του Flynn (Flynn s taxonomy) [11]. Κριτήριο της ταξινόμησ ης αποτελεί ο αριθμός των ταυτόχρονων ροών (streams) εντολών και των ταυτόχρονων ροών δεδομένων. Αναλυτικότερα: SISD (Single Instruction, Single Data): Αρχιτεκτονικές σ τις οποίες δεν υπάρχει κάποιο επίπεδο παραλληλισ μού και όλα γίνονται σ ειριακά καθώς υπάρχει μόνο μια σ ειριακή ροή εντολών η οποία εφαρμόζεται σ ε μία σ ειριακή ροή δεδομένων. SIMD (Single Instruction, Multiple Data): Αρχιτεκτονικές σ τις οποίες υπάρχει μόνο μια σ ειριακή ροή εντολών αλλά η οποία εφαρμόζεται ταυτόχρονα σ ε πολλές ροές δεδομένων. Είναι εξαιρετικά αποδοτικές σ ε προβλήματα που απαιτούν επεξεργασ ία μεγάλου όγκου δεδομένων. Σε αυτή την κατηγορία ανήκουν ορισ μένες σ ημαντικές εντολές της x86 αρχιτεκτονικής οι οποίες εκμεταλλεύονται τον παραλληλισ μό σ ε επίπεδο δεδομένων, οι κάρτες γραφικών και οι αρχιτεκτονικές διανυσ ματικών επεξεργασ τών. MISD (Multiple Instruction, Single Data): Αρχιτεκτονικές σ τις οποίες υπάρχουν ταυτόχρονα πολλές διαφορετικές ροές εντολών οι οποίες εφαρμόζονται σ ε μία μόνο ροή δεδομένων. Δεν υπάρχει κάποια εμπορική αρχιτεκτονική που να εμπίπτει σ ε αυτή την κατηγορία, αν και ορισ μένοι τοποθετούν εδώ τους διανυσ ματικούς επεξεργασ τές. Τέτοιες αρχιτεκτονικές έχουν χρησ ιμοποιηθεί μόνο σ υσ τήματα όπου η ανοχή σ φαλμάτων (fault tollerance) είναι σ ημαντική καθώς οι ίδιες εντολές εκτελούνται σ ε διαφορετικά σ υσ τήματα και σ υγκρίνονται τα αποτελέσ ματα. MIMD (Multiple Instruction, Multiple Data): Αρχιτεκτονικές σ τις οποίες υπάρχουν ταυτόχρονα πολλές διαφορετικές ροές εντολών οι οποίες εφαρμόζονται σ ε πολλές διαφορετικές ροές δεδομένων. Στην κατηγορία αυτή ανήκουν τα περισ σ ότερα σ ύγχρονα σ υσ τήματα παράλληλων

18 Κεφάλαιο 1. Εισ αγωγικά υπολογισ τών, δηλαδή οι πολυπύρηνοι επεξεργασ τές, τα σ υσ τήματα πολλαπλών επεξεργασ τών καθώς και οι σ υσ τοιχίες των υπερυπολογισ τών. x86 SIMD Extensions Η εκμετάλλευσ η του παραλληλισ μού σ ε επίπεδο δεδομένων σ ε εμπορικούς επεξεργασ τές γενικής χρήσ ης γίνεται με την επέκτασ η του σ ετ εντολών x86 (x86 ISA) και την προσ θήκη νέων SIMD εντολών, δηλαδή διανυσ ματικών εντολών που ακολουθούν τη φιλοσ οφία να εφαρμόζονται ταυτόχρονα σ ε περισ σ ότερα δεδομένα. Παράδειγμα εκτέλεσ ης μιας πράξης πρόσ θεσ ης από SIMD εντολές ακολουθεί σ το Σχήμα 1.5. Scalar SIMD width 2 SIMD width n + + + Σχ. 1.5: Εκτέλεσ η της ίδιας πράξης από Scalar και SIMD αρχιτεκτονικές Η πρώτη προσ πάθεια έγινε από την Intel το 1997 όταν παρουσ ίασ ε το σ ετ εντολών ΜΜΧ σ τους επεξεργασ τές Pentium. Τα μειονεκτήματα των εντολών αυτών ήταν ότι εφαρμόζονταν μόνο σ ε ακέραια δεδομένα και όχι κινητής υποδιασ τολής ενώ ταυτόχρονα δεν εισ ήγαγαν νέους καταχωρητές αλλά χρησ ιμοποιούσ αν τους ήδη υπάρχοντες καταχωρητές για πράξεις κινητής υποδιασ τολής. Για να αντιμετωπισ τούν αυτά τα προβλήματα, το 1999 παρουσ ιάσ τηκε από την Intel και την AMD το πακέτο επέκτασ ης εντολών SSE (Streaming SIMD Extensions), το οποίο αρχικά λειτουργούσ ε για πράξεις κινητής υποδιασ τολής και χρησ ιμοποιούσ ε ξεχωρισ τούς καταχωρητές. Για τους λόγους αυτούς έγινε αρκετά πιο δημοφιλές από το πακέτο MMX. Στη διάρκεια των ετών παρουσ ιάσ τηκαν αρκετές νέες επεκτάσ εις (SSE2, SSE3, SSSE3, SSE4) οι οποίες προσ έθεσ αν περισ σ ότερες εντολές και μεγαλύτερους καταχωρητές 128 bit. Στις αρχές του 2011, η Intel παρουσ ίασ ε το πακέτο επέκτασ ης εντολών AVX (Advanced Vector Extensions). Αποτελεί εξέλιξη των επεκτάσ εων SSE και διπλασ ιάζει το μέγεθος των ειδικών καταχωρητών σ ε 256 bit. Ετσ ι, μπορεί να γίνει ταυτόχρονη επεξεργασ ία τεσ σ άρων αριθμών κινητής υποδιασ τολής διπλής ακρίβειας (double precision, 64 bit) και οκτώ αριθμών απλής ακρίβειας (single precision, 32 bit). Επιπλέον, εισ άγει εντολές που δέχονται 3 ορίσ ματα αντί για 2. Τέλος, σ τους επεξεργασ τές αρχιτεκτονικής ARM, που σ τις μέρες μας γίνονται όλο και πιο δημοφιλείς, υποσ τηρίζονται SIMD εντολές από το πακέτο επέκτασ ης εντολών ΝΕΟΝ (ή αλλιώς Advanced SIMD extension).

1.2. Αιτίες της σ τροφής προς τους επεξεργασ τές πολλαπλών πυρήνων 19 1.2. Αιτίες της στροφής προς τους επεξεργαστές πολλαπλών πυρήνων 44 Chapter 1 Computer Abstractions and Technology Performance (vs. VAX-11/780) 1000 100 1000 100 10 Intel Xeon 4 cores 3.6 GHz (Boost to 4.0) Intel Core i7 4 cores 3.4 GHz (boost to 3.8 GHz) Intel Xeon 6 cores, 3.3 GHz (boost to 3.6 GHz) 34,967 Intel Xeon 4 cores, 3.3 GHz (boost to 3.6 GHz) Intel Core i7 Extreme 4 cores 3.2 GHz (boost to 3.5 GHz) 31,999 Intel Core Duo Extreme 2 cores, 3.0 GHz 21,871 24,129 Intel Core 2 Extreme 2 cores, 2.9 GHz AMD Athlon 64, 2.8 GHz 11,865 14,38719,484 AMD Athlon, 2.6 GHz Intel Xeon EE 3.2 GHz 7,108 Intel D850EMVR motherboard (3.06 GHz, Pentium 4 processor with Hyper-threading Technology) 6,043 6,681 IBM Power4, 1.3 GHz 4,195 Intel VC820 motherboard, 1.0 GHz Pentium III processor 3,016 Professional Workstation XP1000, 667 MHz 21264A 1,779 Digital AlphaServer 8400 6/575, 575 MHz 21264 1,267 993 AlphaServer 4000 5/600, 600 MHz 21164 Digital Alphastation 5/500, 500 MHz 649 481 Digital Alphastation 5/300, 300 MHz 280 22%/year Digital Alphastation 4/266, 266 MHz 183 IBM POWERstation 100, 150 MHz 117 Digital 3000 AXP/500, 150 MHz 80 HP 9000/750, 66 MHz 51 IBM RS6000/540, 30 MHz 24 52%/year MIPS M2000, 25 MHz MIPS M/120, 16.7 MHz 18 13 Sun-4/260, 16.7 MHz 9 VAX 8700, 22 MHz 5 AX-11/780, 5 MHz 25%/year 1.5, VAX-11/785 1 1 1978 1980 1982 1984 1986 1988 1990 1992 1994 1996 1998 2000 2002 2004 2006 2008 2010 2012 2014 FIGURE 1.17 Growth in processor performance since the mid-1980s. This chart plots performance relative to the VAX 11/780 as measured by the SPECint benchmarks (see Section 1.10). Prior to the mid-1980s, processor performance growth was largely technologydriven and averaged about 25% per year. The increase in growth to about 52% since then is attributable to more advanced architectural and organizational ideas. The higher annual performance improvement of 52% since the mid-1980s meant performance was about a factor of seven higher in 2002 than it would have been had it stayed at 25%. Since 2002, the limits of power, available instruction-level parallelism, and long memory latency have slowed uniprocessor performance recently, to about 22% per year. Σχ. 1.6: Αύξησ η της επίδοσ ης των επεξεργασ τών από τα μέσ α της δεκαετίας του 1980 έως σ ήμερα (με βάσ η το μετροπρόγραμμα SPECint) [4] Why has it been so hard for programmers to write explicitly parallel programs? The first reason is that parallel programming is by definition performance programming, which increases the difficulty of programming. Not only does the program need to be correct, solve an important problem, and provide a useful interface to the people or other programs that invoke it, the program must also be fast. Otherwise, if you don t need performance, just write a sequential program. The second reason is that fast for parallel hardware means that the programmer must divide an application so that each processor has roughly the same amount to do at the same time, and that the overhead of scheduling and coordination doesn t fritter away the potential performance benefits of parallelism. As an analogy, suppose the task was to write a newspaper story. Eight reporters working on the same story could potentially write a story eight times faster. To achieve this increased speed, one would need to break up the task so that each reporter had something to do at the same time. Thus, we must schedule the sub-tasks. If anything went wrong and just one reporter took longer than the seven others did, then the benefits of having eight writers would be diminished. Thus, we must balance the Μέχρι περίπου το 2003, οι καινοτομίες και οι βελτισ τοποιήσ εις που αναφέρθηκαν παραπάνω, καθώς και οι εξελίξεις σ τον τομέα της κατασ κευής ολοκληρωμένων κυκλωμάτων, οδηγούσ αν κάθε χρόνο σ ε σ ημαντική αύξησ η των επιδόσ εων των επεξεργασ τών. Ειδικότερα, όπως φαίνεται σ το Σχήμα 1.6, η ετήσ ια αύξησ η της επεξεργασ τικής ισ χύος άγγιζε κατά μέσ ο όρο το 52% και παρέμεινε σ ταθερή για παραπάνω από 2 δεκαετίες. Οι προβλέψεις ανέφεραν ότι ο σ υγκεκριμένος ρυθμός αύξησ ης θα σ υνεχιζόταν και τα επόμενα χρόνια. Τελικά, αυτό διαψεύσ τηκε και μέχρι σ ήμερα περιορίσ τηκε σ ε περίπου 22% ανά έτος κατά μέσ ο όρο. Η κύρια αιτία αυτής της μείωσ ης είναι ότι οι επιδόσ εις σ ε επίπεδο ενός επεξεργασ τικού πυρήνα δεν κατάφεραν να διατηρήσ ουν τον υψηλό ρυθμό εξέλιξης. Κατά σ υνέπεια, οι κατασ κευασ τές οδηγήθηκαν σ την ενσ ωμάτωσ η περισ σ ότερων του ενός επεξεργασ τικών πυρήνων, εγκαινιάζοντας την εποχή των «multicore» αρχιτεκτονικών. Οι λόγοι είναι αρκετοί και σ υνοψίζονται σ ε τρεις κατηγορίες: τα προβλήματα σ την κλιμάκωσ η της έκλυσ ης ισ χύος (power wall), οι δυσ κολίες σ την περαιτέρω εκμετάλλευσ η του παραλληλισ μού σ ε επίπεδο εντολής (ILP wall) και η μικρή αύξησ η της ταχύτητας της κύριας μνήμης (memory wall). 1.2.1. Power wall Αρχικά, η κατανάλωσ η των πρώτων επεξεργασ τών κυμαινόταν σ ε μόλις μερικά Watt, ενώ οι τεχνολογίες ολοκλήρωσ ης βρίσ κονταν σ ε πολύ πρώιμο σ τάδιο. Η κυρίαρχη τεχνολογία κατασ κευής ολοκληρωμένων κυκλωμάτων ονομάζεται CMOS και χρησ ιμοποιείται μέχρι και σ ήμερα. Η κατανάλωσ η ενέργειας ενός επεξεργασ τή είναι ανάλογη της σ υχνότητας λειτουργίας πολλαπλασ ιασ μένης με την τάσ η λειτουργίας υψωμένη σ το τετράγωνο. Η εξέλιξη της σ υγκεκριμένης τεχνολογίας μειώνει σ υνεχώς το μέγεθος των τρανζίσ τορ και την τάσ η λειτουργίας τους και σ υνεπώς την ενέργεια που καταναλώνουν. Ετσ ι, οι κατασ κευασ τές επεξεργασ τών μπορούσ αν

or Par Lab, updating two long technical reports 4,5 that include more detail. Our goal is to recruit more parallel revolutionaries. replication of cores is nearly trivial. Just as it s easy to add spares to mask manufacturing defects, manycore computers can also have higher yield. ware tower is that it takes f years to design and build chip software to evaluate them. lengthy cycle, how could rese 20 One example of a manycore Κεφάλαιο computer 1. Εισ αγωγικά novate more quickly? Parallel Bridge is from the world of network proces- Software span. Software is να ενσ ωματώνουν The bridge όλο και in Figure περισ σ ότερα 2 represents τρανζίσ τορ an sors, σ το which ίδιοhas εμβαδόν seen a great υλικού deal of και innovation ταυτόχρονα problem in bridging the ga recently due to the growth of the users and the parallel IT analogy connecting computer users να αυξάνουν τη σ υχνότητα του ρολογιού. Τελικά, από γενιά σ ε γενιά η σ υνολική κατανάλωσ η on the right to the IT industry on the networking market. The best-designed Hence, the long distance of t μεγάλωνε αλλά left. τοthe ίδιοleft έκαναν tower και is οι hardware, επιδόσ εις. the Η network τεχνικήprocessor αυτή αποτέλεσ ε is arguably τον the έναν Cisco από Figure τους2 reflects the daunti right tower is applications, and the Silicon Packet Processor, also known as tude of the software challeng δύο βασ ικούς πυλώνες σ τους οποίους σ τηρίχτηκε η μεγάλη αύξησ η των επιδόσ εων των επεξεργασ τών. Figure 1. Microprocessor clock rates of Intel products vs. projects from for the parallel software sp One especially vexing the International Roadmap for Semiconductors in 2005 and 2007. 16 sequential programming 25 20 dates the wide range of skills programmers. Our experien ing parallelism suggests tha programmer is able to unde 15 parallel hardware; difficult 2005 Roadmap clude locks, barriers, deadl balancing, scheduling, and 10 consistency. How can resea 2007 Roadmap velop technology so all pro 5 Intel single core benefit from the parallel revo Intel multicore A second challenge is tha 0 cal pieces of system softw 2001 2003 2005 2007 2009 2011 2013 pilers and operating syste Σχ. 1.7: Συχνότητες επεξεργασ τών της Intel σ ε σ χέσ η με τις προβλέψεις των εκδόσ εων του 2005 και 58 COMMUNICATIONS OF THE ACM OCTOBER 2009 VOL. 52 NO. 10 του 2007 του International Technology Roadmap for Semiconductors [7] Clock Rate (GHz) The Moore s Law Στις αρχές του 2000, οι κατασ κευασ τές οραματίζονταν επεξεργασ τές με μεγάλες σ υχνότητες λειτουργίας, ακόμα και διψήφιες. Οπως φαίνεται σ το Σχήμα 1.7, οι προβλέψεις του 2005, με τα The Moore s law: the number of transistors in microprocessors doubles every two years. The απέχουν Moore s αρκετά από law, τιςtake σ υχνότητες 2: theπου performance τελικά επιτεύχθηκαν. of microprocessors doubles every 18 months. δεδομένα της εποχής, ανέφεραν ότι μέχρι το 2008 οι σ υχνότητες λειτουργίας θα έχουν ξεπεράσ ει τα 10 GHz, κάτι το οποίο δεν έγινε ποτέ. Ακόμα και οι μετριοπαθείς προβλέψεις του 2007 Σχ. 1.8: Διαγράμμα αριθμού τρανζίσ τορ, σ υχνότητας λειτουργίας, κατανάλωσ ης ενέργειας και επιδόσ εων ανά κύκλο ρολογιού (ILP)

40 Chapter 1 Computer Abstractions and Technology Elaboration: Although clock cycle time has traditionally been fi xed, to save energy or temporarily boost performance, today s processors can vary their clock rates, so we 1.2. Αιτίες της σ τροφής προς τους επεξεργασ τές πολλαπλών πυρήνων 21 would need to use the average clock rate for a program. For example, the Intel Core i7 will temporarily increase clock rate by about 10% until the chip gets too warm. Intel calls Οπως φαίνεται this Turbo σ το mode. Σχήμα 1.8, ο ρυθμός αύξησ ης της καταναλισ κόμενης ενέργειας σ υμπίπτει με τον ρυθμό αύξησ ης της σ υχνότητας λειτουργίας. Αρχικά, η κατανάλωσ η ενέργειας βρισ κόταν σ ε Check A given application written in Java runs 15 seconds on a desktop processor. A new χαμηλά επίπεδα και σ υνεπώς υπήρχαν μεγάλα περιθώρια ανόδου. Ομως, όσ ο αυξανόταν η Java compiler is released that requires only 0.6 as many instructions as the old σ υνολική κατανάλωσ η compiler. Unfortunately, ενέργειας, it τόσ ο increases δυσ κολότερη the CPI by γινόταν 1.1. How η απαγωγή fast can we της expect εκλυόμενης the θερμότητας. Επίσ ης, application ο ρυθμός to run using μείωσ ης this new της ενέργειας compiler? Pick που the καταναλώνουν right answer from τα τρανζίσ τορ the three δεν ήταν choices below: αρκετός ώσ τε να αντισ ταθμίσ ει την αύξησ η της σ υχνότητας του ρολογιού και του πλήθους των τρανζίσ τορ. Αυτό 15είχε0. 6 a. ως αποτέλεσ μα 82. sec η ψύξη των επεξεργασ τών να αποτελέσ ει πολύ σ ημαντικό πρόβλημα σ την περαιτέρω 11. κλιμάκωσ η της τεχνικής αυτής, ειδικά όταν η κατανάλωσ η ισ χύος ανήλθε σ ε τριψήφιους b. 15 0.6 αριθμούς 1.1 (σ ε 9.9 sec Watt). Τότε ήταν που 15 οι1κατασ κευασ τές. 1 c. 27. 5 sec σ υνειδητοποίησ αν πως η σ υχνότητα λειτουργίας δεν ήταν δυνατόν να βελτιωθεί 06. παραπάνω και σ υνεπώς έπρεπε να βρεθεί άλλος τρόπος ενίσ χυσ ης των Yourself επιδόσ εων. Η φιλοσ οφία που επικράτησ ε σ τηρίζεται σ το ότι είναι προτιμότερο να υπάρχουν 1.7 The Power Wall περισ σ ότεροι επεξεργασ τικοί πυρήνες χαμηλότερα χρονισ μένοι παρά λιγότεροι με υψηλότερους χρονισ μούς. Οταν σ ταμάτησ ε να αυξάνεται η σ υχνότητα του ρολογιού και η κατανάλωσ η ενέργειας, τότε άρχιζαν να παρουσ ιάζονται επεξεργασ τές με παραπάνω από έναν πυρήνες. Επιπλέον, αξίζει microprocessors να σ ημειωθεί over ότι30 παρά years. τηνboth αλλαγή clock της rate φιλοσ οφίας and power increased ως προς rapidly τον τρόπο for αύξησ ης Figure 1.16 shows the increase in clock rate and power of eight generations of Intel των επιδόσ εων, decades, ο νόμος and then τουflattened Moore 1 off σ υνεχίζει recently. The να ισ χύει. reason they grew together is that they are correlated, and the reason for their recent slowing is that we have run into the practical power limit for cooling commodity microprocessors. Clock Rate (MHz) 100 1000 100 10 1 12.5 3.3 16 4.1 Clock Rate 200 66 25 4.9 10.1 2000 75.3 Power 29.1 3600 103 2667 3300 3400 95 87 77 120 100 80 60 40 20 0 80286 (1982) 80386 (1985) 80486 (1989) Pentium (1993) Pentium Pro (1997) Pentium 4 Willamette (2001) Pentium 4 Prescott (2004) Core 2 Kentsfield (2007) Core i5 Clarkdale (2010) Core i5 Ivy Bridge (2012) Power (watts) FIGURE 1.16 Clock rate and Power for Intel x86 microprocessors over eight generations Σχ. 1.9: Συχνότητες and 25 years. The λειτουργίας Pentium 4 made και a κατανάλωσ η dramatic jump in ενέργειας clock rate and επεξεργασ τών power but less so in της performance. Intel απόthe το 1982 έως Prescott thermal problems led to the abandonment of the Pentium 4 line. The Core 2 line reverts to a simpler το 2012 [4] pipeline with lower clock rates and multiple processors per chip. The Core i5 pipelines follow in its footsteps. Πλέον, οι κατασ κευασ τές εκμεταλλεύονται τις προόδους των τεχνολογιών ολοκλήρωσ ης ώσ τε να ενσ ωματώνουν περισ σ ότερους επεξεργασ τικούς πυρήνες και μεγαλύτερες κρυφές μνήμες (cache). Ταυτόχρονα, προσ παθούν να βελτισ τοποιούν σ υνεχώς την αποδοτικότητα των επεξεργασ τών ως προς την κατανάλωσ η ενέργειας (power efficiency) με σ τόχο τη μείωσ η της κατανάλωσ ης αλλά ταυτόχρονα τη διατήρησ η της σ υχνότητας λειτουργίας όσ ο το δυνατόν υψηλότερα. Αυτό γίνεται εμφανές σ το Σχήμα 1.9. Η Intel, μετά τα σ ημαντικά προβλήματα θερμικής σ υμπεριφοράς που αντιμετώπισ ε με την αρχιτεκτονική Prescott, αναγκάσ τηκε να εγκαταλείψει τη σ ειρά επεξεργασ τών Pentium 4 και να οδηγηθεί σ τη γενιά Core 2. Η αλλαγή σ ηματοδοτούσ ε τη σ τροφή προς ένα απλούσ τερο και αποδοτικότερο pipeline και την ενσ ωμάτωσ η περισ σ ότερων 1 Ο νόμος του Moore (σ υνιδρυτή της εταιρίας Intel) αναφέρει ότι ο αριθμός των τρανζίσ τορ σ τους μικροεπεξεργασ τές θα διπλασ ιάζεται κάθε 2 χρόνια. Αργότερα, η πρόβλεψη αυτή τροποποιήθηκε σ ε 18 μήνες.

22 Κεφάλαιο 1. Εισ αγωγικά πυρήνων χαμηλότερα χρονισ μένων. Η φιλοσ οφία αυτή διατηρήθηκε και σ τις επόμενες γενιές Core με έμφασ η σ ε περαιτέρω βελτιώσ εις ενεργειακής αποδοτικότητας. Turbo Boost Σημαντική καινοτομία αποτελεί η εμφάνισ η από την Intel της τεχνολογίας Intel Turbo Boost η οποία παρουσ ιάσ τηκε για πρώτη φορά σ τα τέλη του 2008 σ την αρχιτεκτονική Nehalem. Η τεχνολογία αυτή αφορά τη δυναμική μεταβολή του χρονισ μού των πυρήνων του επεξεργασ τή σ ε πραγματικό χρόνο ανάλογα με το επεξεργασ τικό φορτίο. Βασ ικό κριτήριο για το ανώτατο όριο αύξησ ης της σ υχνότητας αποτελεί η κατανάλωσ η ενέργειας η οποία δεν πρέπει ποτέ να ξεπεράσ ει τις προδιαγραφές του επεξεργασ τή (power envelope). Επιπρόσ θετα, σ υνυπολογίζονται τα μέγισ τα όρια θερμοκρασ ίας και ρεύματος που μπορεί να αντλήσ ει ο επεξεργασ τής. 95W 47,5W 47,5W 23,75W 23,75W 23,75W 23,75W Cores GHz Cores GHz Cores GHz Σχ. 1.10: Σχηματική αναπαράσ τασ η της λειτουργίας του Turbo Boost σ ε έναν τετραπύρηνο επεξεργασ τή με 95W ανώτατη πρoδιαγραφή κατανάλωσ ης (TDP) Αρχικά, σ κοπός ήταν να βελτιωθεί η επίδοσ η εφαρμογών που δεν εκμεταλλεύονται παραπάνω από έναν πυρήνα. Αυτό επιτυγχάνεται με αύξησ η της σ υχνότητα ενός μόνο πυρήνα παραπάνω από τη βασ ική σ υχνότητα λειτουργίας και ταυτόχρονα η μείωσ η της σ υχνότητας (ή και απενεργοποίησ η) των υπόλοιπων πυρήνων ώσ τε να αντισ ταθμισ τεί η αυξημένη κατανάλωσ η. Στη σ υνέχεια, επεκτάθηκε ώσ τε να λειτουργεί για οποιοδήποτε υποσ ύνολο ενεργών πυρήνων, όπως φαίνεται σ τη σ χηματική αναπαράσ τασ η του Σχήματος 1.10. 1.2.2. ILP wall Ο δεύτερος πυλώνας σ τον οποίο σ τηρίχτηκε η εξέλιξη των επεξεργασ τών τα προηγούμενα χρόνια είναι η εκμετάλλευσ η του παραλληλισ μού σ ε επίπεδο εντολής (ILP). Με τη σ υνεχή βελτισ τοποίησ η των τεχνικών που αναλύθηκαν σ την Υποενότητα 1.1.2, οι επεξεργασ τές προσ έφεραν όλο και μεγαλύτερες επιδόσ εις από γενιά σ ε γενιά. Οπως φαίνεται ξεκάθαρα σ το διάγραμμα του Σχήματος 1.8, μέχρι τις αρχές του 2000 παρατηρείται σ υνεχής και εντυπωσ ιακή αύξησ η του ILP. Μέχρι τότε, η κατανάλωσ η ενέργειας δεν είχε φτάσ ει σ ε απαγορευτικά επίπεδα, οπότε υπήρχε δυνατότητα να αναπτυχθούν περαιτέρω οι τεχνικές που απαιτούν επιπλέον υλικό για να υλοποιηθούν. Ειδικότερα, η εκτέλεσ η εντολών εκτός σ ειράς (OoO Execution) απαιτεί σ ημαντικό αριθμό επιπλέον τρανζίσ τορ ώσ τε να υλοποιηθούν οι απαραίτητες δομές. Συνεπώς, πρέπει να υπάρχουν περιθώρια τόσ ο σ ε επίπεδο υλικού όσ ο και σ ε επίπεδο κατανάλωσ ης ισ χύος. Ολες οι τεχνικές, όταν βρίσ κονται σ ε πρώιμα σ τάδια, είναι πιο εύκολο να αναπτυχθούν και να εξελιχθούν. Οσ ο όμως προχωράει η βελτισ τοποίησ η τους, γίνεται σ υνεχώς πιο δύσ κολο και πιο

1.2. Αιτίες της σ τροφής προς τους επεξεργασ τές πολλαπλών πυρήνων 23 δαπανηρό να διατηρηθούν οι αρχικοί ρυθμοί ανάπτυξης. Από κάποιο σ ημείο και έπειτα, είτε είναι αδύνατη η περαιτέρω εξέλιξη λόγω αρκετών παραγόντων (π.χ. εξάντλησ η διαθέσ ιμων πόρων), είτε η εξέλιξη είναι πολύ μικρή για να αντισ ταθμίσ ει το κόσ τος που απαιτείται. Στις αρχές του 2000, αυτό σ υνέβη με τις περισ σ ότερες τεχνικές που αναφέρθηκαν, οπότε ανακόπτονται οι μεγάλοι ρυθμοί αύξησ ης του ILP των προηγούμενων ετών. Από τότε μέχρι σ ήμερα οι επιπλέον βελτιώσ εις είναι μικρότερες σ ε έκτασ η και κυρίως επωφελούνται της προόδου σ τον τομέα της βελτιωμένης ενεργειακής απόδοσ ης. 1.2.3. Memory wall Η τρίτη αιτία που αποτελεί εμπόδιο σ την εξέλιξη των επεξεργασ τών είναι το γεγονός ότι η ταχύτητα της κύριας μνήμης (RAM) δεν μπόρεσ ε να ακολουθήσ ει τους εκθετικούς ρυθμούς αύξησ ης των επιδόσ εων των επεξεργασ τών. Ετσ ι, το κενό επιδόσ εων ανάμεσ α σ ε μνήμη και επεξεργασ τή αύξανε με εκθετικό ρυθμό και σ υνεχίζει να αυξάνει μέχρι σ ήμερα. Με την εκμετάλλευσ η των τεχνολογιών ολοκλήρωσ ης, οι κατασ κευασ τές προσ παθούν να αντισ ταθμίσ ουν αυτό το πρόβλημα ενσ ωματώνοντας σ υνεχώς μεγαλύτερες κρυφές μνήμες (cache) οργανωμένες σ ε πολλαπλά επίπεδα. 5.1 Introduction 289 1000 100 Performance 1,000 100 Processor 10 Memory 1 1980 1985 1990 1995 2000 2005 2010 Year Figure 5.2 Starting with 1980 performance as a baseline, the gap in performance Σχ. 1.11: Διαφορά between επιδόσ εων memory and (performance processors is gap) plotted μεταξύ over time. μνήμης Note RAM that the και vertical επεξεργασ τών axis ξεκινώντας από το 1980 [10] must be on a logarithmic scale to record the size of the processor-dram performance gap. The memory baseline is 64 KB DRAM in 1980, with a 1.07 per year performance improvement in latency (see Figure 5.13 on page 313). The processor line assumes a 1.25 improvement per year until 1986, and a 1.52 improvement until 2004, and a 1.20 improvement thereafter; see Figure 1.1 in Chapter 1. Επιπλέον, όσ ο ο αριθμός των πυρήνων σ τους επεξεργασ τές αυξάνεται, τόσ ο το πρόβλημα γίνεται εντονότερο καθώς πρέπει να μοιρασ τούν τον ίδιο «δρόμο» προς την μνήμη. Ειδικά σ ε block (or line), are moved for efficiency reasons. Each cache block includes a tag εφαρμογές που to απαιτούν see which πολλές memory address και ακανόνισ τες it corresponds προσ βάσ εις to. σ τη μνήμη για να μεταφέρουν τα δεδομένα προς επεξεργασ ία, A key design ηdecision ταχύτητα is where της blocks μνήμης (or lines) είναι can τοbe σ υχνότερο placed in a cache. σ ημείο The που εμφανίζεται most popular scheme is set associative, where a set is a group of blocks in the σ υμφόρησ η (bottleneck) cache. A block καιis εν first τέλει mapped ο καθορισ τικός onto a set, and then παράγοντας the block can που be placed προσ διορίζει anywhere within that set. Finding a block consists of first mapping the block address τις επιδόσ εις που επιτυγχάνονται. to the set, and then searching the set usually in parallel to find the block. The set is chosen by the address of the data: (Block address) MOD (Number of sets in cache) If there are n blocks in a set, the cache placement is called n-way set associative. The end points of set associativity have their own names. A direct-mapped cache has just one block per set (so a block is always placed in the same location), and a fully associative cache has just one set (so a block can be placed anywhere). Caching data that is only read is easy, since the copy in the cache and memory will be identical. Caching writes is more difficult: how can the copy in the cache and memory be kept consistent? There are two main strategies. A writethrough cache updates the item in the cache and writes through to update main memory. A write-back cache only updates the copy in the cache. When the block is about to be replaced, it is copied back to memory. Both write strategies can use a write buffer to allow the cache to proceed as soon as the data is placed in the

24 Κεφάλαιο 1. Εισ αγωγικά 1.3. Από τις Multicore στις Manycore αρχιτεκτονικές Στις μέρες μας, οι επεξεργασ τές που απευθύνονται προς το ευρύ καταναλωτικό κοινό αριθμούν το πολύ μέχρι 6 ή 8 επεξεργασ τικούς πυρήνες. Αντιθέτως, οι επεξεργασ τές που προορίζονται για διακομισ τές και σ υσ τήματα υψηλών επιδόσ εων (High Performance Computing, HPC) ενσ ωματώνουν σ ημαντικά μεγαλύτερο αριθμό επεξεργασ τικών πυρήνων και μεγαλύτερες κρυφές μνήμες. Σε αυτό βοήθησ ε η πρόοδος σ τις τεχνολογίες ολοκλήρωσ ης και η σ υνεχής εξέλιξη των καινοτομιών μείωσ ης και εξοικονόμησ ης ενέργειας. Αρ. Πυρήνων L3 Cache TDP Μεθ. Ολοκλ. Intel Core i7 Haswell έως 4 8 MB 84 W 22 nm Intel Core i7 Ivy Bridge-E έως 6 15 MB 130 W 22 nm Intel Xeon E5 v2 έως 12 30 MB έως 115 W 22 nm Intel Xeon E7 v2 έως 15 37.5 MB έως 155 W 22 nm AMD Opteron Piledriver έως 16 16 MB έως 140 W 32 nm Πίν. 1.1: Προδιαγραφές σ ύγχρονων x86 επεξεργασ τών [12, 13] Οι απαιτήσ εις για μεγαλύτερη επεξεργασ τική ισ χύ ήταν πάντα και είναι ακόμα μεγάλες, ειδικά από το HPC κομμάτι της αγοράς. Πριν από μια πενταετία, οι επεξεργασ τές δεν αριθμούσ αν το σ ημαντικό αριθμό επεξεργασ τικών πυρήνων που φαίνεται σ το Σχήμα 1.1 αλλά αρκετά λιγότερους (μέχρι 4). Επιπλέον, η ταχύτητα της μνήμης (όπως αναφέρθηκε σ την Υποενότητα 1.2.3) περιόριζε σ ημαντικά τις επιδόσ εις και δεν επέτρεπε την πλήρη αξιοποίησ η της υπολογισ τικής δύναμης των επεξεργασ τών. Η αναζήτησ η περισ σ ότερης επεξεργασ τικής ισ χύος οδήγησ ε σ την εκμετάλλευσ η μιας υπολογισ τικής σ υσ κευής που μέχρι εκείνη τη σ τιγμή, αν και ισ χυρή από επεξεργασ τική άποψη, είχε χρήσ η μόνο σ τον τομέα των 3D γραφικών. Αυτή η σ υσ κευή ήταν η κάρτα γραφικών (Graphics Processing Unit, GPU). 1.3.1. Κάρτες Γραφικών Η ανάγκη για ρεαλισ τικότερα τρισ διάσ τατα γραφικά υψηλής ανάλυσ ης οδηγούσ ε σ ε σ ημαντική αύξησ η της υπολογισ τικής ισ χύος των καρτών γραφικών από γενιά σ ε γενιά. Παρά ταύτα, οι κάρτες γραφικών δεν μπορούσ αν να χρησ ιμοποιηθούν για άλλους υπολογισ μούς γενικού σ κοπού αλλά μόνο για σ υγκεκριμένες πράξεις ειδικού σ κοπού που είναι απαραίτητες σ το κομμάτι της 3D γραφικής απεικόνισ ης. Αυτό άλλαξε το 2008 όταν κυκλοφόρησ ε από την εταιρία Nvidia η πρώτη γενικού σ κοπού προγραμματιζόμενη κάρτα γραφικών ακολουθώντας την αρχιτεκτονική Nvidia CUDA (Compute Unified Device Architecture). Ηταν η αρχή της σ ημαντικής ανάπτυξης που γνωρίζει ο τομέας των υπολογισ μών γενικού σ κοπού σ ε κάρτες γραφικών ή αλλιώς GPGPU (General Purpose computing on GPUs). Ενσ ωμάτωνε για πρώτη φορά προγραμματιζόμενους

1.3. Από τις Multicore σ τις Manycore αρχιτεκτονικές 25 vertex shaders και παρείχε ένα κατάλληλο προγραμματισ τικό μοντέλο και τα απαραίτητα εργαλεία (CUDA SDK) για την ανάπτυξη εφαρμογών που θα εκτελούνταν όχι σ ε κάποιον επεξεργασ τή αλλά σ ε κάρτες γραφικών. Οι πρώτες GPUs γενικού σ κοπού είχαν αρκετούς περιορισ μούς, μειωμένη ακρίβεια πράξεων και επιπλέον τα εργαλεία ανάπτυξης εφαρμογών ήταν αρκετά δύσ τροπα για τον προγραμματισ τή με αρκετές «αγκυλώσ εις». Από τότε όμως οι κάρτες γραφικών γνωρίζουν σ ημαντική εξέλιξη και από γενιά σ ε γενιά παρουσ ιάζονται σ υνεχείς βελτιώσ εις που αφορούν τόσ ο το κομμάτι των επιδόσ εων όσ ο και το κομμάτι της ευκολίας προγραμματισ μού. Στον τομέα του GPGPU εισ ήλθε και η δεύτερη μεγάλη εταιρία κατασ κευής καρτών γραφικών ATI (πλέον AMD) παρουσ ιάζοντας αρχικά το Stream SDK. Στη σ υνέχεια παρουσ ιάσ τηκε το OpenCL (Open Computing Language) το οποίο αποτελεί ένα framework για την ανάπτυξη εφαρμογών που εκτελούνται σ ε ετερογενείς αρχιτεκτονικές, ανάμεσ α σ τις οποίες είναι και οι κάρτες γραφικών. Κυρίως υποσ τηρίζεται από τις κάρτες γραφικών της AMD, ενώ πλέον και από τις κάρτες της Nvidia. Το OpenCL μαζί με το CUDA αποτελούν τις δύο πιο δημοφιλείς πλατφόρμες ανάπτυξης εφαρμογών για GPUs, με τη διαφορά ότι το CUDA είναι πλατφόρμα κλεισ τού κώδικα και σ υμβατή μόνο με κάρτες γραφικών της Nvidia. Άλλη λιγότερο δημοφιλής εναλλακτική είναι το DirectCompute της εταιρίας Microsoft. CPU vs GPU Η πρώτη μεγάλη διαφορά φιλοσ οφίας ανάμεσ α σ ε επεξεργασ τές και κάρτες γραφικών είναι ότι οι κάρτες γραφικών αποτελούνται από πολύ μικρότερους και απλούσ τερους επεξεργασ τικούς πυρήνες σ ε σ χέσ η με τους επεξεργασ τές, με αποκλεισ τικό προορισ μό την εκτέλεσ η υπολογισ τικών πράξεων. Ανήκουν σ την κατηγορία των «manycore» αρχιτεκτονικών, δηλαδή αρχιτεκτονικών που αποτελούνται από δεκάδες, εκατοντάδες ή χιλιάδες απλούς επεξεργασ τικούς πυρήνες, οι οποίοι ουσ ιασ τικά ενσ ωματώνουν μόνο αριθμητικές μονάδες εκτέλεσ ης πράξεων (ALUs). Εκμεταλλεύονται τα οφέλη της λογικής των SIMD αρχιτεκτονικών σ το έπακρο, 1.3. Από τις Multicore σ τις Manycore αρχιτεκτονικές 23 προσ φέρουν πολύ μεγαλύτερη υπολογισ τική ισ χύ από τους επεξεργασ τές και δεν έχουν ανάγκη τα πολύπλοκα front end που χρειάζονται οι επεξεργασ τές για την αποκωδικοποίησ η των εντολών, την πρόβλεψη διακλαδώσ εων, την εκτέλεσ η εντολών εκτός σ ειράς κ.ά. Οι απλοί πυρήνες καταναλώνουν σ ημαντικά λιγότερη ενέργεια ανά πυρήνα και καταλαμβάνουν πολύ μικρή επιφάνεια υλικού σ το chip. Συνεπώς είναι δυνατή η ενσ ωμάτωσ η πολύ μεγάλου αριθμού, διατηρώντας την κατανάλωσ η ενέργειας σ ε λογικά πλαίσ ια. 1.3. Από τις Multicore σ τις Manycore αρχιτεκτονικές 23 (a) CPU (a) CPU (a) CPU (b) GPU (b) GPU Σχ. 1.13: Διαφορετική φιλοσ οφία χρήσ ης της διαθέσ ιμης επιφάνειας των chip ανάμεσ α σ ε επεξεργασ τές και κάρτες γραφικών Σχ. 1.12: Διαφορετική φιλοσ οφία χρήσ ης της διαθέσ ιμης επιφάνειας των chip ανάμεσ α σ ε επεξεργασ τές και κάρτες γραφικών (b) GPU

MAXIMXM THEORETICAL MEMORY BANDWIDTH (GB/S) 26 Κεφάλαιο 1. Εισ αγωγικά Η δεύτερη διαφορά είναι ο τρόπος με τον οποίο αντιμετωπίζουν το πρόβλημα της αργής πρόσ βασ ης σ τη μνήμη (memory latency) και μοιραία του bottleneck που δημιουργεί. Οι επεξεργασ τές προσ παθούν να «κρύψουν» το latency των προσ βάσ εων σ τη μνήμη ενσ ωματώνοντας μεγάλες και πολυεπίπεδες μνήμες cache, οι οποίες καταναλώνουν τη μερίδα του λέοντος της επιφάνειας του chip και αρκετή ενέργεια. Αντίθετα, οι κάρτες γραφικών προσ παθούν να «κρύψουν» το latency δημιουργώντας και εκτελώντας χιλιάδες νήματα ταυτόχρονα. Ετσ ι, όταν κάποια νήματα αναμένουν δεδομένα από την μνήμη, κάποια αλλά είναι έτοιμα προς εκτέλεσ η και εκτελούνται κ.ο.κ. Συνεπώς, το σ υντριπτικό τμήμα του chip αφιερώνεται σ ε αριθμητικές μονάδες εκτέλεσ ης πράξεων. Επιπλέον, υπάρχουν μικρές μνήμες ανά ομάδες πυρήνων, τις οποίες σ υνήθως διαχειρίζεται ο προγραμματισ τής ενώ το τμήμα αποκωδικοποίησ ης και δρομολόγησ ης των εντολών είναι εξαιρετικά απλό. Ο αριθμός των νημάτων που μπορούν να διαχειρισ τούν ταυτόχρονα είναι τόσ ο μεγάλος ώσ τε κατορθώνουν να επιτύχουν το σ τόχο τους. Η ταυτόχρονη όμως πρόσ βασ η σ τη μνήμη από τόσ α νήματα απαιτεί μεγάλο εύρος ζώνης (bandwidth), σ ημαντικά μεγαλύτερο σ ε σ χέσ η με τους επεξεργασ τές. Γι αυτό το λόγο, ενσ ωματώνουν σ το chip πολλαπλούς ελεγκτές μνήμης (memory controllers) ώσ τε να προσ φέρουν σ υνολικό εύρος ζώνης προς την μνήμη (aggregate memory bandwitdh) που κυμαίνεται σ ε εκατοντάδες GB/s, όπως φαίνεται και σ το Σχήμα 1.13. 400 350 300 250 200 150 100 50 0 Σχ. 1.13: Διάγραμμα σ ύγκρισ ης μέγισ του εύρους ζώνης προς τη μνήμη [13, 19, 12] Η σ ύνδεσ η των καρτών γραφικών σ το σ ύσ τημα γίνεται μέσ ω του διαύλου PCI Express, όπως φαίνεται σ το Σχήμα 1.14. Αυτό σ υνεπάγεται ότι τα δεδομένα του προβλήματος που καλείται να λύσ ει η κάρτα γραφικών πρέπει να αντιγραφούν από την κύρια μνήμη του σ υσ τήματος σ τη μνήμη της κάρτας γραφικών και όταν ολοκληρωθεί η εκτέλεσ η να επισ τρέψουν τα αποτελέσ ματα σ την κύρια μνήμη με την αντίθετη διαδικασ ία. Το γεγονός ότι η μνήμη των καρτών γραφικών είναι σ ε πολλές περιπτώσ εις μικρότερη των απαιτήσ εων αναγκάζει τους προγραμματισ τές να αντιγράφουν σ υχνά δεδομένα από και προς την μνήμη της κάρτας γραφικών κατά τη διάρκεια της εκτέλεσ ης. Αυτό δημιουργεί σ ημαντικά προβλήματα bottleneck διότι το εύρος ζώνης του

THEORETICAL GFLOP/S W 1.3. Από τις Multicore σ τις Manycore αρχιτεκτονικές 27 διαύλου PCI Express είναι περιορισ μένο. Η σ ύνδεσ η μέσ ω 16 lanes (x16) παρέχει έως 8 GB/s ανά κατεύθυνσ η σ την έκδοσ η 2.0 του PCI Express και έως 16 GB/s ανά κατεύθυνσ η σ την έκδοσ η 3.0 [20]. System Memory GPU Memory CPU PCI Express GPU Σχ. 1.14: Σύνδεσ η CPU και GPU μέσ ω του διαύλου PCI Express Επιδόσ εις Στο Σχήμα 1.15 φαίνεται ένα σ υγκεντρωτικό διάγραμμα που σ υγκρίνονται οι μέγισ τες θεωρητικές επιδόσ εις επεξεργασ τών της Intel με κάρτες γραφικών των εταιριών Nvidia και AMD καθώς και με τη «manycore» εκδοχή της Intel (Intel Xeon Phi) που θα αναφερθεί πιο αναλυτικά σ την επόμενη ενότητα. Επιπλέον, σ τη δευτερεύουσ α σ τήλη του διαγράμματος φαίνονται οι ανώτερες προδιαγραφές κατανάλωσ ης (TDP) σ ε Watt. 6000 350 5000 300 4000 3000 2000 250 200 150 100 1000 50 0 0 Double Precission Single Precission TDP (W) Σχ. 1.15: Διάγραμμα σ ύγκρισ ης μέγισ των θεωρητικών επιδόσ εων για πράξεις κινητής υποδιασ τολής απλής και διπλής ακρίβειας και κατανάλωσ ης ενέργειας [13, 19, 12]

28 Κεφάλαιο 1. Εισ αγωγικά Παρατηρείται αμέσ ως η τεράσ τια διαφορά σ τις θεωρητικές επιδόσ εις ανάμεσ α σ ε επεξεργασ τές και κάρτες γραφικών, άμεσ η σ υνέπεια των πολλών αριθμητικών μονάδων (ALUs) των καρτών γραφικών καθώς και τα πλαίσ ια κατανάλωσ ης ενέργειας μέσ α σ τα οποία πραγματοποιούνται οι μέγισ τες επιδόσ εις. Φυσ ικά, η επίτευξή τους σ την πράξη δεν είναι εύκολη και επιτυγχάνεται με κόπο και για σ υγκεκριμένου τύπου εφαρμογές. Επιπλέον, η δημιουργία αποδοτικών προγραμμάτων για κάρτες γραφικών δεν είναι κάτι απλό αφού απαιτεί εις βάθος εξοικείωσ η και γνώσ η τόσ ο του hardware όσ ο και του μοντέλου προγραμματισ μού, το οποίο είναι σ ημαντικά διαφορετικό (έως δύσ τροπο για αρκετούς) σ ε σ χέσ η με τους επεξεργασ τές. Παρόλα αυτά, έχουν γίνει τεράσ τια βήματα προόδου με σ τόχο τη διευκόλυνσ η των προγραμματισ τών και τον εμπλουτισ μό των δυνατοτήτων των καρτών γραφικών. Συνεπώς, σ ε πολλές περιπτώσ εις το τελικό αποτέλεσ μα αντισ ταθμίζει τις όποιες δυσ κολίες και προβλήματα προκύπτουν κατά την ανάπτυξη των εφαρμογών. 1.3.2. Intel MIC Η εταιρία Intel εισ ήλθε σ το κομμάτι της αγοράς των manycore αρχιτεκτονικών το Νοέμβριο του 2012 όταν παρουσ ίασ ε την πρώτη της εμπορική προσ πάθεια που ακούει σ το όνομα Intel Xeon Phi, βασ ιζόμενο σ την αρχιτεκτονική Intel MIC (Intel Many Integrated Core). Κατά την προώθησ η του η εταιρία το αποκαλεί co-processor, δηλαδή σ υνεπεξεργασ τή. Είχαν προηγηθεί αρκετές πειραματικές προσ πάθειες, χωρίς όμως να παρουσ ιασ τεί κάποιο εμπορικό προϊόν. Πρόκειται για ένα καινοτόμο προϊόν το οποίο αποτελείται από 61 απλούς επεξεργασ τικούς πυρήνες Pentium, τροποποιημένους κατάλληλα με πλάτους 512-bit SIMD units για την εκτέλεσ η αριθμητικών πράξεων και υποσ τήριξη 4-way SMT. Συνδέονται μέσ ω ενός αμφίδρομου διαδρόμου τύπου δακτυλιδιού (bi-directional ring bus). Η πιο γρήγορη έκδοσ η προσ φέρει μέγισ τες ονομασ τικές επιδόσ εις που αγγίζουν τα 1.2 TFLOP/s για πράξεις κινητής υποδιασ τολής διπλής ακρίβειας και 2.4 TFLOP/s για απλής ακρίβειας. 57 Σχ. 1.16: Κοινός πηγαίος κώδικας μετάξυ CPU και Phi [21] Το γεγονός ότι ενσ ωματώνει πυρήνες Pentium προσ φέρει ένα σ ημαντικό πλεονέκτημα σ ε σ χέσ η με τις κάρτες γραφικών, ότι εκτελεί x86 κώδικα. Συνεπώς, οι ήδη υλοποιημένες εφαρμογές που εκτελούνται σ τους επεξεργασ τές μπορούν να εκτελεσ τούν με ελάχισ τες αλλαγές σ το Phi, χωρίς να χρειάζεται να ξαναυλοποιηθούν από την αρχή (όπως γίνεται με τις κάρτες γραφικών). Επιπλέον, σ ύμφωνα με την εταιρία οι βελτισ τοποιήσ εις που απαιτούνται για την αποδοτική εκτέλεσ η των προγραμμάτων σ το Phi δεν είναι τόσ ο πολύπλοκες όσ ο σ τις GPUs.

1.4. Σκοπός και δομή της διπλωματικής εργασ ίας 29 Αυτό αποτελεί ένα από τα κυριότερα επιχειρήματα κατά την προώθησ η του προϊόντος. Ενα κομμάτι της διπλωματικής εργασ ίας θα προσ παθήσ ει να διερευνήσ ει κατά πόσ ον αυτό επιτυγχάνεται σ την πράξη. 1.4. Σκοπός και δομή της διπλωματικής εργασίας Στόχος της παρούσ ας διπλωματικής εργασ ίας αποτελεί η σ ύγκρισ η και η αξιολόγησ η των διαφορετικών αρχιτεκτονικών παράλληλου προγραμματισ μού που έχουν προαναφερθεί με κριτήρια εκτός από τις επιδόσ εις, την ευκολία προγραμματισ μού, την κατανάλωσ η ενέργειας, το κόσ τος του εξοπλισ μού κ.ά. Στο Κεφάλαιο 2, αναλύονται οι αρχιτεκτονικές και τα προγραμματισ τικά μοντέλα που θα χρησ ιμοποιηθούν σ τη διπλωματική εργασ ία. Στο Κεφάλαιο 3, παρουσ ιάζονται οι δύο αλγόριθμοί οι οποίοι θα υλοποιηθούν σ τις διάφορες αρχιτεκτονικές. Οι υλοποιήσ εις και τα αποτελέσ ματα παρουσ ιάζονται σ τα Κεφάλαια 4 και 5 για κάθε αλγόριθμο αντίσ τοιχα. Τέλος, σ το Κεφάλαιο 6, γίνεται μία μικρή σ ύνοψη και σ υζητούνται τα σ υμπεράσ ματα που προκύπτουν.

Κεφάλαιο 2 Παράλληλος Προγραμματισ μός Σε αυτό το κεφάλαιο θα παρατεθούν οι διαφορετικές αρχιτεκτονικές παράλληλου προγραμματισ μού οι οποίες χρησ ιμοποιούνται και αξιολογούνται σ την παρούσ α διπλωματική εργασ ία. Θα αναλυθούν τα προγραμματισ τικά μοντέλα σ τα οποία βασ ίζονται καθώς και η λογική με βάσ η την οποία έχουν σ χεδιασ τεί. 2.1. Προγραμματισμός σε πολλούς επεξεργαστές Processor Processor... Processor Processor Processor... Processor Cache Cache... Cache Cache Cache... Cache System Bus / Crossbar Switch Memory Memory... Memory Memory Interconnection Network (a) Shared Memory (b) Distributed Memory Processor... Processor Processor... Processor Cache... Cache System Bus / Crossbar Switch... Cache... Cache System Bus / Crossbar Switch Memory Memory Interconnection Network (c) Hybrid Σχ. 2.1: Κατηγορίες παράλληλων αρχιτεκτονικών πολλαπλών επεξεργασ τών Οπως αναφέρθηκε σ την Υποενότητα 1.1.4, η πλειοψηφία των σ ύγχρονων σ υσ τημάτων παράλληλων υπολογισ τών ανήκουν σ την κατηγορία αρχιτεκτονικών MIMD. Οπως φαίνεται σ το Σχήμα 2.1, τα σ υσ τήματα αυτά χωρίζονται σ ε τρεις κατηγορίες, με κριτήριο τον τρόπο οργάνωσ ης της μνήμης σ ε σ χέσ η με τους επεξεργασ τές:

32 Κεφάλαιο 2. Παράλληλος Προγραμματισ μός Aρχιτεκτονικές Mοιραζόμενης Mνήμης (Shared Memory): Ολοι οι επεξεργασ τές έχουν πρόσ βασ η σ ε ολόκληρη τη μνήμη του σ υσ τήματος. Μπορούν να διατηρούν τοπική ιεραρχία επιπέδων κρυφής μνήμης ή να μοιράζονται κάποιο επίπεδο, σ υνήθως το τελευταίο (last level cache). Η επικοινωνία με την κύρια μνήμη γίνεται μέσ ω κάποιου διαύλου (bus) ή αποδοτικότερα μέσ ω crossbar switch. Το προγραμματισ τικό μοντέλο προγραμματισ μού τέτοιων σ υσ τημάτων ονομάζεται μοντέλο μοιραζόμενης μνήμης και αποτελεί το πρώτο μοντέλο με το οποίο ασ χολείται η παρούσ α διπλωματική εργασ ία. Αρχιτεκτονικές Κατανεμημένης Μνήμης (Distributed Memory): Κάθε επεξεργασ τής, εκτός από τοπική ιεραρχία κρυφής μνήμης, διαθέτει τοπική κύρια μνήμη και έχει πρόσ βασ η μόνο σ ε αυτή. Η πρόσ βασ η σ ε δεδομένα που βρίσ κονται σ τις τοπικές μνήμες των υπόλοιπων επεξεργασ τών γίνεται με χρήσ η κάποιου προτύπου μεταφοράς δεδομένων το οποίο υλοποιείται μέσ ω ειδικού δικτύου διασ ύνδεσ ης (λ.χ. Ethernet, Infiniband, Myrinet). Τέτοια σ υσ τήματα προγραμματίζονται με χρήσ η του προγραμματισ τικού μοντέλου που ονομάζεται μοντέλο ανταλλαγής μηνυμάτων και δημοφιλέσ τερο πρότυπο αποτελεί το MPI (Message Passing Interface). Υβριδικές Αρχιτεκτονικές (Hybrid architectures): Στην κατηγορία αυτή ανήκουν οι αρχιτεκτονικές που σ υνδυάζουν τις δύο προαναφερθείσ ες. Δηλαδή, κόμβοι που υλοποιούν αρχιτεκτονική μοιραζόμενης μνήμης σ υνδέονται μέσ ω ειδικού δικτύου διασ ύνδεσ ης, υλοποιώντας αρχιτεκτονική κατανεμημένης μνήμης. Στην κατηγορία αυτή ανήκουν όλοι οι σ ύγχρονοι υπερυπολογισ τές. 2.1.1. Αρχιτεκτονικές Μοιραζόμενης Μνήμης Οπως ήδη έχει αναφερθεί, σ τις αρχιτεκτονικές μοιραζόμενης μνήμης όλοι οι επεξεργασ τές μοιράζονται έναν κοινό φυσ ικό χώρο διευθύνσ εων μνήμης (physical memory address space). Ανάλογα με τον τρόπο που οργανώνεται η μνήμη, οι αρχιτεκτονικές μοιραζόμενης μνήμης χωρίζονται σ ε: Uniform Memory Access (UMA) και Non-Uniform Memory Access (NUMA). Intrasocket Communication Memory Controller Hub MCH CPU 0 CPU 1 CPU 0 CPU 1 (a) UMA (b) NUMA Σχ. 2.2: Κατηγορίες αρχιτεκτονικών μοιραζόμενης μνήμης

2.1. Προγραμματισ μός σ ε πολλούς επεξεργασ τές 33 Στα σ υσ τήματα UMA, η πρόσ βασ η σ την κύρια μνήμη απαιτεί περίπου τον ίδιο χρόνο (latency) ανεξάρτητα από το ποιος επεξεργασ τής αιτείται την πρόσ βασ η και ανεξάρτητα από το ποιο memory module περιέχει τα αιτούμενα δεδομένα. Το μειονέκτημα είναι ότι το διαθέσ ιμο εύρος ζώνης (bandwidth) προς τη μνήμη μοιράζεται σ ε όλους του επεξεργασ τές. Αυτό σ υνεπάγεται ότι δεν επιτυγχάνεται καλή κλιμάκωσ η για μεγάλο αριθμό επεξεργασ τών. Αντίθετα, σ τα σ υσ τήματα NUMA, κάθε επεξεργασ τής διαθέτει τοπικά ένα τμήμα της κύριας μνήμης και σ υνδέεται με αυτή. Οι επεξεργασ τές σ υνδέονται μεταξύ τους με ένα ειδικό σ ύσ τημα διασ ύνδεσ ης ώσ τε να παραμένει ο χώρος διευθύνσ εων κοινός για όλους. Ομως, ο χρόνος κάθε πρόσ βασ ης σ τη μνήμη δεν είναι ίδιος. Είναι γρήγορος για δεδομένα που είναι αποθηκευμένα σ την τοπική μνήμη κάθε επεξεργασ τή ενώ πιο αργός για δεδομένα που βρίσ κονται σ την τοπική μνήμη άλλου επεξεργασ τή. Παρά το γεγονός ότι αυτό προκαλεί επιπλέον δυσ κολία σ τον προγραμματισ τή, τα σ υσ τήματα NUMA κλιμακώνουν καλύτερα για μεγαλύτερο αριθμό επεξεργασ τών ενώ προσ φέρουν σ ημαντικά αυξημένο σ υνολικό εύρος ζώνης προς τη μνήμη (aggregate memory bandwidth). Συνέπεια κρυφής μνήμης (Cache coherency) Κάθε επεξεργασ τής μπορεί να τροποποιεί δεδομένα σ την cache του χωρίς να ενημερώσ ει την κύρια μνήμη. Το γεγονός ότι κάθε επεξεργασ τής διατηρεί τοπική ιεραρχία κρυφής μνήμης σ υνεπάγεται ότι μπορεί να υπάρχουν πολλά αντίγραφα της ίδιας θέσ ης μνήμης σ τις κρυφές μνήμες των επεξεργασ τών. Προκειμένου να μη δημιουργηθεί ασ υνέπεια σ τα μοιραζόμενα δεδομένα, γίνεται χρήσ η ενός πρωτοκόλλου σ υνέπειας κρυφής μνήμης (cache coherency protocol). Συσ τήματα που υλοποιούν τέτοια πρωτόκολλα ονομάζονται ccuma (cache coherent UMA) και ccnuma ανάλογα με τον διαχωρισ μό που προαναφέρθηκε. Υπάρχουν δύο κατηγορίες τέτοιων πρωτοκόλλων. Στην πρώτη κατηγορία όλοι οι ελεγκτές κρυφής μνήμης (cache controller) επικοινωνούν μέσ ω ενός δικτύου διασ ύνδεσ ης και για κάθε εγγραφή κάποιου επεξεργασ τή ενημερώνονται οι υπόλοιποι ώσ τε αν έχουν αντίγραφο της σ υγκεκριμένης θέσ ης μνήμης να το «ακυρώσ ουν». Επιπλέον, «κρυφακούνε» (snooping) σ το δίκτυο για κάθε αίτησ η ανάγνωσ ης κάποιας θέσ ης μνήμης ώσ τε να την παράσ χουν εκείνοι σ ε περίπτωσ η που υπάρχει έγκυρο αντίγραφο σ την cache τους. Η δεύτερη κατηγορία αφορά πρωτόκολλα σ υνέπειας τύπου καταλόγου (directory). Κρατούνται σ τοιχεία για τις θέσ εις μνήμες που βρίσ κονται σ τις caches των επεξεργασ τών είτε σ ε ένα κεντρικό σ ημείο είτε κατανεμημένα σ ε κάθε επεξεργασ τή (distributed directories). Τα πρωτόκολλα τύπου καταλόγου προσ φέρουν καλύτερη κλιμάκωσ η και χρησ ιμοποιούνται κυρίως σ ε ccnuma σ υσ τήματα.

34 Κεφάλαιο 2. Παράλληλος Προγραμματισ μός 2.1.2. OpenMP Το OpenMP (Open Specifications for Multi Processing) [17] αποτελεί ένα πολύ δημοφιλές πρότυπο παράλληλου προγραμματισ μού (Application Programming Interface, API), το οποίο δίνει τη δυνατότητα δημιουργίας παράλληλων προγραμμάτων για σ υσ τήματα μοιραζόμενης μνήμης. Ακολουθεί το προγραμματισ τικό μοντέλο με το οποίο προγραμματίζονται τέτοια σ υσ τήματα. Τα προγράμματα που αναπτύσ σ ονται με χρήσ η του OpenMP μπορούν να εκτελεσ τούν σ ε διαφορετικές αρχιτεκτονικές και έχουν μεγάλη ικανότητα κλιμάκωσ ης. Είναι αρκετά απλό και εύκολο για τον προγραμματισ τή και υποσ τηρίζει τις γλώσ σ ες προγραμματισ μού C/C++ και Fortran. Με αφετηρία τη σ ειριακή υλοποίησ η του προγράμματος, ο προγραμματισ τής ορίζει τα τμήματα του προγράμματος που επιθυμεί να εκτελεσ τούν παράλληλα υποδεικνύοντάς τα σ τον κώδικα με χρήσ η ειδικών εντολών οδηγιών (directives). [18] Fork - Join Η βασ ική μονάδα εκτέλεσ ης είναι το νήμα (thread) και κάθε διεργασ ία αποτελείται από ένα ή παραπάνω νήματα. Το OpenMP ακολουθεί το μοντέλο Fork - Join. Αρχικά, μία εφαρμογή OpenMP ξεκινά με ένα μόνο νήμα, το οποίο ονομάζεται master thread. Οταν το πρόγραμμα εισ έρχεται σ ε μία περιοχή την οποία έχει ορίσ ει ο προγραμματισ τής να εκτελεσ τεί παράλληλα (παράλληλη περιοχή, parallel region), τότε δημιουργούνται (fork) αρκετά νήματα τα οποία εκτελούνται παράλληλα μεταξύ τους. Οταν ολοκληρωθεί η εκτέλεσ η της παράλληλης περιοχής τότε όλα τα νήματα τερματίζουν και σ υγχρονίζονται (join) και σ υνεχίζει μόνο το master thread. Στη σ υνέχεια, επαναλαμβάνεται η ίδια διαδικασ ία για κάθε παράλληλη περιοχή που σ υναντάται σ τον κώδικα. Βάσ ει των υποδείξεων του προγραμματισ τή (directives), ο μεταγλωττισ τής μετατρέπει κατάλληλα τον σ ειριακό κώδικα (single-threaded) σ ε πολυνηματικό (multi-threaded) για τις παράλληλες περιοχές. Στο Σχήμα 2.3 φαίνεται μια σ χηματική περιγραφή του μοντέλου Fork - Join. Σχ. 2.3: Μοντέλο Fork - Join

2.1. Προγραμματισ μός σ ε πολλούς επεξεργασ τές 35 Το OpenMP δεν μπορεί να εγγυηθεί ότι μία παράλληλη εκτέλεσ η ενός κώδικα είναι σ υνεπής με την αντίσ τοιχη σ ειριακή εκτέλεσ η αφού δεν είναι εγγυημένο ότι η είσ οδος και η έξοδος είναι σ υγχρονισ μένες. Ο σ υγχρονισ μός των νημάτων γίνονται με ευθύνη του προγραμματισ τή. Το OpenMP παρέχει αρκετές οδηγίες και σ υναρτήσ εις σ υγχρονισ μού οι οποίες πρέπει να χρησ ιμοποιηθούν σ ωσ τά για να είναι εξασ φαλισ μένη η ορθότητα του προγράμματος. Μοντέλο Μνήμης Το μοντέλο μνήμης του OpenMP είναι ένα χαλαρό μοντέλο μοιραζόμενης μνήμης και παρέχει δύο είδη μνήμης σ τα νήματα: μοιραζόμενη και ιδιωτική. Ενα τμήμα της κύριας μνήμης είναι μοιραζόμενο (shared memory space) και σ ε αυτό έχουν πρόσ βασ η όλα τα νήματα. Μπορεί να χρησ ιμοποιηθεί για ανταλλαγή δεδομένων μεταξύ των νημάτων καθώς και για το σ υγχρονισ μό τους. Επιπλέον, κάθε νήμα έχει τον προσ ωπικό/ιδιωτικό του χώρο σ τη μνήμη (thread private memory space) και μόνο εκείνο έχει πρόσ βασ η σ ε αυτόν. thread thread private memory space shared variable private variable shared memory space Σχ. 2.4: Μοντέλο μνήμης OpenMP Οταν ο προγραμματισ τής ορίζει μία παράλληλη περιοχή, μπορεί να ορίσ ει αν οι μεταβλητές που εμπεριέχονται σ ε αυτή θα είναι μοιραζόμενες ή ιδιωτικές. Κάθε αναφορά σ ε μοιραζόμενη μεταβλητή είναι μία αναφορά σ την ίδια την μεταβλητή, ενώ μια αναφορά σ ε ιδιωτική μεταβλητή είναι μια αναφορά σ ε ένα τοπικό αντίγραφο της μεταβλητής που βρίσ κεται αποθηκευμένο σ την ιδιωτική μνήμη του νήματος. Για την προσ πέλασ η των μοιραζόμενων μεταβλητών από διαφορετικά νήματα απαιτείται σ υγχρονισ μός και αυτό είναι ευθύνη του προγραμματισ τή. Το OpenMP παρέχει τη δυνατότητα η πρόσ βασ η σ ε μοιραζόμενες μεταβλητές να είναι ατομική ενέργεια (atomic operation) για κάθε νήμα και να μην χρειάζεται «χειροκίνητη» παρέμβασ η από τον προγραμματισ τή.

36 Κεφάλαιο 2. Παράλληλος Προγραμματισ μός OpenMP directives Οπως αναφέρθηκε προηγουμένως, ο προγραμματισ τής χρησ ιμοποιεί κατάλληλες οδηγίες (directives) που του παρέχει το OpenMP για να δημιουργήσ ει παράλληλα προγράμματα. Ολα τα directives σ τη γλώσ σ α προγραμματισ μού C έχουν την εξής μορφή: #pragma omp construct [clause [clause]...] όπου construct είναι το όνομα της οδηγίας και clauses είναι προαιρετικές φράσ εις. #pragma omp parallel To parallel directive αποτελεί τη βασ ικότερη οδηγία από όλες καθώς εκείνη ορίζει μια παράλληλη περιοχή σ τον κώδικα, δηλαδή το τμήμα που θα εκτελεσ τεί παράλληλα. Κώδικας 2.1 Παράδειγμα parallel directive # include <omp.h> main () {... # pragma omp parallel num_ threads (4) {... }... omp_set_num_threads (4); # pragma omp parallel shared (...) private (...) {... } }... Ο αριθμός των νημάτων που δημιουργούνται κατά την είσ οδο σ ε μια παράλληλη περιοχή μπορεί να καθορισ τεί από τέσ σ ερις παράγοντες, οι οποίοι κατά σ ειρά προτεραιότητας είναι: Η φράσ η (clause) num_threads() Η χρήσ η της σ υνάρτησ ης βιβλιοθήκης omp_set_num_threads() Η τιμή της μεταβλητής περιβάλλοντος (enviromental variable) OMP_NUM_THREADS Προκαθορισ μένη τιμή με χρήσ η της φράσ ης default (σ υνήθως ο αριθμός των επεξεργασ τικών πυρήνων του σ υσ τήματος)

2.1. Προγραμματισ μός σ ε πολλούς επεξεργασ τές 37 Συγχρονισ μός #pragma omp barrier: Η οδηγία barrier σ υγχρονίζει όλα τα νήματα μεταξύ τους. Απαιτεί από κάθε νήμα να σ ταματήσ ει προσ ωρινά την εκτέλεσ ή του σ το σ ημείο όπου υπάρχει η οδηγία barrier, μέχρις ότου όλα τα νήματα φτάσ ουν σ ε αυτό το σ ημείο. Στη σ υνέχεια, όλα τα νήματα ξεκινούν παράλληλα, από εκείνο το σ ημείο, την εκτέλεσ ή του κώδικα που ακολουθεί. #pragma omp master: Η οδηγία αυτή ορίζει ένα τμήμα κώδικα το οποίο θα εκτελεσ τεί από το mater thread μόνο. Δεν υπάρχει κάποιο φράγμα σ το τέλος του για τα υπόλοιπα νήματα, τα οποία απλά προσ περνούν την οδηγία αυτή. #pragma omp critical: Η οδηγία critical καθορίζει μια περιοχή η οποία πρέπει να εκτελεσ τεί μόνο από ένα νήμα κάθε φορά. Κυρίως χρησ ιμοποιείται για να ορισ τεί μια κρίσ ιμη περιοχή (critical region). Σε μια κρίσ ιμη περιοχή, μόνο μια διεργασ ία μπορεί να γράψει ή να διαβάσ ει μια μοιραζόμενη μεταβλητή, διασ φαλίζοντας έτσ ι την ακεραιότητα αυτής της μεταβλητής. #pragma omp atomic: Η οδηγία atomic καθορίζει ότι μια σ υγκεκριμένη θέσ η μνήμης πρέπει να ενημερώνεται ατομικά (atomic operation) από κάθε νήμα, μη επιτρέποντας σ ε πολλά νήματα να ενημερώσ ουν ταυτόχρονα τη σ υγκεκριμένη θέσ η μνήμης. Ετσ ι, απαγορεύει σ ε οποιοδήποτε νήμα να διακόψει κάποιο άλλο νήμα που βρίσ κεται σ τη διαδικασ ία προσ πέλασ ης ή αλλαγής της τιμής μιας μεταβλητής μοιραζόμενης μνήμης. Είδη μεταβλητών Με χρήσ η κατάλληλων φράσ εων ο προγραμματισ τής ορίζει το είδος (μοιραζόμενες ή ιδιωτικές) των μεταβλητών που εμπεριέχονται σ την παράλληλη περιοχή. Οι σ υχνότερα χρησ ιμοποιούμενες είναι: private: Με την φράσ η αυτή ορίζονται ιδιωτικές μεταβλητές για κάθε νήμα. Αυτό σ ημαίνει ότι κάθε νήμα έχει δικό του αντίγραφο της μεταβλητής σ την ιδιωτική μνήμη του. Ολες οι αναφορές σ τις private μεταβλητές μετατρέπονται σ ε αναφορές σ τα αντίγραφα των μεταβλητών. Τα αντίγραφα των μεταβλητών δεν αρχικοποιούνται κατά τη δημιουργία των νημάτων. firstprivate: Ομοια με προηγουμένως, με τη διαφορά ότι τα αντίγραφα αρχικοποιούνται σ την τιμή που είχε η μεταβλητή πριν την είσ οδο σ τη παράλληλη περιοχή. lastprivate: Πρόκειται για το αντίθετο της firstprivate, δηλαδή η τιμή της μεταβλητής διατηρείται κατά την έξοδο από τη παράλληλη περιοχή και είναι ίσ η με την τιμή που πήρε η μεταβλητή σ την εκτέλεσ η της τελευταίας (με λεξικογραφική έννοια) παράλληλης εκτέλεσ ης. shared: Με τη φράσ η αυτή ορίζονται μεταβλητές ως μοιραζόμενες σ ε όλα τα νήματα. Αυτό σ ημαίνει ότι αν ένα νήμα αλλάξει την τιμή μιας τέτοιας μεταβλητής, η αλλαγή θα είναι ορατή σ ε όλα τα νήματα. Τα νήματα δεν έχουν τοπικό αντίγραφο της μεταβλητής αυτής, χρησ ιμοποιούν τη θέσ η της σ τη μοιραζόμενη μνήμη. Ο προγραμματισ τής είναι υπεύθυνος να φροντίσ ει να μην δημιουργήσ ουν προβλήματα ταυτόχρονων αναγνώσ εων και εγγραφών της ίδιας μεταβλητής από πολλά νήματα. Οι shared μεταβλητές διατηρούν την τιμή τους κατά την έξοδο από την παράλληλη περιοχή.

38 Κεφάλαιο 2. Παράλληλος Προγραμματισ μός #pragma omp for Αποτελεί directive διαμοιρασ μού εργασ ίας και διαμοιράζει τις επαναλήψεις ενός βρόχου for σ τα νήματα της τρέχουσ ας παράλληλης περιοχής. Δηλαδή, δε δημιουργεί νέα νήματα και πρέπει να εμπεριέχεται μέσ α σ ε μια παράλληλη περιοχή. Κώδικας 2.2 Παράδειγμα for directive # include <omp.h> main () {... # pragma omp parallel # pragma omp for schedule ( static ) for (i =0; i<n; i ++) { a[i] = b[i] + c[i]; }... } Ο τρόπος με τον οποίο γίνεται ο διαμοιρασ μός των επαναλήψεων ανάμεσ α σ τα νήματα εξαρτάται από τη φράσ η schedule: static: Οι επαναλήψεις του βρόχου χωρίζονται σ ε ίσ α τμήματα μεγέθους chunk και μοιράζονται σ τατικά σ τα νήματα (πριν αρχίσ ει η εκτέλεσ η, κάθε νήμα γνωρίζει πόσ ες και ποιες επαναλήψεις θα εκτελέσ ει). Αν δεν ορισ τεί το chunk, τότε γίνεται ισ ομεγέθης διαμοιρασ μός, αν αυτό βέβαια είναι εφικτό. dynamic: Με αυτήν την παράμετρο οι επαναλήψεις χωρίζονται σ ε ίσ α τμήματα μεγέθους chunk. Αν δεν ορισ τεί το μέγεθος, κάθε τμήμα έχει μία επανάληψη του κώδικα. Κάθε φορά που ένα νήμα ολοκληρώνει την εκτέλεσ η του τμήματος που του έχει ανατεθεί, του ανατίθεται δυναμικά ένα άλλο τμήμα. guided: Το μέγεθος κάθε τμήματος μειώνεται εκθετικά, καθώς γίνονται οι αναθέσ εις των κομματιών του χώρου επανάληψης. Η τιμή chunk ορίζει το μικρότερο κομμάτι σ το οποίο μπορεί να σ πάσ ει. Η προκαθορισ μένη τιμή είναι 1. Τέλος, η φράσ η nowait, αν υπάρχει, αναιρεί το φράγμα που υπάρχει σ το τέλος της οδηγίας for.

2.1. Προγραμματισ μός σ ε πολλούς επεξεργασ τές 39 r thread master master thread master thread thread master master thread thread master master thread thread F O R F KO F R O KR K F O R F KO R K F O R F KO R K for for for section section single single J O I NJ O J I O NI N J O I NJ O I N J O I NJ O I N r thread master master thread master thread thread master master thread thread master master thread thread (a) (b) (c) Σχ. 2.5: Directives διαμοιρασ μού εργασ ίας #pragma omp sections Η οδηγία sections είναι μια μη επαναληπτική περιοχή διαμοιρασ μού εργασ ίας. Καθορίζει ότι τα εσ ωκλειόμενα τμήματα κώδικα θα διαμοιρασ τούν μεταξύ των νημάτων της ομάδας. Μια οδηγία sections μπορεί να περιέχει περισ σ ότερες από μία, ανεξάρτητες, οδηγίες section. Κάθε section εκτελείται μια φορά από ένα νήμα της ομάδας, ενώ διαφορετικά sections εκτελούνται από διαφορετικά νήματα. Στο τέλος κάθε οδηγίας section υπονοείται κάποιο φράγμα που θα βοηθήσ ει σ το σ υγχρονισ μό των νημάτων, εκτός κι αν χρησ ιμοποιηθεί η φράσ η nowait οπότε τα νήματα δεν περιμένουν για σ υγχρονισ μό μετά το πέρας της εργασ ίας τους. Κώδικας 2.3 Παράδειγμα sections directive # pragma omp parallel {... # pragma omp sections { # pragma omp section f1 (); # pragma omp section f2 (); }... } #pragma omp single Η οδηγία single καθορίζει ότι ο κώδικας που εσ ωκλείεται σ ε αυτή θα εκτελεσ τεί μόνο από ένα νήμα. Το νήμα που θα φτάσ ει πρώτο σ τη single οδηγία είναι εκείνο που θα εκτελέσ ει τον κώδικα. Τα νήματα που δεν εκτελούν την οδηγία, περιμένουν σ το τέλος του εσ ωκλειόμενου κώδικα, εκτός αν χρησ ιμοποιηθεί η σ υνθήκη nowait οπότε τα νήματα δεν θα περιμένουν για να σ υγχρονισ τούν.

40 Κεφάλαιο 2. Παράλληλος Προγραμματισ μός OpenMP Tasks Η έκδοσ η 3.0 του OpenMP που κυκλοφόρησ ε το 2008 εισ ήγαγε έναν νέο τρόπο για παραλληλοποίησ η με χρήσ η tasks. Με τη χρήσ η των tasks μπορεί να ορισ τεί ένα κομμάτι κώδικα εντός της παράλληλης περιοχής το οποίο μπορεί να εκτελεσ τεί κάποια σ τιγμή και όχι κατ ανάγκη από το νήμα που την όρισ ε. Παρέχουν την δυνατότητα ευκολότερης παραλληλοποίησ ης αναδρομικών σ υναρτήσ εων και γενικά εφαρμογών που παράγουν δουλειά δυναμικά. Επίσ ης, με τη βοήθεια των tasks μπορεί σ ε αρκετές περιπτώσ εις να αποφευχθεί η χρήσ η εμφωλευμένων παράλληλων περιοχών που μπορούν να δημιουργήσ ουν προβλήματα με ορισ μένους compilers. Η δημιουργία νέου task γίνεται με το εξής directive: #pragma omp task [clause [clause]...] Το νήμα που σ υναντά το παραπάνω directive δημιουργεί ένα νέο task με τον κώδικα που εμπεριέχεται σ το directive και το τοποθετεί σ ε ένα pool σ το οποίο βρίσ κονται τα tasks προς εκτέλεσ η. Αυτά εκτελούνται από τα διαθέσ ιμα νήματα. Επίσ ης, ένα task μπορεί να δημιουργήσ ει νέα tasks. Ο σ υγχρονισ μός των tasks γίνεται με τη χρήσ η barrier που ορίζεται από το παρακάτω directive: #pragma omp taskwait Το task που σ υναντάει ένα taskwait barrier σ ταματάει την εκτέλεσ ή του μέχρι όλα τα tasks που έχει δημιουργήσ ει να ολοκληρώσ ουν την εκτέλεσ ή τους. Αυτό ισ χύει μόνο για τα άμεσ α παιδιά του task και όχι για τα παιδιά δεύτερης γενιάς. Παρακάτω ακολουθεί παράδειγμα που φαίνεται αναλυτικά η δημιουργία και η δρομολόγησ η των 50 tasks. Κεφάλαιο 6. Συμπεράσ ματα Κώδικας2.4 6.1 ΠαράδειγμαOpenMP single directive tasks int a, b, c, x, y; # pragma omp parallel { # pragma omp single { # pragma omp task shared ( a) a = A (); # pragma omp task shared (b, c, x) { # pragma omp task shared ( b) b = B (); # pragma omp task shared ( c) c = C (); # pragma omp taskwait A B C f1 f2 } } # pragma omp task x = f1(b, c); } # pragma omp taskwait # pragma omp task y = f2(a, x);

2.2. Προγραμματισ μός σ ε Κάρτες Γραφικών 41 2.2. Προγραμματισμός σε Κάρτες Γραφικών Η δεύτερη κατηγορία παράλληλων αρχιτεκτονικών με την οποία ασ χολείται η παρούσ α διπλωματική εργασ ία είναι εκείνη των καρτών γραφικών. Οπως έχει ήδη αναφερθεί, οι κάρτες γραφικών αντλούν τη δύναμή τους από τις πολλές υπολογισ τικές μονάδες που διαθέτουν και από τη δυνατότητα ταυτόχρονης εκτέλεσ ης τεράσ τιου αριθμού νημάτων. Για το λόγο αυτό, οι εφαρμογές που μπορούν να εκμεταλλευτούν τις δυνατότητες των καρτών γραφικών είναι εκείνες οι οποίες εκτελούν πολλές αριθμητικές πράξεις σ ε μεγάλο όγκο δεδομένων και μπορούν να παραλληλοποιηθούν μαζικά σ ε πάρα πολλά νήματα. Ολες οι υλοποιήσ εις θα γίνουν χρησ ιμοποιώντας το CUDA SDK της εταιρίας Nvidia. Για την αξιολόγησ η των αποτελεσ μάτων θα χρησ ιμοποιηθούν κάρτες γραφικών της εταιρίας από την επισ τημονική σ ειρά Tesla, οι οποίες απευθύνονται ειδικά σ το HPC κομμάτι της αγοράς και είναι σ χεδιασ μένες προς αυτή την κατεύθυνσ η. Θα εξερευνηθούν οι δύο πιο σ ύγχρονες αρχιτεκτονικές της εταιρίας: Fermi (Compute Capability 2.0, 2.1) και Kepler (Compute Capability 3.0, 3.5). 2.2.1. Προγραμματισ τικό μοντέλο CUDA Η πλατφόρμα CUDA της Nvidia προσ φέρει μια επέκτασ η της γλώσ σ ας προγραμματισ μού C και παρέχει ειδικό compiler και κατάλληλες σ υναρτήσ εις για την αλληλεπίδρασ η του προγραμματισ τή με την κάρτα γραφικών (π.χ. αποσ τολή προγραμμάτων προς εκτέλεσ η, μεταφορά δεδομένων από και προς την κάρτα γραφικών, κλπ). C source code CUDA C functions Rest of C application NVCC Compiler CPU C Compiler CUDA object files CPU object files CPU GPU Executable Σχ. 2.6: Μεταγλώττισ η προγράμματος CUDA Τα τμήματα του πηγαίου κώδικα που προορίζονται για εκτέλεσ η σ την κάρτα γραφικών ονομάζονται kernels και μεταγλωττίζονται από τον nvcc compiler ενώ το υπόλοιπο πρόγραμμα που προορίζεται για τον επεξεργασ τή μεταγλωττίζεται από τον gcc compiler. Στη σ υνέχεια, ενοποιούνται σ ε ένα κοινό εκτελέσ ιμο αρχείο. Αρχικά, ξεκινάει η εκτέλεσ η του προγράμματος σ τον επεξεργασ τή και το περιβάλλον εκτέλεσ ης CUDA αναλαμβάνει να προωθήσ ει τα τμήματα του κώδικα που προορίζονται για την κάρτα γραφικών.

C.3 Programming GPUs C-23 42 Κεφάλαιο 2. Παράλληλος Προγραμματισ μός 2D Grid: 3 x 2 blocks Block 0, 0 Block 1, 0 Block 2, 0 Block 0, 1 Block 1, 1 Block 2, 1 Block 1, 1 Thread 0, 0 Thread 1, 0 Thread 2, 0 Thread 3, 0 Thread 4, 0 Thread 0, 1 Thread 1, 1 Thread 2, 1 Thread 3, 1 Thread 4, 1 Thread 0, 2 Thread 1, 2 Thread 2, 2 Thread 3, 2 Thread 4, 2 2D Block: 5 x 3 threads Σχ. 2.7: Οργάνωσ η των CUDA threads [4] kernelg 1D Grid is 4 thread blocks; each block is 6 threads kernelg<<<4, 6>>>(params); Block 0 Block 1 Block 2 Block 3 Κάθε kernel εκτελείται σ ε ολόκληρη την κάρτα γραφικών και αποτελείται από χιλιάδες νήματα τα οποία ονομάζονται CUDA threads. Τα threads ενός kernel χωρίζονται σ ε blocks και με τη σ ειρά τους τα blocks οργανώνονται σ ε ένα grid, όπως φαίνεται σ το Σχήμα 2.7. Κάθε thread FIGURE C.3.6 Sequence of kernel F instantiated on a 2D grid of 2D thread blocks, an interkernel synchronization barrier, followed by kernel G on a 1D grid of 1D thread blocks. ονομάζονται warps και αποτελούνται από 32 threads. Η οργάνωσ η των threads σ τα warps grained γίνεται data με parallelism. τέτοιο τρόπο Independent ώσ τε κάθε grids express warp να coarse-grained περιλαμβάνει task threads parallelism. με σ υνεχόμενα thread ID. A kernel is simply C code for one thread of the hierarchy. Η δρομολόγησ η γίνεται σ ε επίπεδο warps. Κάθε σ τιγμή ο δρομολογητής επιλέγει warps των Restrictions οποίων η επόμενη εντολή είναι έτοιμη για να εκτελεσ τεί και τα δρομολογεί. Το state (registers, For efficiency, program counters, and to simplify κλπ) its καθενός implementation, warp διατηρείται the CUDA onprogramming chip σ ε όλη τη model φάσ η της εκτέλεσ ης εξαιτίας has some των χιλιάδων restrictions. registers Threads που and thread διαθέτουν blocks οιmay πολυεπεξεργασ τές only be created by των invoking καρτών γραφικών. Ετσ ι, σ ε a parallel kernel, not from within a parallel kernel. Together with the required αντίθεσ η με τους επεξεργασ τές, το context switching γίνεται με μηδενικό κόσ τος (on the fly). independence of thread blocks, this makes it possible to execute CUDA programs Εξαιτίας αυτού και επειδή τα warps είναι ανεξάρτητα μεταξύ τους, ο δρομολογητής μπορεί να Block 2 έχει ένα μοναδικό τοπικό index μέσ α σ το block και κάθε block έχει επίσ ης μοναδικό index μέσ α Thread 0 Thread 1 Thread 2 Thread 3 Thread 4 σ το grid. Τόσ ο τα block όσ ο και τα grid μπορούν να έχουν μία, δύο ή τρεις το πολύ διασ τάσ εις. SIMT Thread 5 Οι κάρτες γραφικών της Nvidia ακολουθούν το προγραμματισ τικό μοντέλο SIMT (Single Instruction, Multiple Threads). Ολα τα threads προς εκτέλεσ η οργανώνονται σ ε ομάδες που επιλέγει διαφορετικό warp σ ε κάθε επόμενο issue, όπως φαίνεται σ το Σχήμα 2.8.

2.2. Προγραμματισ μός σ ε Κάρτες Γραφικών 43 time SIMT multithreaded instruction scheduler warp 8 instruction 11 Photo: Judy Schoonmaker warp 1 instruction 42 warp 3 instruction 95 warp 8 instruction 12 warp 3 instruction 96 warp 1 instruction 43 FIGURE C.4.2 SIMT multithreaded warp scheduling. The scheduler selects a ready warp and issues an instruction synchronously Σχ. 2.8: to the Δρομολόγησ η parallel threads composing και εκτέλεσ η the warp. Because warp warps [4] are independent, the scheduler may select a different warp each time. clocks. The Tesla SM multiprocessor described in Section C.7 also uses a warp size Το warp εκτελεί μια εντολή σ ε κάθε κύκλο ρολογιού και είναι η ίδια για όλα τα threads of 32 parallel threads, executing four threads per SP core for efficiency on plentiful που το αποτελούν. pixel threads Παρόλα and αυτά, computing κάθε threads. Thread διαθέτει blocks consist δικό του of one program or more warps. counter. Συνεπώς, This example SIMT multiprocessor manages a pool of 16 warps, a total of 512 είναι δυνατή η χρήσ η conditional branch και η διαφοροποίησ η των execution path των threads. threads. Individual parallel threads composing a warp are the same type and start Ομως, η εκτέλεσ η together τους at είναι the same διαφορετική program address, από τους but are επεξεργασ τές. otherwise free to Οπως branch φαίνεται and execute και σ το Σχήμα independently. At each instruction issue time, the SIMT multithreaded instruction 2.9, όταν σ υναντάται unit selects ένα a warp conditional that is ready branch to execute τότε its next τα execution instruction, path and then των issues threads that αποκλίνουν (diverge) αλλάinstruction εκτελείται to σ ειριακά the active κάθε threads τμήμα of that του warp. branch. A SIMT Ετσ ι, instruction εκτελείται is broadcast αρχικά το «then» synchronously to the active parallel threads of a warp; individual threads may be τμήμα του branch inactive καιdue όποια to independent threads δεν branching εμπίπτουν or predication. σ ε αυτό In απλά this multiprocessor, απενεργοποιούνται each προσ ωρινά. Στη σ υνέχεια, SP γίνεται scalar processor το ίδιο και core για executes το «else» an instruction τμήμα. for four Οταν individual ολοκληρωθεί threads of ηa εκτέλεσ η του warp using four clocks, reflecting the 4:1 ratio of warp threads to cores. branch, όλα τα threads SIMT processor σ υγκλίνουν architecture και σ υνεχίζουν is akin to single-instruction την εκτέλεσ η multiple τουdata κοινού (SIMD) execution path. Τα warps που design, περιέχουν which threads applies one πουinstruction αποκλίνουν to multiple ονομάζονται data lanes, divergent but differs warps. in that Οπως γίνεται SIMT applies one instruction to multiple independent threads in parallel, not just εμφανές, η ύπαρξη διαφορετικών execution paths εντός των warps έχει σ ημαντική επίπτωσ η σ τις επιδόσ εις λόγω της σ ειριακής εκτέλεσ ης των paths. 0 1 2 3 4 5 6 28 29 30 31... if... then... else...... Σχ. 2.9: Εκτέλεσ η conditional branch από ένα warp

44 Κεφάλαιο 2. Παράλληλος Προγραμματισ μός Το προγραμματισ τικό μοντέλο SIMT μοιάζει αρκετά με το μοντέλο SIMD με τη διαφορά ότι ένας SIΜΤ πολυεπεξεργασ τής μπορεί να εκτελεί ανεξάρτητα πολλά threads σ ε αντίθεσ η με έναν SIMD επεξεργασ τή που τα εκτελεί πάντα μαζί σ ε σ υγχρονισ μένα groups. Η αρχιτεκτονική SIMT αναζητεί παραλληλισ μό σ ε επίπεδο δεδομένων (DLP) ανάμεσ α σ τα ανεξάρτητα threads εν αντιθέσ ει με την SIMD που απαιτεί ο παραλληλισ μός σ ε επίπεδο δεδομένων να είναι ρητά δηλωμένος από το πρόγραμμα (σ ε κάθε vector instuction). Συνδυάζει τα πλεονεκτήματα και την αποδοτικότητα των SIMD αρχιτεκτονικών και ταυτόχρονα επιτρέπει ευκολότερο προγραμματισ μό αφού ο προγραμματισ τής γράφει thread-parallel κώδικα και όχι data-parallel. Μοντέλο μνήμης Το μοντέλο μνήμης της αρχιτεκτονικής CUDA παρέχει 3 διαφορετικά επίπεδα μνήμης με διαφορετική εμβέλεια το καθένα. Αρχικά, κάθε thread έχει την ιδιωτική του τοπική μνήμη (local memory) και χρησ ιμοποιείται για τοπικές μεταβλητές που δεν χωράνε σ τους καταχωρητές καθώς και για αποθήκευσ η των stack frames και για register spilling. Βρίσ κεται σ τη μνήμη RAM της κάρτας γραφικών, δηλαδή εκτός του chip. Κάθε block έχει πρόσ βασ η σ τη μοιραζόμενη μνήμη (shared memory) και είναι ορατή σ ε όλα τα threads που περιέχονται σ το block. Η διάρκεια ζωής της είναι όσ η είναι η διάρκεια ζωής του block. Βρίσ κεται εντός του chip και παρέχει ταχύτατη πρόσ βασ η. Χρησ ιμοποιείται για ανταλλαγή και διαμοίρασ η δεδομένων μεταξύ των threads και η έξυπνη χρήσ η της είναι πολύ σ ημαντική για την επίτευξη καλών επιδόσ εων. Τέλος, όλα τα νήματα όλων των blocks (δηλαδή όλο το grid) έχουν πρόσ βασ η σ την καθολική μνήμη (global memory), η οποία βρίσ κεται εκτός chip σ τη μνήμη RAM της κάρτας γραφικών. C-22 Appendix C Graphics and Computing GPUs Thread per-thread Local Memory Thread Block per-block Shared Memory Grid 0 Sequence... Grid 1 Inter-Grid Synchronization Global Memory... FIGURE C.3.5 Nested granularity levels thread, thread block, and grid have corresponding Σχ. 2.10: memory Μοντέλο sharing levels local, μνήμης της αρχιτεκτονικής shared, and global. CUDA Per-thread [4] local memory is private to the thread. Per-block shared memory is shared by all threads of the block. Per-application global memory is shared by all threads. single-program multiple data The CUDA programming model is similar in style to the familiar singleprogram multiple data (SPMD) model it expresses parallelism explicitly, and

2.2. Προγραμματισ μός σ ε Κάρτες Γραφικών 45 2.2.2. Αρχιτεκτονική Fermi Στα τέλη του 2009, η εταιρία Nvidia παρουσ ίασ ε τη νέα τότε αρχιτεκτονική καρτών γραφικών με το όνομα Fermi και αποτελούσ ε μεγάλη αναβάθμισ η από τις προηγούμενες γενιές. Ηταν η πρώτη αρχιτεκτονική με σ αφή προσ ανατολισ μό προς το compute κομμάτι της αγοράς και προσ έφερε σ τους προγραμματισ τές περισ σ ότερες δυνατότητες και ευελιξία κατά τη σ υγγραφή εφαρμογών. Σχ. 2.11: Block διάγραμμα του chip της αρχιτεκτονικής Fermi SM Instruction Cache Scheduler Scheduler Dispatch Dispatch Chip Register File (32768 x 32bit registers) Core Core Core Core Core Core Core Core Core Core Core Core CUDA Core Dispatch Port Operand Collector Core Core Core Core FP Unit INT Unit Core Core Core Core Core Core Core Core Result Queue Core Core Core Core Core Core Core Core Load/Store Units x 16 Special Func Units x 4 Interconnect Network 64K Configurable L1 Cache / Shared Memory Uniform Cache Σχ. 2.12: Διάρθρωσ η ενός SM της αρχιτεκτονικής Fermi

46 Κεφάλαιο 2. Παράλληλος Προγραμματισ μός Streaming Multiprocessor Το βασ ικό δομικό σ τοιχείο των καρτών γραφικών αρχιτεκτονικής Fermi είναι οι πολυεπεξεργασ τές Streaming Multiprocessors (SM). Ανάλογα με το μοντέλο της κάρτας γραφικών είναι ενεργοποιημένος διαφορετικός αριθμός από SM. Στο Σχήμα 2.12 φαίνεται η διάρθρωσ η ενός Streaming Multiprocessor. Αναλυτικότερα, κάθε SM αποτελείται από: 32 επεξεργασ τικούς πυρήνες CUDA Cores: Κάθε CUDA Core, ή αλλιώς Streaming Processors (SP), διαθέτει πλήρως pipelined αριθμητική μονάδα εκτέλεσ ης ακέραιων πράξεων (ALU), η οποία υποσ τηρίζει ακέραιους αριθμούς 64 bit. Επιπλέον, διαθέτει μονάδα εκτέλεσ ης πράξεων κινητής υποδιασ τολής (FPU). Οι 32 CUDA Cores είναι νοητά χωρισ μένοι σ ε δύο ομάδες εκτέλεσ ης των 16. Multiply-Add (MAD): A B = Product + (truncate extra digits) C = Result Fused Multiply-Add (FMA): A B = Product + (retain all digits) C = Result Σχ. 2.13: Εντολές MAD και FMA Η Fermi αρχιτεκτονική είναι η πρώτη που υποσ τηρίζει το πρότυπο αριθμών κινητής υποδιασ τολής IEEE 754-2008 και παρέχει εντολή για εκτέλεσ η fused multiply-add (FMA) πράξης τόσ ο για αριθμούς κινητής υποδιασ τολής απλής ακρίβειας όσ ο και για διπλής ακρίβειας. Μπορεί να εκτελεί μία πράξη κινητής υποδιασ τολής απλής ακρίβειας ανά κύκλο ρολογιού ενώ απαιτεί δύο κύκλους αν πρόκειται για πράξη διπλής ακρίβειας. Η υποσ τήριξη της εντολής FMA αποτελεί σ ημαντική βελτίωσ η σ ε σ χέσ η με την multiply-add (MAD) που υποσ τήριζαν οι προηγούμενες αρχιτεκτονικές, αφού δεν υπάρχει απώλεια ακρίβειας κατά την πράξη της πρόσ θεσ ης, όπως φαίνεται σ το Σχήμα 2.13. 16 Load/Store units: Οι 16 μονάδες Load/Store κάθε SM επιτρέπουν τον υπολογισ μό διευθύνσ εων προέλευσ ης και προορισ μού για 16 threads ανά κύκλο ρολογιού. Οι πράξεις load και store γίνονται τόσ ο από και προς την κύρια μνήμη RAM όσ ο και την κρυφή μνήμη. 4 Special Function units (SFU): Οι μονάδες SFU εκτελούν transcendental εντολές, όπως ημίτονο (sin), σ υνημίτονο (cos) ή τετραγωνική ρίζα. Εκτελούν μία εντολή ανά κύκλο ρολογιού. Συνεπώς, για την εκτέλεσ η όλων των threads ενός warp απαιτούνται 8 κύκλοι ρολογιού.

2.2. Προγραμματισ μός σ ε Κάρτες Γραφικών 47 32Κ Register File: Κάθε SM διαθέτει τεράσ τιο register file που αριθμεί 32768 καταχωρητές των 32 bit. Η ύπαρξη τόσ ο μεγάλου αριθμού καταχωρητών είναι απαραίτητη ώσ τε να γίνεται το context switching σ ε μηδενικό χρόνο. Κάθε thread μπορεί να χρησ ιμοποιήσ ει το πολύ 63 καταχωρητές. 64 ΚΒ μνήμης διαμορφώσ ιμη ως Shared Memory και L1 cache: Συνολικά σ ε κάθε SM υπάρχουν 64 KB τοπικής γρήγορης μνήμης σ την οποία έχουν πρόσ βασ η όλοι οι CUDA Cores. Ο προγραμματισ τής μπορεί να επιλέξει το χωρισ μό της μνήμης σ ε Shared Memory και L1 cache επιλέγοντας ανάμεσ α σ ε δύο διαμορφώσ εις: είτε 48 ΚΒ για την Shared Memory και 16 ΚΒ για L1 cache είτε το ανάποδο. Το τι θα αποθηκεύεται σ την Shared Memory ορίζεται από τον προγραμματισ τή, οπότε μπορεί να χαρακτηρισ τεί ως μια «χειροκίνητα» ελεγχόμενη κρυφή μνήμη. Dual Warp Scheduler: Στους SM γίνεται η δρομολόγησ η των warps προς εκτέλεσ η. Κάθε SM διαθέτει διπλούς warp schedulers και δύο instruction dispatch units έτσ ι ώσ τε δύο διαφορετικά warps να μπορούν να δρομολογηθούν και να εκτελεσ τούν ταυτόχρονα. Οι δρομολογητές επιλέγουν δύο warps τα οποία είναι έτοιμα να εκτελεσ τούν και κάνουν issue μια εντολή από κάθε warp σ ε μια από της δύο ομάδες εκτέλεσ ης των 16 CUDA Cores. Επειδή τα warps είναι ανεξάρτητα μεταξύ τους, δεν υπάρχει η ανάγκη για έλεγχο εξαρτήσ εων μεταξύ τους και σ υνεπώς επιτυγχάνονται μεγάλες επιδόσ εις δρομολόγησ ης. Shared Memory Η χρήσ η της ταχύτατης on-chip Shared Memory από τον προγραμματισ τή είναι καταλυτική για την επίτευξη υψηλών επιδόσ εων. Ορίζεται σ ε επίπεδο block και είναι ορατή σ ε όλα τα threads του block. Οπως ήδη αναφέρθηκε προηγουμένως, το μέγεθος της μπορεί να ορισ θεί ίσ ο με 48 ΚΒ ή 16 ΚΒ. Η πρόσ βασ η σ τη Shared Memory γίνεται μέσ ω 32 banks. Τα δεδομένα αποθηκεύονται με τέτοιο τρόπο ώσ τε διαδοχικές 32 bit λέξεις να αποθηκεύονται σ ε διαδοχικά banks. Η μεταφορά δεδομένων από διαφορετικά banks γίνεται ταυτόχρονα με μέγισ το εύρος ανά bank ίσ ο με 32 bit ανά 2 κύκλους ρολογιού. Ομως, όταν σ υμπίπτουν ταυτόχρονα δύο ή παραπάνω αιτήσ εις πρόσ βασ ης σ το ίδιο bank, τότε σ υμβαίνει αυτό που ονομάζεται bank conflict και οι αιτήσ εις δεν εξυπηρετούνται ταυτόχρονα αλλά σ ειριακά. Το γεγονός αυτό μπορεί να έχει σ ημαντική επίπτωσ η σ τις επιδόσ εις του προγράμματος και σ υνεπώς ο προγραμματισ τής οφείλει να λάβει υπ όψιν του τον τρόπο με τον οποίο οργανώνεται η Shared Memory. Η μέγισ τη απόδοσ η επιτυγχάνεται όταν διαφορετικά threads διαβάσ ουν ή γράφουν σ ε διαφορετικά banks. Στο Σχήμα 2.14 φαίνονται περιπτώσ εις αποδοτικής και μη πρόσ βασ ης.

48 Κεφάλαιο 2. Παράλληλος Προγραμματισ μός conflicts No bank conflicts 2 way bank conflicts 8 way bank co Bank 0 Thread 0 Bank 0 Thread 0 Bank 0 Thread 0 Bank 1 Thread 1 Bank 1 Thread 1 Bank 1 Thread 1 Bank 2 Thread 2 Bank 2 Thread 2 Bank 2 Thread 2 Bank 3 Thread 3 Bank 3 Thread 3 Bank 3 Thread 3 Bank 4 Thread 4 Bank 4 Thread 4 Bank 4 Thread 4 Bank 5 Thread 5 Bank 5 Thread 5 Bank 5 Thread 5 Bank 6 Thread 6 Bank 6 Thread 6 Bank 6 Thread 6 Bank 7 Thread 7 Bank 7 Thread 7 Bank 7 Thread 7 Bank 8 Thread 8 Bank 8 Thread 8 Bank 8 Thread 8 Bank 9 Thread 9 Bank 9 Thread 9 Bank 9 Thread 9 Bank 10 Thread 10 Bank 10 Thread 10 Bank 10 Thread 10...... Bank 31 Thread 31 Bank 31 Thread 31 Bank 31 Thread 31 2 way bank conflicts 8 way bank conflicts Thread 0 Bank 0 Thread 0 x8 Bank 0 Thread 1 Bank 1 Thread 1 Bank 1 Thread 2 Bank 2 Thread 2 Bank 2 Thread 3 Bank 3 Thread 3 Bank 3 Thread 4 Bank 4 Thread 4 Bank 4 Thread 5 Bank 5 Thread 5 Bank 5 Thread 6 Bank 6 Thread 6 Bank 6 Thread 7 Thread 8 Bank 7 Bank 8 Thread 7 Thread 8 x8 Bank 7 Bank 8 Thread 9 Bank 9 Thread 9 Bank 9 Thread 10 Bank 10 Thread 10 Bank 10.... Thread 31 Bank 31 Thread 31 Bank 31 Σχ. 2.14: Bank conflicts κατά την πρόσ βασ η σ τη Shared Memory Ιεραρχία Μνήμης Η κύρια μνήμη RAM της κάρτας γραφικών σ υνδέεται με το chip μέσ ω έξι καναλιών DRAM πλάτους 64 bit και υποσ τηρίζεται μνήμη τεχνολογίας GDDR5. Το μέγισ το σ υνολικό εύρος ζώνης που επιτυγχάνεται ανέρχεται σ τα 177 GB/s. Επιπρόσ θετα, υπάρχει L2 cache μεγέθους 768 KB, σ την οποία έχουν πρόσ βασ η όλοι οι SM του chip. Η σ ύνδεσ η με το υπόλοιπο σ ύσ τημα γίνεται μέσ ω διαύλου PCI Express 2.0 με μέγισ το εύρος ζώνης 8 GB/s ανά κατεύθυνσ η. Η αρχιτεκτονική Fermi είναι η πρώτη που υποσ τηρίζει ECC προσ τασ ία σ τη μεταφορά δεδομένων από και προς τη μνήμη RAM, χαρακτηρισ τικό που έχει ξεκάθαρο προσ ανατολισ μό προς το compute κομμάτι της αγοράς και υποσ τηρίζεται μόνο από τις επαγγελματικές σ ειρές καρτών γραφικών Tesla και Quadro. Επιπλέον, όλες οι μεταφορές δεδομένων σ τις on-chip

2.2. Προγραμματισ μός σ ε Κάρτες Γραφικών 49 μνήμες (L1, Shared Memory, L2) προσ τατεύονται επίσ ης με ECC. Στο Σχήμα 2.15 φαίνεται το διάγραμμα ιεραρχίας όλων των επιπέδων μνήμης. SM 0 SM 1 SM N Register File Register File... Register File L1 Shared Memory L1 Shared Memory L1 Shared Memory L2 Cache DRAM Global Memory Σχ. 2.15: Ιεραρχία μνήμης αρχιτεκτονικής Fermi Στον παρακάτω πίνακα παρουσ ιάζονται αναλυτικά όλα τα είδη μνήμης που υποσ τηρίζει η πλατφόρμα CUDA, η φυσ ική μνήμη σ την οποία αποθηκεύονται καθώς επίσ ης η εμβέλεια και το ύψος του latency. Memory Stored in Latency Scope register register file 1 cycle thread local DRAM 400-600 cycles thread shared Shared Memory 1-32 cycles block global DRAM 400-600 cycles grid constant DRAM 400-600 cycles grid Πίν. 2.1: Είδη μνήμης της πλατφόρμας CUDA Μοντέλο εκτέλεσ ης Οταν μία εφαρμογή αποσ τέλλεται σ την κάρτα γραφικών, όλα τα threads έχουν οργανωθεί σ ε blocks και τα blocks σ ε ένα grid το οποίο τελικά ανατίθεται σ την κάρτα γραφικών για εκτέλεσ η. Ανάλογα με τον αριθμό των threads που περιέχουν τα blocks, κάθε SM αναλαμβάνει να εκτελέσ ει σ υγκεκριμένο αριθμό από blocks. Οι SM έχουν σ υγκεκριμένη χωρητικότητα από threads τα οποία μπορούν να είναι ενεργά κάθε σ τιγμή. Ο μέγισ τος αριθμός ενεργών thread ανέρχεται σ ε 1536 threads (σ υνεπώς το πολύ 48 warps) ενώ κάθε block μπορεί να περιέχει μέχρι 1024 threads το πολύ. Ο μέγισ τος αριθμός blocks ανά SM είναι 8 blocks. Ο προγραμματισ τής

50 Κεφάλαιο 2. Παράλληλος Προγραμματισ μός πρέπει να επιλέξει κατάλληλο αριθμό threads ανά block ώσ τε να επιτύχει βέλτισ τη κατανομή των blocks και 100% occupancy των SM. Στη σ υνέχεια, ο δρομολογητής κάθε πολυεπεξεργασ τή SM (GigaThread scheduler) αναλαμβάνει να δρομολογήσ ει τα warps των threads από τα block που του έχουν ανατεθεί και τελικά κάθε CUDA Core αναλαμβάνει να εκτελέσ ει ένα thread κάθε σ τιγμή. Στο Σχήμα 2.16 αποτυπώνεται η κατανομή που περιγράφηκε. Σχ. 2.16: Μοντελο εκτέλεσ ης CUDA

2.2. Προγραμματισ μός σ ε Κάρτες Γραφικών 51 2.2.3. Αρχιτεκτονική Kepler Το 2012 η εταιρία Nvidia παρουσ ίασ ε την διάδοχη της αρχιτεκτονικής Fermi η οποία ονομάζεται Kepler. Η νέα αρχιτεκτονική προσ φέρει θεαματική αύξησ η των επιδόσ εων, διατηρώντας την κατανάλωσ η σ τα ίδια επίπεδα. Αυτό οφείλεται σ τη χρήσ η λιθογραφίας 28 nm σ ε σ χέσ η με την λιθογραφία 40 nm που χρησ ιμοποιούσ αν τα chip της αρχιτεκτονικής Fermi. Επιπλέον, εισ αγάγει πολλά νέα χαρακτηρισ τικά και καινοτομίες με σ τόχο την βελτίωσ η των compute δυνατοτήτων της κάρτας γραφικών. Θα αναφερθούν σ υνοπτικά μόνο οι αλλαγές εκείνες οι οποίες αφορούν την παρούσ α διπλωματική εργασ ία. Νέα αρχιτεκτονική Streaming Multiprocessor (SMX) Η κυριότερη αλλαγή της αρχιτεκτονικής Kepler είναι ότι αναβαθμίζει σ ημαντικά τους πολυεπεξεργασ τές SM της γενιάς Fermi και πλέον ονομάζονται SMX. Στο Σχήμα 2.17 φαίνεται η διάρθρωσ η ενός Streaming SMX. Multiprocessor (SMX) Architecture Kepler GK110 s new SMX introduces several architectural innovations that make it not only the most powerful multiprocessor we ve built, but also the most programmable and power efficient. SMX: 192 single precision CUDA cores, 64 double precision units, 32 special function units (SFU), and 32 load/store units (LD/ST). Σχ. 2.17: Διάρθρωσ η ενός SMX της αρχιτεκτονικής Kepler

52 Κεφάλαιο 2. Παράλληλος Προγραμματισ μός Οι αλλαγές ενός Kepler SMX, εν σ υγκρίσ ει με έναν Fermi SM, είναι οι εξής: 192 single precision CUDA Cores: Ο αριθμός των CUDA Cores αυξάνεται σ ημαντικά από 32 σ ε 192. Κάθε CUDA Core εξακολουθεί να διαθέτει πλήρως pipelined αριθμητική μονάδα εκτέλεσ ης ακέραιων πράξεων (ALU) και πράξεων κινητής υποδιασ τολής απλής ακρίβειας (FPU) με υποσ τήριξη του προτύπου αριθμών κινητής υποδιασ τολής IEEE 754-2008 και επίσ ης της εντολής FMA. Ομως, σ ε αντίθεσ η με την αρχιτεκτονική Fermi, δεν εκτελεί πράξεις κινητής υποδιασ τολής διπλής ακρίβειας, παρέχοντας ειδικές μονάδες για αυτό το σ κοπό. 64 double precision units: Σε κάθε SMX ενσ ωματώνονται 64 μονάδες εκτέλεσ ης πράξεων κινητής υποδιασ τολής διπλής ακρίβειας, διπλασ ιάζοντας τις επιδόσ εις σ ε σ χέσ η με την αρχιτεκτονική Fermi. Αυτό έγινε λόγω της μεγάλης ζήτησ ης από το HPC κομμάτι της αγοράς για υψηλές επιδόσ εις σ ε αυτόν τον τομέα. Quad Warp Scheduler: Πλέον, κάθε SMX ενσ ωματώνει τέσ σ ερις warp schedulers και οκτώ instruction dispatch units. Ετσ ι, μπορεί να δρομολογεί και να εκτελεί ταυτόχρονα τέσ σ ερα warps (αντί για δύο). Οι δρομολογητές επιλέγουν τέσ σ ερα warps τα οποία είναι έτοιμα να εκτελεσ τούν και μπορούν να κάνουν issue δύο ανεξάρτητες μεταξύ τους εντολές ανά warp. 64Κ Register File: Το μέγεθος του register file διπλασ ιάζεται και φτάνει τους 65536 καταχωρητές των 32 bit. Η αύξησ η του ήδη μεγάλου αριθμού καταχωρητών της αρχιτεκτονικής Fermi είναι απαραίτητη για την υποσ τήριξη των περισ σ ότερων ταυτοχρόνως εκτελούμενων warps. Επίσ ης, πλέον κάθε thread μπορεί να χρησ ιμοποιήσ ει μέχρι 255 καταχωρητές. 32 Load/Store units: Οι μονάδες Load/Store διπλασ ιάζονται από 16 σ ε 32 ανά SMX, προκειμένου να ανταποκριθούν σ τον αυξημένο αριθμό των επεξεργασ τικών μονάδων και των warps που μπορούν να εκτελούνται ταυτόχρονα. 32 Special Function units (SFU): Οι μονάδες SFU οκταπλασ ιάζονται από 4 σ ε 32. 64 ΚΒ μνήμης διαμορφώσ ιμη ως Shared Memory και L1 cache: Το μέγεθος της Shared Memory διατηρείται σ τα 64 KB. Ομως, σ τις επιλογές διαμόρφωσ ης του μεγέθους των Shared Memory / L1 Cache προσ τίθεται η επιλογή 32 KB / 32 KB, εκτός από τις 48 KB / 16 KB και 16 KB / 48 KB. Επίσ ης, διπλασ ιάζεται το εύρος ζώνης κάθε bank της Shared Memory. 48 KB Read-Only Data Cache: Τέλος, επιπροσ θέτως της L1 cache, η αρχιτεκτονική Kepler εισ αγάγει μια κρυφή μνήμη 48 KB ανά SMX για την αποθήκευσ η δεδομένων, η οποία είναι μόνο για ανάγνωσ η (Read-Only). Στην αρχιτεκτονική Fermi, η σ υγκεκριμένη μνήμη ήταν προσ βάσ ιμη μόνο από τα Texture Units και ο προγραμματισ τής έπρεπε να δηλώσ ει ρητά ως textures τα δεδομένα που ήθελε να φορτώσ ει, γεγονός το οποίο είχε αρκετούς περιορισ μούς και επιπλέον επίπεδο δυσ κολίας.

2.2. Προγραμματισ μός σ ε Κάρτες Γραφικών 53 Ιεραρχία Μνήμης Η κύρια μνήμη RAM της κάρτας γραφικών σ υνεχίζει να σ υνδέεται με το chip μέσ ω έξι καναλιών DRAM πλάτους 64 bit και υποσ τηρίζεται ταχύτερη μνήμη τεχνολογίας GDDR5. Συνεπώς, το μέγισ το σ υνολικό εύρος ζώνης που επιτυγχάνεται ανέρχεται σ τα 288 GB/s. Επιπρόσ θετα, το μέγεθος της L2 cache αυξάνεται από 768 KB σ ε 1536 KB και το εύρος ζώνης της ανά κύκλο ρολογιού διπλασ ιάζεται. Η σ ύνδεσ η με το υπόλοιπο σ ύσ τημα γίνεται πλέον μέσ ω διαύλου PCI Express 3.0 με μέγισ το εύρος ζώνης 16 GB/s ανά κατεύθυνσ η. Οπως και σ την αρχιτεκτονική Fermi, υποσ τηρίζεται ECC προσ τασ ία σ τη μεταφορά δεδομένων από και προς όλα τα επίπεδα μνήμης. SMX 0 SMX 1 SMX N Register File Register File... Register File Read Only Cache L1 Shared Memory Read Only Cache L1 Shared Memory Read Only Cache L1 Shared Memory L2 Cache DRAM Global Memory Σχ. 2.18: Ιεραρχία μνήμης αρχιτεκτονικής Kepler Μοντέλο εκτέλεσ ης Πλέον, o μέγισ τος αριθμός ενεργών thread ανά SMX ανέρχεται σ ε 2048 threads, ενώ κάθε block σ υνεχίζει να περιέχει μέχρι 1024 threads το πολύ. Ομως, ο μέγισ τος αριθμός blocks ανά SMX διπλασ ιάζεται από 8 σ ε 16 blocks. 2.2.4. Γλώσ σ α προγραμματισ μού CUDA C Οπως έχει ήδη αναφερθεί, η CUDA C είναι μια επέκτασ η της γλώσ σ ας προγραμματισ μού C και παρέχει ειδικό compiler για τη μεταγλώττισ η εφαρμογών σ την κάρτα γραφικών. Επιπλέον, παρέχει κατάλληλες σ υναρτήσ εις και οδηγούς για την αλληλεπίδρασ η με την κάρτα γραφικών, την αντιγραφή δεδομένων από και προς την κάρτα καθώς και την αποσ τολή του τμήματος του κώδικα για εκτέλεσ η σ την κάρτα γραφικών. Στον Κώδικα 2.5 που ακολουθεί φαίνεται ένα απλό παράδειγμα προγράμματος γραμμένο σ ε CUDA C που προσ θέτει δύο διανύσ ματα (a, b) σ ε ένα τρίτο (c).

54 Κεφάλαιο 2. Παράλληλος Προγραμματισ μός Κώδικας 2.5 Παράδειγμα προγράμματος σ ε CUDA C για πρόσ θεσ η διανυσ μάτων # define N ( 1024* 1024) # define THREADS_ PER_ BLOCK 256 global void add ( int *a, int *b, int *c) { int index = threadidx. x + blockidx. x * blockdim. x; c[ index ] = a[ index ] + b[ index ]; } int main () { int *a, *b, *c; // host copies of a, b, c int *d_a, *d_b, * d_c ; // device copies of a, b, c // Host space allocation and initialization... // Alloc space for device copies of a, b, c cudamalloc (( void **)& d_a, size ); cudamalloc (( void **)& d_b, size ); cudamalloc (( void **)& d_c, size ); // Copy inputs to device cudamemcpy (d_a, a, size, cudamemcpyhosttodevice ); cudamemcpy (d_b, b, size, cudamemcpyhosttodevice ); // Launch add () kernel on GPU dim3 grid ( N / THREADS_ PER_ BLOCK ); dim3 block ( THREADS_ PER_ BLOCK ); add <<<grid, block >>>(d_a, d_b, d_c ); // Copy result back to host cudamemcpy (c, d_c, size, cudamemcpydevicetohost ); } // Cleanup free (a); free (b); free (c); cudafree ( d_a ); cudafree ( d_b ); cudafree ( d_c ); return 0; Αρχικά, με τη σ υνάρτησ η cudamalloc() δεσ μεύεται χώρος σ τη μνήμη της κάρτας γραφικών για την αποθήκευσ η των δύο διανυσ μάτων που θα προσ τεθούν και για το διάνυσ μα που θα αποθηκευτεί το αποτέλεσ μα. Στη σ υνέχεια, με τη σ υνάρτησ η cudamemcpy() αντιγράφονται τα δεδομένα των διανυσ μάτων από τη μνήμη του σ υσ τήματος σ τη μνήμη της κάρτας γραφικών. Το τέταρτο όρισ μα της σ υνάρτησ ης δηλώνει την κατεύθυνσ η αντιγραφής δεδομένων, δηλαδή: cudamemcpyhosttodevice: δηλώνει αντιγραφή δεδομένων από την κύρια μνήμη RAM του σ υσ τήματος (Host) προς τη μνήμη της κάρτας γραφικών (Device). cudamemcpydevicetohost: δηλώνει αντιγραφή δεδομένων από τη μνήμη της κάρτας γραφικών (Device) προς την κύρια μνήμη RAM του σ υσ τήματος (Host).

2.2. Προγραμματισ μός σ ε Κάρτες Γραφικών 55 Επειτα, γίνεται η κλήσ η της σ υνάρτησ ης add() που είναι το τμήμα του κώδικα που τελικά εκτελείται σ την κάρτα γραφικών. Η λέξη κλειδί global δηλώνει ότι πρόκειται για σ υνάρτησ η η οποία εκτελείται σ την κάρτα γραφικών και καλείται από τον επεξεργασ τή (Host). Η κλήσ η γίνεται με μια εντολή της μορφής: function<<<grid, BLOCK>>>(... ) όπου: GRID: δηλώνει τον τρόπο με τον οποίο οργανώνονται τα blocks σ το grid, δηλαδή τις διασ τάσ εις του grid. Η μεταβλητή GRID είναι τύπου dim3 (ενσ ωματωμένου vector τύπου της CUDA) και μπορεί να έχει μία, δύο ή τρεις διασ τάσ εις. BLOCK: δηλώνει τον τρόπο με τον οποίο οργανώνονται τα threads σ ε κάθε block. Ομοίως, είναι τύπου dim3 και μπορεί να έχει έως 3 διασ τάσ εις. Στη σ υνέχεια, ξεκινάει η εκτέλεσ η της σ υνάρτησ ης add() σ την κάρτα γραφικών. Κάθε thread εκτελεί τον ίδιο κώδικα και επεξεργάζεται ένα σ τοιχείο κάθε διανύσ ματος. Ο προσ διορισ μός του σ τοιχείου που επεξεργάζεται κάθε thread υπολογίζεται με βάσ η κάποιες ενσ ωματωμένες και αυτόματα ορισ μένες μεταβλητές που παρέχει η CUDA: dim3 griddim: διασ τάσ εις του grid σ ε blocks dim3 blockdim: διασ τάσ εις των blocks σ ε threads dim3 blockidx: index του block μέσ α σ το grid dim3 threadidx: index του thread μέσ α σ το block Στο παράδειγμα του Κώδικα 2.5, τόσ ο τα blocks όσ ο και το grid έχουν μία μόνο διάσ τασ η. Στο Σχήμα 2.19 φαίνεται ο τρόπος με τον οποίο κάθε thread υπολογίζει ποιο σ τοιχείο των διανυσ μάτων θα επεξεργασ τεί. threadidx.x threadidx.x threadidx.x threadidx.x 0 1 2 3 4 5 6 7 0 1 2 3 4 5 6 7 0 1 2 3 4 5 6 7 0 1 2 3 4 5 6 7 blockidx.x = 0 blockidx.x = 1 blockidx.x = 2 blockidx.x = 3 index = blockidx.x * blockdim.x + threadidx.x 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 index = blockidx.x * blockdim.x + threadidx.x = 2 * 8 + 5 = 21 Σχ. 2.19: Παράδειγμα υπολογισ μού index ανά thread Τέλος, μετά την ολοκλήρωσ η της εκτέλεσ ης σ την κάρτα γραφικών, αντιγράφονται πίσ ω σ την μνήμη του σ υσ τήματος τα αποτελέσ ματα της εκτέλεσ ης.

56 Κεφάλαιο 2. Παράλληλος Προγραμματισ μός 2.3. Προγραμματισμός σε Intel Xeon Phi Ο σ υνεπεξεργασ τής (co-processor) Intel Xeon Phi αποτελεί το πρώτο προϊόν που βασ ίζεται σ την αρχιτεκτονική Many Integrated Core (MIC) της εταιρίας Intel και φέρει την κωδική ονομασ ία Knights Corner. Στην καρδιά του βρίσ κεται ένα chip το οποίο αποτελείται από επεξεργασ τικούς πυρήνες Pentium, με αρκετές τροποποιήσ εις που θα αναλυθούν παρακάτω. Η προσ έγγισ η της αρχιτεκτονικής MIC είναι η ενσ ωμάτωσ η επεξεργασ τικών πυρήνων μεσ- αίου μεγέθους, πολυπλοκότητας και κατανάλωσ ης. Οι πυρήνες Pentium βρίσ κονται ανάμεσ α σ τους πολύ μικρούς και απλούς πυρήνες των καρτών γραφικών και σ τους πολύ μεγάλους και πολύπλοκους πυρήνες των επεξεργασ τών. Η προσ έγγισ η αυτή προσ φέρει το πλεονέκτημα ότι πρόκειται για αρχιτεκτονική x86. Ετσ ι, μπορεί να επωφεληθεί από τη χρήσ η των ήδη γνωσ τών x86 προγραμματισ τικών μοντέλων. Επιπλέον, ήδη γραμμένες εφαρμογές για x86 επεξεργασ τές μπορούν να εκτελεσ τούν με μικρές τροποποιήσ εις. Σχ. 2.20: Intel Xeon Phi Συνδέεται μέσ ω διαύλου PCI Express όπως οι κάρτες γραφικών, αλλά ακολουθεί αρκετά διαφορετικό σ χεδιασ μό. Σε αντίθεσ η με τις κάρτες γραφικών, ενσ ωματώνει δικό του λειτουργικό σ ύσ τημα που βασ ίζεται σ το Linux. Χρησ ιμοποιεί γρήγορη μνήμη DRAM τεχνολογίας GDDR5. 2.3.1. Αρχιτεκτονική του Xeon Phi Ο Xeon Phi αποτελείται από: x86 επεξεργασ τικούς πυρήνες βασ ισ μένους σ ε πυρήνες Pentium (το γρηγορότερο μοντέλο ενσ ωματώνει 61 πυρήνες) κρυφή μνήμη L2 ανά πυρήνα 8 ελεγκτές μνήμης (MC) GDDR5, παρέχοντας μέγισ το σ υνολικό εύρος ζώνης ίσ ο με 352 GB/s και υποσ τηρίζοντας μέχρι 16 GB μνήμης διπλής κατεύθυνσ ης δίαυλο διασ ύνδεσ ης τύπου δαχτυλιδιού (bi-directional ring bus) με πολύ υψηλό εύρος ζώνης τις απαραίτητες δομές (Tag Directories, TD) ώσ τε να εξασ φαλίζεται η σ υνέπεια (cache coherency) ανάμεσ α σ ε όλες οι L2 cache.

2.3. Προγραμματισ μός σ ε Intel Xeon Phi 57 Ο δίαυλος διασ ύνδεσ ης σ υνδέει όλους τους πυρήνες μεταξύ τους καθώς επίσ ης με τους ελεγκτές μνήμης και το I/O interface. Η σ ύνδεσ η με το υπόλοιπο σ ύσ τημα γίνεται μέσ ω διαύλου PCI Express 2.0, παρέχοντας μέγισ το εύρος ζώνης 8 GB/s ανά κατεύθυνσ η. Στο Σχήμα 2.21 φαίνεται ένα block διάγραμμα του Phi ενώ σ το Σχήμα 2.22 φαίνεται η διάρθρωσ η κάθε επεξεργασ τικού πυρήνα που ενσ ωματώνει ο Xeon Phi. x86 Core x86 Core 32KB L1 I VPU 32KB L1 D 512KB L2... 32KB L1 I VPU 32KB L1 D 512KB L2 GDDR MC GDDR MC GDDR MC GDDR MC TD TD TD 512KB L2 32KB L1 I 32KB L1 D VPU x86 Core x86 Core... 32KB L1 I VPU 32KB L1 D 512KB L2 TD x86 Core... 32KB L1 I VPU 32KB L1 D 512KB L2 TD x86 Core VPU 32KB L1 D 32KB L1 I 512KB L2 TD TD TD GDDR MC GDDR MC GDDR MC GDDR MC x86 Core x86 Core 32KB L1 I VPU 32KB L1 D 512KB L2... 32KB L1 I VPU 32KB L1 D 512KB L2 Σχ. 2.21: Block διάγραμμα του Xeon Phi Instruction Decode Scalar Unit Vector Unit Scalar Registers Vector Registers 32KB/32KB L1 Data/L1 Instr 512KB L2 Cache Ring Σχ. 2.22: Διάρθρωσ η ενός πυρήνα του Xeon Phi

58 Κεφάλαιο 2. Παράλληλος Προγραμματισ μός x86 Xeon Phi Core Κάθε επεξεργασ τικός πυρήνας x86 του Xeon Phi αποτελείται από 4 κύρια μέρη: Ενα in-order και dual-issue pipeline με υποσ τήριξη 4-way simultaneous multi-threading (SMT). Το γεγονός ότι είναι in-order (και όχι out-of-order) εξοικονομεί χώρο σ το υλικό καθώς και ενέργεια ώσ τε να είναι εφικτός ο σ υνδυασ μός μέχρι και 61 πυρήνων σ ε ένα chip. Μια SIMD μονάδα διανυσ ματικής επεξεργασ ίας (Vector Processing Unit, VPU) πλάτους 512 bit. Μπορεί να εκτελεί 16 πράξεις κινητής υποδιασ τολής απλής ακρίβειας, 8 πράξεις διπλής ακρίβειας ή 16 πράξεις ακεραίων 32 bit ανά κύκλο ρολογιού ενώ υποσ τηρίζει την πράξη Fused-Multiply Add (FMA). Περιέχει register file που αποτελείται από 32 καταχωρητές πλάτους επίσ ης 512 bit. Δεν υποσ τηρίζονται οι παλαιότερες SIMD εντολές της Intel (MMX, SSE, AVX) αλλά υποσ τηρίζεται ένα νέο πακέτο SIMD εντολών με ονομασ ία AVX-512, ειδικά σ χεδιασ μένων για το Xeon Phi. Τέλος, περιέχει ειδική μονάδα εκτέλεσ ης transcendental πράξεων (Extended Math Unit, EMU). Κρυφές μνήμες L1 data και L1 instruction μεγέθους 32 ΚΒ η κάθε μία. Κρυφή μνήμη L2 μεγέθους 512 KB, η οποία είναι πλήρως σ υνεπής (fully coherent) με τις υπόλοιπες L2 κρυφές μνήμες των άλλων πυρήνων. Η σ υνέπεια εξασ φαλίζεται με χρήσ η tag directories (TD). Κάθε tag directory αναλαμβάνει ένα σ υγκεκριμένο τμήμα της μνήμης ενώ όλα τα μηνύματα ανάμεσ α σ τις L2 cache ανταλλάσ σ ονται μέσ ω του διαύλου διασ ύνδεσ ης. Bi-directional ring Κάθε κατεύθυνσ η του διαύλου διασ ύνδεσ ης των πυρήνων αποτελείται από 3 διαφορετικά και ανεξάρτητα μεταξύ τους δαχτυλίδια (rings), όπως φαίνεται σ το Σχήμα 2.23. BL 64 Bytes Data Core Core Core Core L2 L2 L2 L2 AD Command and Address AK Coherence and Credits TD TD TD TD BL 64 Bytes Core Core L2 Core L2 Core TD L2 TD TD TD AD L2 AK Σχ. 2.23: Αναπαράσ τασ η του διαύλου διασ ύνδεσ ης διπλής κατεύθυνσ ης [22]

2.3. Προγραμματισ μός σ ε Intel Xeon Phi 59 Το πρώτο και μεγαλύτερο δαχτυλίδι (Data ring) είναι αυτό μέσ ω του οποίου μεταφέρονται τα δεδομένα. Λόγω του μεγάλου αριθμού των πυρήνων και της ανάγκης για υψηλό εύρος ζώνης, υποσ τηρίζει μεγάλο block μεταφοράς ίσ ο με 64 Bytes. Το δεύτερο δαχτυλίδι (Command and Address ring) είναι σ ημαντικά μικρότερο και χρησ ιμοποιείται για την αποσ τολή εντολών ανάγνωσ ης/εγγραφής και διευθύνσ εων μνήμης. Τέλος, το τρίτο και τελευταίο δαχτυλίδι (Coherence and Credits ή αλλιώς acknowledgement ring) είναι το μικρότερο από τα τρία και χρησ ιμοποιείται για την ανταλλαγή μηνυμάτων ελέγχου και του μηχανισ μού σ υνέπειας των κρυφών μνημών L2. 2.3.2. Μοντέλο εκτέλεσ ης Ο προγραμματισ μός του Xeon Phi γίνεται με τα ίδια προγραμματισ τικά μοντέλα τα οποία χρησ ιμοποιούνται και σ τους x86 επεξεργασ τές. Υποσ τηρίζει το δημοφιλές πρότυπο παράλληλου προγραμματισ μού OpenMP. Η Intel παρέχει κατάλληλους compilers, εργαλεία και οδηγούς για την ανάπτυξη εφαρμογών για τον Xeon Phi και την αλληλεπίδρασ η με τη σ υσ κευή. Υπάρχουν τρεις τρόποι να χρησ ιμοποιηθεί η σ υσ κευή από τον προγραμματισ τή. Αναλυτικότερα: Offload to Phi: Ο προγραμματισ τής αντιμετωπίζει τη σ υσ κευή με τον ίδιο τρόπο με τον οποίο αντιμετωπίζονται οι κάρτες γραφικών. Η εφαρμογή αρχικά ξεκινάει την εκτέλεσ η σ τον επεξεργασ τή. Η Intel παρέχει κατάλληλες οδηγίες (pragma directives) προς τον compiler για την αντιγραφή δεδομένων από και προς τη σ υσ κευή και την εκτέλεσ η σ υγκεκριμένων τμημάτων κώδικα σ το Xeon Phi (offload). Στη σ υνέχεια, όμοια με τις κάρτες γραφικών, το αποτέλεσ μα από την εκτέλεσ η σ τη σ υσ κευή επισ τρέφει σ την κύρια μνήμη του σ υσ τήματος και σ υνεχίζει η αρχική εκτέλεσ η, όπως φαίνεται σ την Εικόνα 2.24a. main main main main XEON CPU main main main main XEON CPU main main XEON CPU XEON CPU XEON CPU Intel Xeon PHI XEON CPU XEON CPU Intel Xeon Intel PHI Xeon PHI XEON CPU Intel Xeon PHI Intel Xeon PHI el Xeon PHI Intel Xeon PHI Intel Xeon PHI Results Results Results Results Results Results Results Results Results Results Symmetric Offload Offload Native Symmetric Symmetric Native N (a) (b) (c) Σχ. 2.24: Μοντέλα εκτέλεσ ης του Intel Xeon Phi

60 Κεφάλαιο 2. Παράλληλος Προγραμματισ μός Native Execution: Οπως αναφέρθηκε προηγουμένως, ο Xeon Phi ενσ ωματώνει δικό του λειτουργικό σ ύσ τημα βασ ισ μένο σ το Linux. Ο προγραμματισ τής μεταγλωττίζει την εφαρμογή του ώσ τε να μπορεί να εκτελεσ τεί εγγενώς (natively) σ τον Xeon Phi. Δηλαδή, μπορεί να αντιμετωπισ τεί ως ένας ξεχωρισ τός υπολογισ τής ακολουθώντας το μοντέλο μοιραζόμενης μνήμης. Η μνήμη του Xeon Phi χρησ ιμοποιείται ως κύρια μνήμη από την εφαρμογή. Αυτός ο τρόπος λειτουργίας χρησ ιμοποιείται από την παρούσ α διπλωματική εργασ ία. Symmetric MPI: Τέλος, ο επεξεργασ τής και ο Xeon Phi μπορούν να λειτουργήσ ουν σ υμμετρικά ως MPI targets. Απαιτούνται δύο ξεχωρισ τά εκτελέσ ιμα αρχεία, ένα μεταγλωττισ μένο για εκτέλεσ η σ τον επεξεργασ τή και το άλλο για εκτέλεσ η σ τη σ υσ κευή. Ο προγραμματισ τής οφείλει να προσ έξει το μοίρασ μα του επεξεργασ τικού φόρτου ανάμεσ α σ τους «μεγάλους» πυρήνες του επεξεργασ τή (ή των επεξεργασ τών) και τους «μικρούς» πυρήνες του Xeon Phi.

2.4. Πειραματικός Εξοπλισ μός - Πλατφόρμες Δοκιμών 61 2.4. Πειραματικός Εξοπλισμός - Πλατφόρμες Δοκιμών Στην παρούσ α διπλωματική εργασ ία αξιολογούνται τρεις διαφορετικές αρχιτεκτονικές παράλληλου προγραμματισ μού (CPU, GPU, Intel MIC - Xeon Phi), οι οποίες περιγράφηκαν προηγουμένως. Χρησ ιμοποιούνται «εκπρόσ ωποι» από κάθε αρχιτεκτονική. Στη σ υνέχεια, παρατίθεται χωρισ τά κατά αρχιτεκτονική όλος ο εξοπλισ μός ο οποίος θα χρησ ιμοποιηθεί. 2.4.1. Συσ τήματα πολλαπλών επεξεργασ τών Θα χρησ ιμοποιηθούν δύο διαφορετικά σ υσ τήματα πολλαπλών επεξεργασ τών, καθένα από τα οποία αποτελείται από 4 επεξεργασ τές. Το πρώτο και λιγότερο σ ύγχρονο βασ ίζεται σ την αρχιτεκτονική Dunnington της Intel, ενώ το δεύτερο και πιο σ ύγχρονο βασ ίζεται σ την αρχιτεκτονική Sandy Bridge - EP της ίδιας εταιρίας. Dunnington Η αρχιτεκτονική Dunnington της Intel ανήκει σ την κατηγορία των Uniform Memory Access (UMA) αρχιτεκτονικών και υποσ τηρίζει επεξεργασ τές μέχρι 6 πυρήνες ο καθένας, βασ ισ μένους σ την αρχιτεκτονική Penryn. Η σ ύνδεσ η των επεξεργασ τών με τον Memory Controller Hub (MCH) γίνεται μέσ ω διαύλου FSB (Front Side Bus), ο οποίος δεν ανήκει σ την κατηγορία διαύλων υψηλού εύρους ζώνης. Την εποχή όμως που παρουσ ιάσ τηκε η πλατφόρμα Dunnington (2008) δεν υπήρχαν πολλές εναλλακτικές. Στο Σχήμα 2.25 φαίνεται η δομή της αρχιτεκτονικής Dunnington. Σχ. 2.25: Αρχιτεκτονική Dunnington [24] Το σ ύσ τημα που θα χρησ ιμοποιηθεί αποτελείται από τέσ σ ερις εξαπύρηνους επεξεργασ τές Intel Xeon X7460 χρονισ μένους σ τα 2.66 GHz. Κάθε πυρήνας έχει προσ ωπικές κρυφές μνήμες L1 Data και L1 Instruction μεγέθους 32 KB έκασ τη. Ανά δύο πυρήνες μοιράζονται κρυφή μνήμη L2 μεγέθους 3 MB η κάθε μία. Επιπλέον, όλοι οι πυρήνες έχουν πρόσ βασ η σ ε κρυφή μνήμη L3 μεγέθους 16 MB. Τέλος, έχει μέγισ τη κατανάλωσ η ενέργειας ίσ η με 130 W. Στον Πίνακα 2.2 φαίνονται αναλυτικά τα χαρακτηρισ τικά των εν λόγω επεξεργασ τών.

QPI QPI 62 Κεφάλαιο 2. Παράλληλος Προγραμματισ μός Intel Xeon X7460 Number of cores 6 L1 Cache 6 32KB / 32KB Clock Speed 2.66 GHz L2 Cache 3 3 MB FSB Speed 1066 MHz L3 Cache 16 MB Lithografy 45 nm Latest SIMD Support SSE4.1 TDP 130 W Microarchitecture Penryn Πίν. 2.2: Χαρακτηρισ τικά του επεξεργασ τή Intel Xeon X7460 Sandy Bridge - EP Η αρχιτεκτονική Sandy Bridge - EP της Intel ανήκει σ την κατηγορία των Non-Uniform Memory Access (NUMA) αρχιτεκτονικών και υποσ τηρίζει επεξεργασ τές μέχρι 8 πυρήνες ο καθένας, βασ ισ μένους σ την ομώνυμη αρχιτεκτονική της εταιρίας. Κάθε επεξεργασ τής διαθέτει ενσ ωματωμένο ελεγκτή μνήμης (Intergrated Memory Controller, IMC). Η διασ ύνδεσ η των επεξεργασ τών μεταξύ τους γίνεται μέσ ω της δεύτερης γενιάς του διαύλου Intel QuickPath Interconnect 1.1 (QPI), ο οποίος, ανάλογα με τη σ υχνότητα λειτουργίας, προσ φέρει εύρος ζώνης μέχρι 16 GB/s ανά κατεύθυνσ η. Η διασ ύνδεσ η και η επικοινωνία των επεξεργασ τικών πυρήνων εντός του chip γίνεται με χρήσ η ενός διπλής κατεύθυνσ ης διαύλου τύπου δαχτυλιδιού (bi-directional ring). Στο Σχήμα 2.26 φαίνεται η δομή της αρχιτεκτονικής Sandy Bridge - EP και η εσ ωτερική διασ ύνδεσ η των πυρήνων των επεξεργασ τών. PCI-E PCI-E PCI-E PCI-E PCI-E PCI-E PCI-E PCI-E PCI-E PCI-E PCI-E PCI-E QPI C3 C2 C1 C0 MI LLC PCI-E C4 C5 C6 C7 MI QPI QPI C3 C2 C1 C0 MI LLC PCI-E C4 C5 C6 C7 MI QPI C3 C2 C1 C0 MI LLC PCI-E C4 C5 C6 C7 MI QPI QPI C3 C2 C1 C0 MI LLC PCI-E C4 C5 C6 C7 MI PCI-E PCI-E PCI-E PCI-E PCI-E PCI-E DMI 2 PCI-E PCI-E PCI-E PCI-E PCI-E Σχ. 2.26: Αρχιτεκτονική Sandy Bridge - EP [24]

2.4. Πειραματικός Εξοπλισ μός - Πλατφόρμες Δοκιμών 63 Το σ ύσ τημα που θα χρησ ιμοποιηθεί αποτελείται από τέσ σ ερις οκταπύρηνους επεξεργασ τές Intel Xeon Ε5-4620 χρονισ μένους σ τα 2.2 GHz, που υποσ τηρίζουν την τεχνολογία Intel Hyper- Treading. Κάθε πυρήνας έχει προσ ωπικές κρυφές μνήμες L1 Data και L1 Instruction μεγέθους 32 KB έκασ τη και L2 μεγέθους 256 KB. Επιπλέον, όλοι οι πυρήνες μοιράζονται κρυφή μνήμη L3 μεγέθους 16 MB. Επιπρόσ θετα, υποσ τηρίζει την τεχνολογία Intel Turbo Boost (με μέγισ τη σ υχνότητα 2.6 GHz). Τέλος, υποσ τηρίζει το x86 SIMD σ ετ εντολών AVX (πλάτους 256 bit) και έχει μέγισ τη κατανάλωσ η ενέργειας 95 W. Στον Πίνακα 2.3 φαίνονται αναλυτικά τα χαρακτηρισ τικά των εν λόγω επεξεργασ τών. Intel Xeon E5-4620 Number of cores 8 L1 Cache 8 32KB / 32KB Clock Speed 2.2 GHz (max 2.6) L2 Cache 8 256 KB QPI Speed 7.2 GT/s L3 Cache 16 MB Lithografy 32 nm Latest SIMD Support SSE4.2, AVX TDP 95 W Microarchitecture Sandy Bridge - E Πίν. 2.3: Χαρακτηρισ τικά του επεξεργασ τή Intel Xeon E5-4620 Μέγισ τες θεωρητικές επιδόσ εις (FLOP/s) Στον Πίνακα 2.4 φαίνονται οι μέγισ τες θεωρητικές επιδόσ εις πράξεων κινητής υποδιασ τολής απλής και διπλής ακρίβειας. Υπολογίζονται με βάσ η τους παρακάτω τύπους: Penryn (SSE): 4 Double Precision (DP) FLOPs/κύκλο ανά πυρήνα 8 Single Precision (SP) FLOPs/κύκλο ανά πυρήνα Sandy Bridge (AVX): 8 Double Precision (DP) FLOPs/κύκλο ανά πυρήνα 16 Single Precision (SP) FLOPs/κύκλο ανά πυρήνα

64 Κεφάλαιο 2. Παράλληλος Προγραμματισ μός (GFLOPS/s) Single Precision (32 bit) Double Precison (64 bit) Intel Xeon x7460 (6C) 127.68 63.84 Intel Xeon E5-4620 (8C) 281.6 140.8 4P Intel Xeon x7460 510.72 255.36 4P Intel Xeon E5-4620 1126.4 563.2 Πίν. 2.4: Μέγισ τες θεωρητικές επιδόσ εις (GFLOP/s) 2.4.2. Κάρτες Γραφικών Θα χρησ ιμοποιηθούν κάρτες γραφικών των δύο αρχιτεκτονικών Fermi και Kepler της εταιρίας Nvidia, που αναλύθηκαν σ την Ενότητα 2.2. Από την αρχιτεκτονική Fermi χρησ ιμοποιείται η κάρτα γραφικών Tesla M2050 με 3 GB μνήμη και από την αρχιτεκτονική Kepler η Tesla K40 με 12 GB μνήμη, η οποία είναι η γρηγορότερη και πιο σ ύγχρονη κάρτα της αρχιτεκτονικής Kepler. Στον Πίνακα 2.5 παρατίθενται αναλυτικά τα χαρακτηρισ τικά των προαναφερθέντων καρτών γραφικών. Nvidia Tesla M2050 Nvidia Tesla K40 Peak SP 1030 GFLOP/s 4290 GFLOP/s Peak DP 515 GFLOP/s 1430 GFLOP/s Memory Size 3 GB GDDR5 12 GB GDDR5 Memory Bandwidth 144 GB/s 288 GB/s # of CUDA Cores 448 2880 TDP 237 W 245 W PCIe Gen 2.0 3.0 Architecture Fermi (40 nm) Kepler (28 nm) Πίν. 2.5: Χαρακτηρισ τικά καρτών γραφικών Tesla M2050 και Tesla K40 2.4.3. Intel Xeon Phi Ως εκπρόσ ωπος της αρχιτεκτονικής Intel MIC χρησ ιμοποιείται το μοντέλο Intel Xeon Phi 5120D. Στον Πίνακα 2.6 παρατίθενται αναλυτικά τα χαρακτηρισ τικά του σ υγκεκριμένου μοντέλου.

2.4. Πειραματικός Εξοπλισ μός - Πλατφόρμες Δοκιμών 65 Intel Xeon Phi 5120D Peak SP Peak DP Memory Size Memory Bandwidth 2022 GFLOP/s 1011 GFLOP/s 8 GB 352 GB/s # of Cores 60 (max 240 threads) Clock Speed TDP 1.053 GHz 245 W PCIe Gen 2.0 Total Cache Turbo Enabled 30 MB No Πίν. 2.6: Χαρακτηρισ τικά Intel Xeon Phi 5120D

Κεφάλαιο 3 Αλγόριθμοι Στο κεφάλαιο αυτό θα παρατεθούν οι δύο αλγόριθμοι οι οποίοι χρησ ιμοποιούνται σ την παρούσ α διπλωματική εργασ ία και παραλληλοποιούνται σ τις αρχιτεκτονικές που αναφέρθηκαν σ το Κεφάλαιο 2. 3.1. Floyd - Warshall 3.1.1. Ορισ μοί Γράφος (ή γράφημα) είναι ένα διατεταγμένο ζεύγος G = (V, E) αποτελούμενο από το σ ύνολο V του οποίου τα σ τοιχεία ονομάζονται κόμβοι ή κορυφές και το σ ύνολο E του οποίου τα σ τοιχεία ονομάζονται ακμές και αποτελούν ζεύγη από κορυφές. Ενας γράφος είναι μη-κατευθυνόμενος όταν τα ζεύγη κορυφών του σ υνόλου E είναι μη διατεταγμένα, δηλαδή οι ακμές δεν έχουν προσ ανατολισ μό. Κατ αντισ τοιχία, ένας γράφος είναι κατευθυνόμενος όταν τα ζεύγη κορυφών είναι διατεταγμένα, δηλαδή οι ακμές είναι κατευθυνόμενες (έχουν προσ ανατολισ μό). Οταν κάθε ακμή αντισ τοιχεί με ένα πραγματικό αριθμό τότε πρόκειται για γράφο με βάρη και ο αριθμός αυτός ονομάζεται βάρος της ακμής. Ο αριθμός των ακμών ενός γράφου βρίσ κεται σ το διάσ τημα [0, V 2 ]. Οταν ο αριθμός αυτός βρίσ κεται πιο κοντά σ το 0, πρόκειται για αραιό γράφο. Αντίθετα, όταν βρίσ κεται πιο κοντά σ το V 2, πρόκειται για πυκνό γράφο. Η χρησ ιμότητα των γράφων σ την πληροφορική είναι μεγάλη καθώς πολλά διαφορετικά προβλήματα μπορούν να μοντελοποιηθούν με τη βοήθεια των γράφων και της θεωρίας γραφημάτων εν γένει. 3.1.2. Τρόποι αναπαράσ τασ ης γράφων Υπάρχουν διάφοροι τρόποι με τους οποίους μπορεί να αναπαρασ ταθεί και να αποθηκευτεί ένας γράφος. Οι δύο πιο σ υνηθισ μένοι είναι οι εξής: Πίνακας γειτνίασ ης: Ο γράφος αποθηκεύεται με τη μορφή ενός τετραγωνικού πίνακα μεγέθους V V όπου σ ε κάθε κορυφή αντισ τοιχείται ένας αριθμός (από το 1 μέχρι V ) και κάθε γραμμή και σ τήλη του πίνακα αντιπροσ ωπεύει την αντίσ τοιχη κορυφή, όπως φαίνεται σ το Σχήμα 3.1b. Σε κάθε θέσ η (i, j) του πίνακα αποθηκεύεται: - 0, εάν δεν υπάρχει ακμή από την κορυφή i προς την κορυφή j

68 Κεφάλαιο 3. Αλγόριθμοι - 1 ή η τιμή του βάρους, εάν υπάρχει ακμή από την κορυφή i προς την κορυφή j Ο αριθμός των θέσ εων μνήμης που απαιτείται είναι V 2 ανεξαρτήτως από τον αριθμό των ακμών. Πλεονέκτημα αυτού του τρόπου αναπαράσ τασ ης είναι ότι υπάρχει άμεσ ος έλεγχος για την ύπαρξη ακμής. Επίσ ης, γίνεται προφανές ότι ο τρόπος αυτός από άποψη χώρου σ τη μνήμη σ υνίσ ταται για πυκνούς γράφους. Λίσ τα γειτνίασ ης: Σε κάθε κορυφή του γράφου αντισ τοιχείται μία σ υνδεδεμένη λίσ τα με όλες τις κορυφές με τις οποίες σ υνδέεται, όπως φαίνεται σ το Σχήμα 3.1c. Σε περίπτωσ η γράφου με βάρη, σ ε κάθε σ τοιχείο της λίσ τας αποθηκεύεται και η τιμή του βάρους. Ο αριθμός των θέσ εων μνήμης που απαιτείται είναι E. Ο τρόπος αυτός προτιμάται σ ε περιπτώσ εις αραιών γράφων. 1 1 1 2 2 2 3 3 3 4 4 45 5 65 6 6 1 2 3 4 5 6 1 2 13 24 35 46 5 6 1 1 0 1 0 0 0 0 1 0 1 0 10 0 0 0 0 2 2 0 0 0 1 0 2 0 20 0 0 01 0 1 0 3 3 1 1 0 0 0 3 0 31 01 10 10 0 0 0 4 4 1 41 10 4 10 1 01 00 0 0 0 0 0 5 0 50 05 0 0 01 0 0 0 1 0 5 1 6 6 0 60 01 6 0 10 01 0 0 0 0 0 1 2 3 4 5 6 2 5 2 1 6 3 1 2 3 4 5 6 2 5 2 1 6 3 3 2 2 5 2 1 6 3 3 2 3 2 (a) (b) (c) Σχ. 3.1: Τρόποι αναπαράσ τασ ης γράφων Γενικά, η επιλογή του τρόπου αναπαράσ τασ ης εξαρτάται από τις ιδιαιτερότητες κάθε αλγορίθμου, την πυκνότητα του γράφου και φυσ ικά το διαθέσ ιμο χώρο σ τη μνήμη. 3.1.3. Το πρόβλημα Δίνεται ένα εμβαρές κατευθυνόμενο γράφημα G(V, E), σ το οποίο το βάρος κάθε ακμής αναπαρισ τά το κόσ τος μετάβασ ης από την κορυφή αφετηρίας σ την κορυφή προορισ μού. Ζητούμενο του προβλήματος είναι να βρεθεί το ελάχισ το κόσ τος μετάβασ ης από κάθε κορυφή σ ε κάθε άλλη κορυφή του γραφήματος. Στη διεθνή βιβλιογραφία σ υναντάται ως All Pairs Shortest Path (APSP). Ο γνωσ τότερος αλγόριθμος που επιλύει το πρόβλημα αυτό είναι ο αλγόριθμος Floyd-Warshall. Υπολογίζει και σ υγκρίνει όλα τα πιθανά μονοπάτια ανάμεσ α σ ε κάθε ζευγάρι κορυφών. Το επιτυγχάνει βελτιώνοντας σ ταδιακά την εκτίμησ η του σ υντομότερου μονοπατιού ανάμεσ α σ ε δύο κόμβους, μέχρι η εκτίμησ η να γίνει βέλτισ τη. Τελικά, ελέγχεται κάθε σ υνδυασ μός ακμών. Διατυπώθηκε σ τη σ ημερινή του μορφή από τον Robert Floyd το 1962. Ομως, είναι πρακτικά ο ίδιος αλγόριθμος με εκείνους που δημοσ ίευσ αν οι Bernard Roy το 1959 και Stephen Warshall το 1962 για την επίλυσ η του προβλήματος του μεταβατικού κλεισ ίματος μίας σ χέσ ης (transitive closure). Το σ υγκεκριμένο πρόβλημα είναι ισ οδύναμο με το πρόβλημα APSP. Κατά τη δημοσ ίευσ η των αλγορίθμων τους, τόσ ο ο Floyd όσ ο και ο Warshall δεν έκαναν καμία αναφορά

3.1. Floyd - Warshall 69 περί δυναμικού προγραμματισ μού. Παρά ταύτα, και οι δύο αλγόριθμοι είχαν «γεύσ η» δυναμικού προγραμματισ μού και πρέπει να θεωρούνται εφαρμογή της τεχνικής αυτής [1]. 3.1.4. Ο αλγόριθμος Εσ τω γράφος G με V κόμβους αριθμημένους από 1 έως n. Επίσ ης, έσ τω ένα υποσ ύνολο κόμβων {1, 2,..., k} για κάποιο k. Για κάθε ζευγάρι κόμβων i, j ɛ V, ελέγχεται το κόσ τος όλων των πιθανών μονοπατιών από τον i προς τον j με ενδιάμεσ ους κόμβους σ το υποσ ύνολο {1, 2,..., k} και έσ τω p το μονοπάτι με το ελάχισ το κόσ τος. Ο αλγόριθμος Floyd-Warshall εκμεταλλεύεται τη σ χέσ η ανάμεσ α σ το μονοπάτι p και το ελάχισ το μονοπάτι από τον i προς τον j με ενδιάμεσ ους κόμβους σ το υποσ ύνολο {1, 2,..., k 1}: Αν ο κόμβος k δεν ανήκει σ το μονοπάτι p, τότε όλοι οι ενδιάμεσ οι κόμβοι του μονοπατιού p ανήκουν σ το υποσ ύνολο {1, 2,..., k 1}. Συνεπώς, ένα ελάχισ το μονοπάτι από τον i προς τον j με ενδιάμεσ ους κόμβους σ το υποσ ύνολο {1, 2,..., k 1} είναι ταυτόχρονα και ελάχισ το μονοπάτι από τον i προς τον j με ενδιάμεσ ους κόμβους σ το υποσ ύνολο {1, 2,..., k}. Αν ο κόμβος k ανήκει σ το μονοπάτι p, τότε έσ τω p 1 το μονοπάτι από τον i προς τον k και p 2 το μονοπάτι από τον k προς τον j. Άρα, το μονοπάτι i p j αναλύεται σ ε i p 1 k p 2 j. Επειδή ο κόμβος k δεν είναι ενδιάμεσ ος κόμβος του μονοπατιού p 1, όλοι οι ενδιάμεσ οι κόμβοι του p 1 ανήκουν σ το υποσ ύνολο {1, 2,..., k 1}. Συνεπώς, το p 1 είναι ένα ελάχισ το μονοπάτι από τον i προς τον k με όλους τους ενδιάμεσ ους κόμβους να ανήκουν σ το υποσ ύνολο {1, 2,..., k 1}. Αντίσ τοιχα, το p 2 είναι ένα ελάχισ το μονοπάτι από τον k προς τον j με όλους τους ενδιάμεσ ους κόμβους να ανήκουν σ το υποσ ύνολο {1, 2,..., k 1}. Με βάσ η τις παραπάνω παρατηρήσ εις, ορίζεται μια αναδρομική σ χέσ η για τον υπολογισ μό των ελάχισ τον μονοπατιών. Εσ τω d (k) ij το κόσ τος ενός ελάχισ του μονοπατιού από τον κόμβο i προς τον κόμβο j με ενδιάμεσ ους κόμβους σ το υποσ ύνολο {1, 2,..., k}. Αν k = 0, τότε πρόκειται για ένα μονοπάτι από τον i προς τον j με κανέναν ενδιάμεσ ο κόμβο. Δηλαδή, μονοπάτι με ακριβώς μια ακμή, η οποία προφανώς είναι η (i, j). Άρα, d (0) ij = w ij (όπου w ij το βάρος της ακμής (i, j)). To d (k) ij ορίζεται αναδρομικά από την εξής σ χέσ η: d (k) ij = w ij εάν k = 0 ( min d (k 1) ij, d (k 1) ik + d (k 1) ) kj εάν k 1 Τελικά, το κόσ τος του ελάχισ του μονοπατιού από τον κόμβο i προς τον κόμβο j (για κάθε i, j) είναι ίσ ο με d (n) ij. Στον Κώδικα 3.1 φαίνεται ο αλγόριθμος Floyd-Warshall.

70 Κεφάλαιο 3. Αλγόριθμοι Κώδικας 3.1 Αλγόριθμος Floyd-Warshall for k from 1 to V for i from 1 to V for j from 1 to V if ( dist [i][k] + dist [k][j] < dist [i][j]) then dist [i][j] = dist [i][k] + dist [k][j] i dist[i][k] k dist[i][j] iteration k dist[k][j] j 3.2. LU decomposition (Παραγοντοποίηση LU) Ο δεύτερος αλγόριθμος με τον οποίο ασ χολείται η παρούσ α διπλωματική εργασ ία είναι ο αλγόριθμος της παραγοντοποίησ ης LU (LU decomposition ή LU factorization). Πρόκεται για τη διάσ πασ η ενός πίνακα σ ε έναν άνω τριγωνικό (upper) και έναν κάτω τριγωνικό (lower), το γινόμενο των οποίων ισ ούται με τον αρχικό πίνακα: α 11 α 12... α 1n 1 0... 0 u 11 u 12... u 1n α 21 α 22 α 2n l 21 1 0 0 u 22 u 2n. =................. α n1 α n2 α nn l n1 l n2 1 0 0 u nn }{{}}{{}}{{} A L U Η παραγοντοποίησ η LU είναι χρήσ ιμη για την επίλυσ η γραμμικών σ υσ τημάτων της μορφής Ax = b: Ly = b Ax = b L(Ux) = b Ux = y 3.2.1. Ο αλγόριθμος Ο αλγόριθμος για την παραγοντοποίησ η LU ενός τετραγωνικού πίνακα προκύπτει από τις μαθηματικές σ χέσ εις που ακολουθούν. Αρχικά, ισ χύει ότι: A = LU a ij = n 1 l ir u rj ( i, j) r=0

3.2. LU decomposition (Παραγοντοποίησ η LU) 71 Στη σ υνέχεια, θεωρώντας ότι i j, προκύπτει: Ομοίως: a ij = n 1 r=0 a ij = i 1 l ir u rj = r=0 i r=0 l ir u rj (l ir = 0 για r > i) l ir u rj + l ii u ij = i 1 u ij = a ij i 1 r=0 l ir u rj r=0 l ij = 1 ( ) a ij j 1 l ir u rj u jj r=0 l ir u rj + u ij για i j για i > j Ορίζεται ο ενδιάμεσ ος πίνακας A (k) του σ ταδίου k (0 k n) ως εξής: a (k) ij = a ij k 1 r=0 l ir u rj Χρησ ιμοποιώντας την παραπάνω σ ημειογραφία είναι προφανές ότι A (0) = A και A (n) = 0. Επιπλέον: u ij = a ij i 1 r=0 l ij = 1 ( ) a ij j 1 l ir u rj u jj r=0 l ir u rj u ij = a (i) ij, (i j) l ij = a(j) ij, (i > j) u jj Από τις παραπάνω σ χέσ εις προκύπτει ο αλγόριθμος του Κώδικα 3.2, σ τον οποίο η αποθήκευσ η των πινάκων L και U γίνεται in place σ τον πίνακα A. Η πολυπλοκότητα του αλγορίθμου είναι τάξης O(n 3 ). Κώδικας 3.2 Αλγόριθμος LU decomposition for k from 0 to N -1 for i from k +1 to N -1 A[i][k] = A[i][k] / A[k][k] for i from k +1 to N -1 for j from k +1 to N -1 A[i][j] = A[i][j] - A[i][k] * A[k][j] α 11 α 12... α 1n α 21 α 22 α 2n...... u 11 u 12... u 1n l 21 u 22 u 2n...... } α n1 α n2 {{ α nn } A l n1 l n2 u nn

72 Κεφάλαιο 3. Αλγόριθμοι Στο Σχήμα 3.2 φαίνεται η κατάσ τασ η του πίνακα A κατά την έναρξη του ενδιάμεσ ου σ ταδίου k = 3. Οι γραμμές 0, 1 και 2 του πίνακα U έχουν ήδη υπολογισ τεί, όπως επίσ ης και οι γραμμές 0, 1 και 2 του πίνακα Storing L. L, U, A (k) in the space of A 0 1 2 3 4 5 6 0 1 2 3 4 5 L U (k) A 6 At the start of stage k = 3: rows 0, 1, 2 of U and columns 0, 1, 2 Σχ. of 3.2: L below Ενδιάμεσ ο the diagonal σ τάδιοhave εκτέλεσ ης already been αλγορίθμου computed. LU Decomposition Lecture 2.1 2.2 Sequential LU 10 / 23

Κεφάλαιο 4 Υλοποίησ η αλγορίθμου Floyd-Warshall 4.1. Yλοποίηση σε συστήματα πολλαπλών επεξεργαστών Ακολουθούν τρεις διαφορετικές υλοποιήσ εις για σ υσ τήματα πολλαπλών επεξεργασ τών που έχουν παραλληλοποιηθεί με χρήσ η του OpenMP. Μεταγλωττίζονται με χρήσ η του Intel C Compiler 14.0 ο οποίος ενσ ωματώνει την έκδοσ η 4.0 του OpenMP και με επίπεδο βελτισ τοποιήσ εων -Ο3. Χρησ ιμοποιούνται ειδικές εντολές οδηγιών προς τον μεταγλωττισ τή της Intel για διανυσ ματοποίησ η (vectorization) όπου είναι εφικτό. Διεξάγονται μετρήσ εις σ τα δύο σ υσ τήματα που αναφέρθηκαν σ την Υποενότητα 2.4.1 και χρησ ιμοποιούνται γράφοι μικρού και μεγάλου μεγέθους με αριθμό κόμβων 2048 2048 και 4096 4096 αντίσ τοιχα, όπως φαίνεται σ το Σχήμα 4.1. Οι γράφοι αποθηκεύονται σ τη μνήμη με τη μορφή πίνακα γειτνίασ ης και αναπαρίσ τανται με τύπο float, δηλαδή με αριθμούς κινητής υποδιασ τολής απλής ακρίβειας (32 bit). Τα εκτελέσ ιμα που προορίζονται για το σ ύσ τημα με επεξεργασ τές Dunnington μεταγλωττίζονται με υποσ τήριξη των SIMD εντολών SSE 4.1 ενώ εκείνα που προορίζονται για το σ ύσ τημα με επεξεργασ τές Sandy Bridge με υποσ τήριξη των SIMD εντολών AVX. CPU Implementations CPU Systems Test cases Serial 3 loops with OpenMP parallel for Recursive with OpenMP Tasks Dunnington 24 cores 2048 x 2048 nodes 4096 x 4096 nodes Tiled with OpenMP Tasks Tiled with OpenMP parallel for Sandy Bridge 32 cores 2048 x 2048 nodes 4096 x 4096 nodes Σχ. 4.1: Παράλληλες υλοποιήσ εις αλγορίθμου Floyd-Warshall για σ υσ τήματα επεξεργασ τών Μετρήσ εις Dunnington: Αρχικά, διεξάγονται μετρήσ εις σ το σ ύσ τημα Dunnington για αυξανόμενο αριθμό OpenMP threads ώσ τε να υπολογισ τούν οι επιδόσ εις και η κλιμάκωσ η κάθε υλοποίησ ης. Κάθε thread αντισ τοιχεί σ ε έναν επεξεργασ τικό πυρήνα. Επίσ ης, για δεδομένο αριθμό threads, λαμβάνονται διαφορετικές κατανομές των threads σ τους επεξεργασ τικούς πυρήνες των τεσ σ άρων επεξεργασ τών (packages) του σ υσ τήματος, χρησ ιμοποιώντας τη δυνατότητα του OpenMP για ρητό καθορισ μό του CPU Affinity. Αναλυτικότερα:

74 Κεφάλαιο 4. Υλοποίησ η αλγορίθμου Floyd-Warshall Packed: Οι ενεργοί πυρήνες κατανέμονται σ ε όσ ο λιγότερους επεξεργασ τές γίνεται. Για παράδειγμα, αν υπάρχουν 4 threads τότε σ υγκεντρώνονται όλα σ ε έναν επεξεργασ τή. Spread: Οι ενεργοί πυρήνες κατανέμονται σ ε όσ ο περισ σ ότερους επεξεργασ τές γίνεται. Ετσ ι, σ το παράδειγμα των 4 threads, ανατίθεται ένα thread ανά επεξεργασ τή (package). Επίσ ης, όπως έχει ήδη αναφερθεί, οι επεξεργασ τικοί πυρήνες των επεξεργασ τών αρχιτεκτονικής Dunnington μοιράζονται ανά δύο την ίδια κρυφή μνήμη L2. Συνεπώς, ορίζονται επιπλέον κατανομές «same_l2» και «different_l2» ανάλογα με το αν οι ενεργοί πυρήνες επιλέγονται έτσ ι ώσ τε να μοιράζονται τις κρυφές μνήμες L2 ή όχι. Στο Σχήμα 4.2 φαίνεται το affinity κάθε πυρήνα όλων των επεξεργασ τών του σ υσ τήματος και σ τον Πίνακα 4.1 όλες οι διαφορετικές κατανομές που λαμβάνονται υπ όψιν κατά τις μετρήσ εις. Σχ. 4.2: Κατανομή των affinities όλων των πυρήνων του σ υσ τήματος Dunnington Selected CPUs 2 S 2 thr, spread 0, 3 2 P s_l2 2 thr, packed, same_l2 0, 12 2 P d_l2 2 thr, packed, different_l2 0, 1 4 S 4 thr, spread 0, 3, 6, 9 4 P 4 thr, packed 0, 12, 1, 13 8 S s_l2 8 thr, spread, same_l2 0, 12, 3, 15, 6, 18, 9, 21 8 S d_l2 8 thr, spread, different_l2 0, 1, 3, 4, 6, 7, 9, 10 8 P s_l2 8 thr, packed, same_l2 0, 12, 1, 13, 2, 14, 3, 15 8 P d_l2 8 thr, packed, different_l2 0, 12, 1, 13, 2, 14, 3, 4 12 S s_l2 12 thr, spread, same_l2 0, 12, 3, 15, 6, 18, 9, 21, 1, 4, 7, 10 12 S d_l2 12 thr, spread, different_l2 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11 12 P 12 thr, packed 0, 1, 2, 12, 13, 14, 3, 4, 5, 15, 16, 17 16 S 16 thr, spread 0, 1, 12, 13, 3, 4, 15, 16, 6, 7, 18, 19, 9, 10, 21, 22 16 P 16 thr, packed 0, 1, 2, 12, 13, 14, 3, 4, 5, 15, 16, 17, 6, 7, 18, 19 24 24 thr 0-23 Πίν. 4.1: Κατανομές νημάτων σ ε επεξεργασ τικούς πυρήνες του σ υσ τήματος Dunnington

4.1. Yλοποίησ η σ ε σ υσ τήματα πολλαπλών επεξεργασ τών 75 Sandy Bridge: Στο σ ύσ τημα με επεξεργασ τές αρχιτεκτονικής Sandy Bridge λαμβάνονται κατανομές spread και packed όμοια με προηγουμένως. Ομως, δεν εξετάζονται κατανομές σ ε σ χέσ η με την κρυφή μνήμη L2 αφού κάθε πυρήνας έχει προσ ωπική και δεν είναι μοιραζόμενη. Στο Σχήμα 4.3 φαίνεται το affinity κάθε πυρήνα όλων των επεξεργασ τών του σ υσ τήματος. Υπενθυμίζεται ότι, λόγω της υποσ τήριξης της τεχνολογίας Hyper-Threading, κάθε φυσ ικός πυρήνας αναγνωρίζεται από το λειτουργικό σ ύσ τημα ως δύο λογικοί. Στον Πίνακα 4.2 φαίνονται όλες οι διαφορετικές κατανομές που εξετάζονται κατά τις μετρήσ εις. Σχ. 4.3: Κατανομή των affinities όλων των πυρήνων του σ υσ τήματος Sandy Bridge

76 Κεφάλαιο 4. Υλοποίησ η αλγορίθμου Floyd-Warshall Selected CPUs 2 S 2 thr, spread 0, 8 2 P 2 thr, packed 0, 1 4 S 4 thr, spread 0, 8, 16, 24 4 P 4 thr, packed 0, 1, 2, 3 8 S 8 thr, spread 0, 1, 8, 9, 16, 17, 24, 25 8 P 8 thr, packed 0, 1, 2, 3, 4, 5, 6, 7 12 S 12 thr, spread 0, 1, 2, 8, 9, 10, 16, 17, 18, 24, 25, 26 12 P 12 thr, packed 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11 16 S 16 thr, spread 0, 1, 2, 3, 8, 9, 10, 11, 16, 17, 18, 19, 24, 25, 26, 27 16 P 16 thr, packed 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15 32 32 thr 0-31 64 64 thr 0-63 Πίν. 4.2: Κατανομές νημάτων σ ε επεξεργασ τικούς πυρήνες του σ υσ τήματος Sandy Bridge Memory Bandwidth Για τη μέτρησ η του διαθέσ ιμου memory bandwidth κάθε σ υσ τήματος χρησ ιμοποιείται το γνωσ τό μετροπρόγραμμα Stream [25]. Στο Σχήμα 4.4 φαίνονται τα αποτελέσ ματα για κάθε υπολογισ τικό σ ύσ τημα και για όλες τις κατανομές spread και packed που περιγράφηκαν προηγουμένως. 60.00 STREAM MEMORY BENCHMARK AVERAGE MEMORY BANDWIDTH MB/S 50.00 40.00 30.00 20.00 10.00 1 2 S 2 P 4 S 4 P 8 S 8 P 12 S 12 P 16 S 16 P 24/32 Dunnington Sandy Bridge Σχ. 4.4: Χωρισ μός πίνακα σ ε υποπίνακες και διαδοχικές αναδρομικές κλήσ ης σ ε κάθε επίπεδο της αναδρομής Γίνεται αμέσ ως αντιληπτή η μεγάλη διαφορά ανάμεσ α σ τα δύο σ υσ τήματα όσ ον αφορά το μέγισ το εύρος ζώνης προς την κύρια μνήμη. Αιτία για αυτό αποτελεί η UMA αρχιτεκτονική του σ υσ τήματος Dunnington και η χρήσ η του πιο αργού διαύλου FSB για την επικοινωνία των επεξεργασ τών με τον Memory Controller Hub, όπως φαίνεται σ το Σχήμα 2.25 του Κεφαλαίου 2.

4.1. Yλοποίησ η σ ε σ υσ τήματα πολλαπλών επεξεργασ τών 77 Επίσ ης, παρατηρείται το μεγάλο προβάδισ μα των spread κατανομών σ ε σ χέσ η με τις packed (ειδικά για το σ ύσ τημα Sandy Bridge), κάτι το οποίο είναι αναμενόμενο λόγω των περισ σ ότερων επεξεργασ τών (packages) που χρησ ιμοποιούν οι spread κατανομές. 4.1.1. Σειριακή υλοποίησ η Αρχικά, παραλληλοποιείται η απλή σ ειριακή υλοποίησ η του αλγορίθμου, όπως φαίνεται σ τον Κώδικα 4.1. Με κατάλληλη οδηγία προς τον μεταγλωττισ τή γίνεται vectorization του εσ ωτερικού loop (j-loop) του κώδικα. Κώδικας 4.1 Σειριακή υλοποίησ η αλγορίθμου Floyd-Warshall # pragma omp parallel firstprivate ( k) for (k = 0; k < N; k ++) # pragma omp for private ( j) for (i = 0; i < N; i ++) for (j = 0; j < N; j ++) A[i][j] = min (A[i][j], A[i][k] + A[k][j]); Αποτελέσ ματα Dunnington Στο Σχήμα 4.5 φαίνονται τα διαγράμματα χρόνου και speedup των μετρήσ εων σ το σ ύσ τημα Dunnington για γράφους διασ τάσ εων 2048 2048 και 4096 4096 κόμβων. Ο μικρός γράφος καταλαμβάνει χώρο σ τη μνήμη ίσ ο με 2048 2048 4B = 16 MB ενώ αντίθετα ο μεγάλος γράφος καταλαμβάνει 4096 4096 4B = 64 MB.

78 Κεφάλαιο 4. Υλοποίησ η αλγορίθμου Floyd-Warshall l 2048x2048 Time 16,0 Serial 2048x2048 Time 5 Serial 2048x2048 Speedup 5 Serial 2048x2048 Speedu 14,0 45,0 45,0 12,0 4 35,0 4 35,0 1 3 3 TIME SEC 8,0 6,0 SPEEDUP 25,0 2 SPEEDUP 25,0 2 4,0 15,0 1 15,0 1 2,0 5,0 5,0 (a) (b) l 4096x4096 Time 16 Serial 4096x4096 Time 1 Serial 4096x4096 Speedup 1 Serial 4096x4096 Speedu 14 9,0 9,0 12 8,0 7,0 8,0 7,0 10 6,0 6,0 TIME SEC 8 6 SPEEDUP 5,0 4,0 SPEEDUP 5,0 4,0 4 3,0 2,0 3,0 2,0 2 1,0 1,0 (c) (d) Σχ. 4.5: Αποτελέσ ματα μετρήσ εων σ ειριακής υλοποίησ ης σ το σ ύσ τημα Dunnington Για το μικρό γράφο παρατηρείται speedup μεγαλύτερο από τον αριθμό των επεξεργασ τών, δηλαδή υπεργραμμικό (superlinear). Αυτό οφείλεται σ το λεγόμενο cache effect. Oι κρυφές μνήμες των επεξεργασ τών Dunnington είναι πολύ μεγάλες σ ε μέγεθος και κάθε επεξεργασ τής φέρει σ υνολικά L2 : 3 3MB + L3 : 16MB = 25 MB κρυφής μνήμης επιπέδων L2 και L3. Συνεπώς, χωράει με ευκολία όλος ο γράφος σ τις κρυφές μνήμες κάθε επεξεργασ τή και οι χρόνοι προσ πέλασ ης των δεδομένων μειώνονται δρασ τικά. Ετσ ι, προκύπτει ένα επιπρόσ θετο σ ημαντικό speedup λόγω του φαινομένου αυτού επιπλέον από αυτό που προκύπτει με την αύξησ η των επεξεργασ τικών πυρήνων. Το παραπάνω γίνεται ακόμα πιο εμφανές σ τις packed κατανομές όπου οι επιδόσ εις είναι σ ημαντικά χειρότερες από τις αντίσ τοιχες spread επειδή η σ υνολικά διαθέσ ιμη κρυφή μνήμη είναι αρκετά μικρότερη. Επίσ ης, σ τις κατανομές different_l2 οι επιδόσ εις είναι καλύτερες από τις αντίσ τοιχες same_l2 λόγω του ίδιου φαινομένου. Τέλος, μια ακόμα αιτία για το προβάδισ μα των spread κατανομών είναι το υψηλότερο εύρος ζώνης προς την κύρια μνήμη.

4.1. Yλοποίησ η σ ε σ υσ τήματα πολλαπλών επεξεργασ τών 79 Για να προκύψουν σ ωσ τά σ υμπεράσ ματα για την κλιμάκωσ η του αλγορίθμου, εξετάζονται τα αποτελέσ ματα του μεγάλου γράφου. Πλέον, το speedup είναι σ ημαντικά μειωμένο και απέχει πολύ από το ιδανικό. Βασ ικότερη αιτία είναι η φύσ η του αλγορίθμου που κάνει χωρίς χωρική τοπικότητα προσ βάσ εις σ τη μνήμη. Επίσ ης, όμοια με προηγουμένως, παρατηρούνται πολύ καλύτερες επιδόσ εις σ τις spread και same_l2 κατανομές. Αποτελέσ ματα Sandy Bridge Serial 2048x2048 Time 1 Serial 2048x2048 Time 14,0 Serial 2048x2048 Speedup 14,0 Serial 2048x2048 Speedup 9,0 12,0 12,0 8,0 7,0 1 1 TIME SEC 6,0 5,0 4,0 SPEEDUP 8,0 6,0 SPEEDUP 8,0 6,0 3,0 4,0 4,0 2,0 1,0 2,0 2,0 (a) (b) Serial 4096x4096 Time 12 Serial 4096x4096 Time 2,5 Serial 4096x4096 Speedup 2,5 Serial 4096x4096 Speedup 10 2,0 2,0 8 1,5 1,5 TIME SEC 6 SPEEDUP 1,0 SPEEDUP 1,0 4 2 0,5 0,5 (c) (d) Σχ. 4.6: Αποτελέσ ματα μετρήσ εων σ ειριακής υλοποίησ ης σ το σ ύσ τημα Sandy Bridge Εδώ πρέπει να σ ημειωθεί ότι το σ ύσ τημα με αρχιτεκτονική Sandy Bridge ακολουθεί αρχιτεκτονική NUMA και σ υνεπώς η πρόσ βασ η σ τη μνήμη δεν απαιτεί τον ίδιο χρόνο για όλους τους επεξεργασ τές. Κατά την υλοποίησ η του αλγορίθμου, εξετάζεται μόνο η γενική περίπτωσ η και δεν λαμβάνεται υπ όψιν η NUMA φιλοσ οφία του σ υσ τήματος κατά το allocation του πίνακα γειτνίασ ης σ τη μνήμη, σ υνεπώς αποθηκεύεται εξ ολοκλήρου σ την κύρια μνήμη ενός επεξεργασ τή. Για το λόγο αυτό, το speedup που παρατηρείται είναι εξαιρετικά κακό για τον μεγάλο

80 Κεφάλαιο 4. Υλοποίησ η αλγορίθμου Floyd-Warshall γράφο και κάπως βελτιωμένο για τον μικρό γράφο, απόρροια του cache effect. Για του ίδιους λόγους που αναλύθηκαν προηγουμένως, προκύπτει προβάδισ μα των spread έναντι των packed κατανομών. 4.1.2. Αναδρομική υλοποίησ η Η παραλληλοποίησ η της απλής υλοποίησ ης του αλγορίθμου με τα 3 loops δεν προσ φέρει σ ημαντικό speedup. Αυτό οφείλεται σ τη memory bounded φύσ η του αλγορίθμου, αφού σ ε κάθε επανάληψη πρέπει να μεταφέρεται από την κύρια μνήμη ολόκληρος ο πίνακας ενώ οι πράξεις που γίνονται είναι απλές από άποψη επεξεργασ τικού φορτίου (μία σ ύγκρισ η και μία πρόσ θεσ η). Για τον λόγο αυτό, έχουν προταθεί δύο εναλλακτικές μέθοδοι υλοποίησ ης για καλύτερη εκμετάλλευσ η της κρυφής μνήμης. Η πρώτη είναι η αναδρομική (recursive) υλοποίησ η η οποία εφαρμόζει αναδρομικά αυτόματο blocking σ ε κάθε επίπεδο, με βάσ η μία δεδομένη τιμή του μεγέθους του block. Ο αλγόριθμος φαίνεται σ τον Κώδικα 4.2 ενώ σ το Σχήμα 4.7 φαίνεται ο τρόπος που χωρίζεται ο πίνακας σ ε κάθε επίπεδο της αναδρομής. Επιπλέον, φαίνονται οι εξαρτήσ εις που υπάρχουν ανάμεσ α σ τη σ ειρά με την οποία γίνονται οι αναδρομικές κλήσ εις για την επεξεργασ ία κάθε υποπίνακα. A11 A12 A21 A22 Σχ. 4.7: Χωρισ μός πίνακα σ ε υποπίνακες και διαδοχικές αναδρομικές κλήσ ης σ ε κάθε επίπεδο της αναδρομής Η αρχική αναδρομική κλήσ η γίνεται ως FWR(A, A, A) ενώ σ ε κάθε επίπεδο της αναδρομής τα ορίσ ματα Α, Β, C δείχνουν σ ε ίδιους ή διαφορετικούς υποπίνακες του αρχικού πίνακα γειτνίασ ης. Επιλέγοντας κατάλληλο μέγεθος block, ώσ τε να χωράει σ την κρυφή μνήμη του επεξεργασ τή, επιτυγχάνονται οι μέγισ τες επιδόσ εις. Η παραλληλοποίησ η του αλγορίθμου γίνεται με τη χρήσ η OpenMP tasks, όπως φαίνεται σ τον Κώδικα 4.2. Σύμφωνα με τις εξαρτήσ εις δεδομένων, η επεξεργασ ία των υποπινάκων A 12 και A 21 μπορεί να γίνει παράλληλα. Αυτό το γεγονός εκμεταλλευόμασ τε κατά την παραλληλοποίησ η και η χρήσ η των tasks αποδεικνύεται χρήσ ιμη. Επίσ ης, με κατάλληλη οδηγία προς τον μεταγλωττισ τή γίνεται vectorization του εσ ωτερικού loop (j-loop) του κώδικα της σ υνάρτησ η FWI.

4.1. Yλοποίησ η σ ε σ υσ τήματα πολλαπλών επεξεργασ τών 81 Κώδικας 4.2 Αναδρομική (recursive) υλοποίησ η αλγορίθμου Floyd-Warshall με OpenMP tasks FWI (A, B, C): for (k = 0; k < N; k ++) for (i = 0; i < N; i ++) for (j = 0; j < N; j ++) A[i][j] = min (A[i][j], B[i][k]+C[k][j]); FWR (A, B, C): if ( base case ) FWI (A, B, C) else { FWR (A11, B11, C11 ); # pragma omp task FWR (A12, B11, C12 ); # pragma omp task FWR (A21, B21, C11 ); # pragma omp taskwait FWR (A22, B21, C12 ); FWR (A22, B21, C12 ); # pragma omp task FWR (A21, B21, C11 ); # pragma omp task FWR (A12, B11, C12 ); # pragma omp taskwait } FWR (A11, B11, C11 );

82 Κεφάλαιο 4. Υλοποίησ η αλγορίθμου Floyd-Warshall Αποτελέσ ματα Dunnington Στο Σχήμα 4.8 φαίνονται τα αποτελέσ ματα των μετρήσ εων της αναδρομικής υλοποίησ ης σ το σ ύσ τημα Dunnington για τις διάφορες κατανομές που περιγράφηκαν και για γράφους μεγέθους 2048 2048 και 4096 4096 κόμβων. Λαμβάνονται μετρήσ εις για διάφορες τιμές μεγέθους του block που κυμαίνονται από 512 512 σ τοιχεία έως 16 16 σ τοιχεία. ve 2048x2048 Time 6,0 Recursive 2048x2048 Time 5,0 Recursive 2048x2048 Speedup 5,0 Recursive 2048x2048 Speed 4,5 4,5 5,0 4,0 4,0 4,0 3,5 3,5 3,0 3,0 TIME SEC 3,0 SPEEDUP 2,5 2,0 SPEEDUP 2,5 2,0 2,0 1,5 1,5 1,0 1,0 1,0 0,5 0,5 128 64 32 16 512 256 128 64 32 16 512 256 128 64 32 16 512 256 128 64 (a) (b) ve 4096x4096 Time 5 Recursive 4096x4096 Time 5,0 Recursive 4096x4096 Speedup 5,0 Recursive 4096x4096 Speed 45,0 4,5 4,5 4 4,0 4,0 35,0 3,5 3,5 3 3,0 3,0 TIME SEC 25,0 2 SPEEDUP 2,5 2,0 SPEEDUP 2,5 2,0 15,0 1,5 1,5 1 1,0 1,0 5,0 0,5 0,5 128 64 32 16 512 256 128 64 32 16 512 256 128 64 32 16 512 256 128 64 (c) (d) Σχ. 4.8: Αποτελέσ ματα μετρήσ εων αναδρομικής υλοποίησ ης σ το σ ύσ τημα Dunnington Παρατηρείται αμέσ ως σ ημαντική βελτίωσ η των χρόνων σ ε σ χέσ η με την απλή υλοποίησ η των τριών loops, τόσ ο σ τη σ ειριακή όσ ο και σ τις παράλληλες εκτελέσ εις. Επίσ ης, αντίθετα με προηγουμένως, για ίδιο αριθμό threads οι packed κατανομές δίνουν καλύτερα αποτελέσ ματα σ ε σ χέσ η με τις αντίσ τοιχες spread, αφού πλέον σ ημασ ία δεν έχει τόσ ο το μέγεθος της κρυφής μνήμης αλλά πόσ α blocks χωράνε σ ε αυτές ώσ τε να τα μοιράζονται περισ σ ότεροι επεξεργασ τικοί πυρήνες. Τα καλύτερα αποτελέσ ματα προκύπτουν για μέγεθος block ίσ ο με 64 64 4B =

4.1. Yλοποίησ η σ ε σ υσ τήματα πολλαπλών επεξεργασ τών 83 16 KB. Αυτό είναι αναμενόμενο αν ληφθεί υπ όψιν ότι η κρυφή μνήμη L1 έχει μέγεθος 32 KB. Ομως, η κλιμάκωσ η του αλγορίθμου δεν είναι καλή, κάτι το οποίο οφείλεται σ το ότι μικρό μόνο κομμάτι του κώδικα μπορεί να παραλληλοποιηθεί. Αποτελέσ ματα Sandy Bridge Αντίσ τοιχα με προηγουμένως, σ το Σχήμα 4.9 φαίνονται τα αποτελέσ ματα των μετρήσ εων της αναδρομικής υλοποίησ ης σ το σ ύσ τημα Sandy Bridge. cursive 2048x2048 Time 6,0 Recursive 2048x2048 Time 5,0 Recursive 2048x2048 Speedup 5,0 Recursive 2048x2048 S 4,5 4,5 5,0 4,0 4,0 4,0 3,5 3,5 3,0 3,0 TIME SEC 3,0 SPEEDUP 2,5 2,0 SPEEDUP 2,5 2,0 2,0 1,5 1,5 1,0 1,0 1,0 0,5 0,5 256 128 64 32 16 512 256 128 64 32 16 512 256 128 64 32 16 512 256 128 6 (a) (b) cursive 4096x4096 Time 5 Recursive 4096x4096 Time 6,0 Recursive 4096x4096 Speedup 6,0 Recursive 4096x4096 S 45,0 4 5,0 5,0 35,0 4,0 4,0 3 TIME SEC 25,0 2 SPEEDUP 3,0 SPEEDUP 3,0 15,0 2,0 2,0 1 1,0 1,0 5,0 256 128 64 32 16 512 256 128 64 32 16 512 256 128 64 32 16 512 256 128 6 (c) (d) Σχ. 4.9: Αποτελέσ ματα μετρήσ εων αναδρομικής υλοποίησ ης σ το σ ύσ τημα Sandy Bridge Και σ ε αυτά τα αποτελέσ ματα παρατηρείται η ίδια σ υμπεριφορά που αναλύθηκε προηγουμένως για το σ ύσ τημα Dunnington, με τα καλύτερα αποτελέσ ματα χρόνου να προκύπτουν για το ίδιο μέγεθος block.

84 Κεφάλαιο 4. Υλοποίησ η αλγορίθμου Floyd-Warshall 4.1.3. Tiled υλοποίησ η H δεύτερη εναλλακτική μέθοδος υλοποίησ ης που έχει προταθεί για καλύτερη εκμετάλλευσ η της κρυφής μνήμης είναι η λεγόμενη «Tiled» υλοποίησ η. Η τεχνική του tiling χρησ ιμοποιείται σ υχνά για την επίτευξη υψηλής επαναχρησ ιμοποίησ ης των δεδομένων σ ε αλγορίθμους με loops όπως επίσ ης για τη μείωσ η της μεταφοράς δεδομένων από και προς την κύρια μνήμη. Αρχικά, επιλέγεται ένα μέγεθος block ίσ ο με B και ο πίνακας χωρίζεται σ ε tiles (πλακίδια) μεγέθους B B, όπως φαίνεται σ το Σχήμα 4.10. Στην k οσ τή επανάληψη: Πρώτα ενημερώνεται το διαγώνιο (k, k) tile (μαύρο, CR tile του Σχήματος 4.10). Η ενημέρωσ η γίνεται ανεξάρτητα και δεν υπάρχει εξάρτησ η δεδομένων από κάποιο άλλο tile. Στη σ υνέχεια, ενημερώνονται τα tiles που βρίσ κονται σ την k οσ τή γραμμή και σ την k οσ τή σ τήλη (σ κούρο γκρι, {N, S, E, W }) και υπάρχει εξάρτησ η δεδομένων από το αρχικό διαγώνιο tile που έχει ήδη ενημερωθεί. Οι ενημερώσ εις μπορούν να γίνουν παράλληλα αφού είναι ανεξάρτητες μεταξύ τους και εξαρτώνται μόνο από το διαγώνιο tile. Τέλος, όταν έχει ολοκληρωθεί το προηγούμενο σ τάδιο, ενημερώνονται τα υπόλοιπα tiles του πίνακα (ανοιχτό γκρι, {NW, SW, NE, SE}). Υπάρχει εξάρτησ η δεδομένων για κάθε tile από τα αντίσ τοιχα {N, S, E, W } tiles που βρίσ κονται σ την ίδια γραμμή και σ τήλη. Ομοίως με προηγουμένως, οι ενημερώσ εις μπορούν να γίνουν παράλληλα μεταξύ τους. Αν το μέγεθος του πίνακα είναι N, σ υνολικά απαιτούνται k = N /B επαναλήψεις. Τα διακεκομμένα βέλη του Σχήματος 4.10 δείχνουν τις εξαρτήσ εις των δεδομένων για κάθε είδος tile. Με την τεχνική του tiling μειώνεται η κίνησ η από και προς την κύρια μνήμη κατά B φορές. Η κατάλληλη επιλογή του μεγέθους του B σ ε σ χέσ η με το μέγεθος της κρυφής μνήμης δίνει τα καλύτερα αποτελέσ ματα. Στον Κώδικα 4.3 φαίνεται η tiled σ ειριακή υλοποίησ η του αλγορίθμου που περιγράφηκε παραπάνω. NW NW N NE NW NW N NE W W CR E SW SW S SE Β Σχ. 4.10: Εφαρμογή τεχνικής tiling σ τον αλγόριθμο Floyd-Warshall Κώδικας 4.3 Tiled σ ειριακή υλοποίησ η αλγορίθμου Floyd-Warshall for (k = 0; k < N; k+=b) { FW(CR ); for tile in E, W, N, S FW( tile ); for tile in NE, NW, SE, SW FW( tile ); }

4.1. Yλοποίησ η σ ε σ υσ τήματα πολλαπλών επεξεργασ τών 85 Παραλληλοποίησ η με OpenMP Tasks Ο πρώτος τρόπος με τον οποίο μπορεί να παραλληλοποιηθεί η tiled υλοποίησ η είναι με χρήσ η OpenMP tasks, όπως φαίνεται σ τον Κώδικα 4.4. Κώδικας 4.4 Tiled υλοποίησ η αλγορίθμου Floyd-Warshall παραλληλοποιημένη με OpenMP tasks for (k = 0; k < N; k+=b) { FW(CR ); foreach tile in (E, W, N, S) # pragma omp task FW( tile ); # pragma omp taskwait foreach tile in ( E) # pragma omp task foreach tile in ( N) FW(NE ); foreach tile in ( W) # pragma omp task foreach tile in ( N) FW(NW ); foreach tile in ( E) # pragma omp task foreach tile in ( S) FW(SE ); foreach tile in ( W) # pragma omp task foreach tile in ( S) FW(SW ); } # pragma omp taskwait Stage I Stage II Stage III...... CR tile N,W,E,S tiles NW,SW,NE,SE tiles

86 Κεφάλαιο 4. Υλοποίησ η αλγορίθμου Floyd-Warshall Η δημιουργία και ο σ υγχρονισ μός των tasks γίνεται με τέτοιο τρόπο ώσ τε να γίνονται σ εβασ τές οι εξαρτήσ εις δεδομένων που υπάρχουν ανάμεσ α σ τα 3 σ τάδια κάθε επανάληψης. Δοκιμάσ τηκε επίσ ης μια εναλλακτική υλοποίησ η του Κώδικα 4.4, σ την οποία κατά το τρίτο σ τάδιο δημιουργείται ένα ξεχωρισ τό task για κάθε {NW, SW, NE, SE} tile αλλά τα αποτελέσ ματα ήταν αρκετά χειρότερα εξαιτίας του αυξημένου overhead δημιουργίας και δρομολόγησ ης τόσ ων πολλών tasks και του πολύ μικρού επεξεργασ τικού φορτίου κάθε tasks. Για το λόγο αυτό, δεν σ υμπεριλαμβάνονται μετρήσ εις από αυτή την υλοποίησ η. Παραλληλοποίησ η με OpenMP parallel for Ο δεύτερος τρόπος με τον οποίο μπορεί να παραλληλοποιηθεί η tiled υλοποίησ η είναι παραλληλοποιώντας όλα τα for loops κάθε επανάληψης με χρήσ η της κατάλληλης οδηγίας του OpenMP, όπως φαίνεται σ τον Κώδικα 4.5. Κώδικας 4.5 Tiled υλοποίησ η αλγορίθμου Floyd-Warshall παραλληλοποιημένη με OpenMP parallel for for (k = 0; k < N; k+=b) { FW(CR ); # pragma omp for nowait foreach tile in (E, W, N, S) FW( tile ); # pragma omp barrier # pragma omp for nowait foreach tile in ( E) foreach tile in ( N) FW(NE ); # pragma omp for nowait foreach tile in ( W) foreach tile in ( N) FW(NW ); # pragma omp for nowait foreach tile in ( E) foreach tile in ( S) FW(SE ); # pragma omp for nowait foreach tile in ( W) foreach tile in ( S) FW(SW ); } # pragma omp barrier

4.1. Yλοποίησ η σ ε σ υσ τήματα πολλαπλών επεξεργασ τών 87 Αποτελέσ ματα Dunnington OpenMP tasks: Στο Σχήμα 4.11 φαίνονται τα αποτελέσ ματα των μετρήσ εων της tiled υλοποίησ ης με χρήσ η OpenMP tasks σ το σ ύσ τημα Dunnington για τις διάφορες κατανομές που περιγράφηκαν και για γράφους μεγέθους 2048 2048 και 4096 4096 κόμβων. Λαμβάνονται μετρήσ εις για διάφορες τιμές B του block που κυμαίνονται από B = 512 έως B = 16. with Tasks 2048x2048 Time 6,0 Tiled with Tasks 2048x2048 Time 12,0 Tiled with Tasks 2048x2048 Speedup 12,0 Tiled with Tasks 2048x2048 5,0 1 1 4,0 8,0 8,0 TIME SEC 3,0 SPEEDUP 6,0 SPEEDUP 6,0 2,0 4,0 4,0 1,0 2,0 2,0 256 128 64 32 16 512 256 128 64 32 16 512 256 128 64 32 16 512 256 128 6 (a) (b) with Tasks 4096x4096 Time 5 Tiled with Tasks 4096x4096 Time 18,0 Tiled with Tasks 4096x4096 Speedup 18,0 Tiled with Tasks 4096x4096 45,0 16,0 16,0 4 14,0 14,0 TIME SEC 35,0 3 25,0 2 15,0 1 5,0 SPEEDUP 12,0 1 8,0 6,0 4,0 2,0 SPEEDUP 12,0 1 8,0 6,0 4,0 2,0 256 128 64 32 16 512 256 128 64 32 16 512 256 128 64 32 16 512 256 128 6 (c) (d) Σχ. 4.11: Αποτελέσ ματα μετρήσ εων tiled υλοποίησ ης με χρήσ η OpenMP tasks σ το σ ύσ τημα Dunnington Στην υλοποίησ η αυτή βλέπουμε για πρώτη φορά πολύ βελτιωμένες επιδόσ εις σ ε σ χέσ η με τις προηγούμενες υλοποιήσ εις. Η καλύτερη επίδοσ η προκύπτει για B = 64, δηλαδή μέγεθος block ίσ ο με 64 64 4B = 16 KB. Το γεγονός αυτό είναι αναμενόμενο με βάσ η την κρυφή μνήμη L1 μεγέθους 32 KB. Το αμέσ ως μεγαλύτερο μέγεθος block B = 128 (128 128 4B = 64 KB), μπορεί να μειώνει σ το μισ ό τα δεδομένα που μεταφέρονται από τη μνήμη σ ε σ χέσ η με το B = 64,

88 Κεφάλαιο 4. Υλοποίησ η αλγορίθμου Floyd-Warshall αλλά ταυτόχρονα υσ τερεί αφού δεν χωράει ολόκληρο σ την L1 κρυφή μνήμη. Για τα μη ακραία μεγέθη του B, δεν προκύπτει καμία διαφορά ανάμεσ α σ ε packed και spread κατανομές ίδιου αριθμού threads. Τέλος, η κλιμάκωσ η της υλοποίησ ης κρίνεται αρκετά καλή και σ ημαντικά βελτιωμένη σ ε σ χέσ η με τις προαναφερθείσ ες υλοποιήσ εις. OpenMP parallel for: Στο Σχήμα 4.12 φαίνονται τα αποτελέσ ματα των μετρήσ εων της tiled υλοποίησ ης με χρήσ η OpenMP parallel for σ το σ ύσ τημα Dunnington. rallel for 2048x2048 Time 1 Tiled with parallel for 2048x2048 Time 18,0 Tiled with parallel for 2048x2048 Speedup 18,0 Tiled with parallel for 2048x2048 9,0 16,0 16,0 8,0 14,0 14,0 7,0 12,0 12,0 TIME SEC 6,0 5,0 4,0 SPEEDUP 1 8,0 SPEEDUP 1 8,0 3,0 6,0 6,0 2,0 4,0 4,0 1,0 2,0 2,0 128 64 32 16 512 256 128 64 32 16 512 256 128 64 32 16 512 256 128 64 (a) (b) rallel for 4096x4096 Time 5 Tiled with parallel for 4096x4096 Time 2 Tiled with parallel for 4096x4096 Speedup 2 Tiled with parallel for 4096x4096 45,0 18,0 18,0 4 16,0 16,0 35,0 14,0 14,0 3 12,0 12,0 TIME SEC 25,0 2 SPEEDUP 1 8,0 SPEEDUP 1 8,0 15,0 6,0 6,0 1 4,0 4,0 5,0 2,0 2,0 128 64 32 16 512 256 128 64 32 16 512 256 128 64 32 16 512 256 128 64 (c) (d) Σχ. 4.12: Αποτελέσ ματα μετρήσ εων tiled υλοποίησ ης με χρήσ η OpenMP parallel for σ το σ ύσ τημα Dunnington Και σ ε αυτή την υλοποίησ η παρατηρείται όμοια σ υμπεριφορά με εκείνη της υλοποίησ ης με tasks, με τους καλύτερους χρόνους όμως ελαφρώς αυξημένους, όπως φαίνεται σ τον Πίνακα 4.3.

4.1. Yλοποίησ η σ ε σ υσ τήματα πολλαπλών επεξεργασ τών 89 Tiled 2048 2048 4096 4096 (24 threads) B = 64 B = 32 B = 16 B = 64 B = 32 B = 16 OpenMP tasks 0,351 s 0, 461s 1, 187s 1,926 s 3, 189s 8, 419s OpenMP parallel for 0, 713s 0, 405s 0, 370s 2, 622s 2, 136s 2, 581s Πίν. 4.3: Καλύτεροι χρόνοι παράλληλων tiled υλοποιήσ εων σ το σ ύσ τημα Dunnington Αποτελέσ ματα Sandy Bridge OpenMP tasks: Στο Σχήμα 4.13 φαίνονται τα αποτελέσ ματα των μετρήσ εων της tiled υλοποίησ ης με χρήσ η OpenMP tasks σ το σ ύσ τημα Sandy Bridge. with Tasks 2048x2048 Time 6,0 Tiled with Tasks 2048x2048 Time 16,0 Tiled with Tasks 2048x2048 Speedup 16,0 Tiled with Tasks 2048x2048 5,0 14,0 14,0 12,0 12,0 4,0 1 1 TIME SEC 3,0 SPEEDUP 8,0 SPEEDUP 8,0 2,0 6,0 6,0 4,0 4,0 1,0 2,0 2,0 256 128 64 32 16 512 256 128 64 32 16 512 256 128 64 32 16 512 256 128 6 (a) (b) with Tasks 4096x4096 Time 45,0 Tiled with Tasks 4096x4096 Time 2 Tiled with Tasks 4096x4096 Speedup 2 Tiled with Tasks 4096x4096 4 18,0 18,0 35,0 16,0 16,0 3 14,0 14,0 TIME SEC 25,0 2 SPEEDUP 12,0 1 8,0 SPEEDUP 12,0 1 8,0 15,0 6,0 6,0 1 4,0 4,0 5,0 2,0 2,0 256 128 64 32 16 512 256 128 64 32 16 512 256 128 64 32 16 512 256 128 6 (c) (d) Σχ. 4.13: Αποτελέσ ματα μετρήσ εων tiled υλοποίησ ης με χρήσ η OpenMP tasks σ το σ ύσ τημα Sandy Bridge

90 Κεφάλαιο 4. Υλοποίησ η αλγορίθμου Floyd-Warshall Και σ το σ ύσ τημα Sandy Bridge, η tiled υλοποίησ η με tasks παρουσ ιάζει εξίσ ου καλά αποτελέσ ματα με προηγουμένως τόσ ο ως προς τους χρόνους όσ ο και ως προς την κλιμάκωσ η. OpenMP parallel for: Στο Σχήμα 4.14 φαίνονται τα αποτελέσ ματα των μετρήσ εων της tiled υλοποίησ ης με χρήσ η OpenMP parallel for σ το σ ύσ τημα Sandy Bridge. rallel for 2048x2048 Time 7,0 Tiled with parallel for 2048x2048 Time 14,0 Tiled with parallel for 2048x2048 Speedup 14,0 Tiled with parallel for 2048x2048 6,0 12,0 12,0 5,0 1 1 TIME SEC 4,0 3,0 SPEEDUP 8,0 6,0 SPEEDUP 8,0 6,0 2,0 4,0 4,0 1,0 2,0 2,0 128 64 32 16 512 256 128 64 32 16 512 256 128 64 32 16 512 256 128 64 (a) (b) rallel for 4096x4096 Time 5 Tiled with parallel for 4096x4096 Time 18,0 Tiled with parallel for 4096x4096 Speedup 18,0 Tiled with parallel for 4096x4096 45,0 16,0 16,0 4 14,0 14,0 35,0 12,0 12,0 TIME SEC 3 25,0 2 SPEEDUP 1 8,0 SPEEDUP 1 8,0 15,0 6,0 6,0 1 4,0 4,0 5,0 2,0 2,0 128 64 32 16 512 256 128 64 32 16 512 256 128 64 32 16 512 256 128 64 (c) (d) Σχ. 4.14: Αποτελέσ ματα μετρήσ εων tiled υλοποίησ ης με χρήσ η OpenMP parallel for σ το σ ύσ τημα Sandy Bridge Τέλος, και σ ε αυτή την υλοποίησ η παρουσ ιάζεται παρόμοια εικόνα με εκείνη που περιγράφηκε για το σ ύσ τημα Dunnington, με τη διαφορά ότι η υλοποίησ η με tasks είναι αρκετά πιο γρήγορη από εκείνη με parallel for, όπως φαίνεται σ τον Πίνακα 4.4.

4.1. Yλοποίησ η σ ε σ υσ τήματα πολλαπλών επεξεργασ τών 91 Tiled 2048 2048 4096 4096 (32 threads) B = 64 B = 32 B = 16 B = 64 B = 32 B = 16 OpenMP tasks 0,276 s 0,274 s 0, 709s 1,583 s 1, 695s 5, 039s OpenMP parallel for 0, 692s 0, 486s 0, 443s 3, 105s 2, 650s 2, 634s Πίν. 4.4: Καλύτεροι χρόνοι παράλληλων tiled υλοποιήσ εων σ το σ ύσ τημα Sandy Bridge 4.1.4. Συγκεντρωτικά αποτελέσ ματα Στα Σχήματα 4.15 και 4.16 φαίνονται σ υγκεντρωμένα οι μετρήσ εις από όλες τις υλοποιήσ εις για τους δύο γράφους που εξετάσ τηκαν σ τις προηγούμενες υποενότητες ανά σ ύσ τημα. Για όσ ες υλοποιήσ εις περιέχουν blocking επιλέγονται τα μεγέθη block με τους καλύτερους χρόνους. 10 All Implementations 2048x2048 Time 1 TIME SEC 1,0 0,1 Serial with OpenMP Recursive, B 64 Tiled with tasks, B 64 Tiled with parallel for, B 32 Tiled with parallel for, B 16 (a) Dunnington 1 All Implementations 2048x2048 Time TIME SEC 1,0 0,1 Serial with OpenMP Recursive, B 64 Recursive, B 32 Tiled with tasks, B 64 Tiled with tasks, B 32 Tiled with parallel for, B 32 Tiled with parallel for, B 16 (b) Sandy Bridge Σχ. 4.15: Συγκεντρωτικές μετρήσ εις για το γράφο των 2048 2048 κόμβων από όλες τις υλοποιήσ εις

92 Κεφάλαιο 4. Υλοποίησ η αλγορίθμου Floyd-Warshall 1.00 All Implementations 4096x4096 Time 10 TIME SEC 1 1,0 Serial with OpenMP Recursive, B 64 Tiled with tasks, B 64 Tiled with parallel for, B 32 Tiled with parallel for, B 16 (a) Dunnington 10 All Implementations 4096x4096 Time TIME SEC 1 1,0 Serial with OpenMP Recursive, B 64 Tiled with tasks, B 128 Tiled with tasks, B 64 Tiled with parallel for, B 32 Tiled with parallel for, B 16 (b) Sandy Bridge Σχ. 4.16: Συγκεντρωτικές μετρήσ εις για το γράφο των 4096 4096 κόμβων από όλες τις υλοποιήσ εις Η tiled υλοποίησ η εμφανίζει την καλύτερη κλιμάκωσ η από τις υπόλοιπες ενώ η παραλληλοποίησ ή της με OpenMP tasks δίνει τις γρηγορότερες επιδόσ εις και σ τα δύο σ υσ τήματα που δοκιμάσ τηκαν. Καλύτερη τιμή μεγέθους block αποδεικνύεται η B = 64 (16 KB), με την αμέσ ως προηγούμενη και την αμέσ ως επόμενη να εμφανίζουν ελάχισ τα διαφοροποιημένους χρόνους. Επίσ ης, παρατηρείται ότι η τεχνολογία Hyper-Threading των επεξεργασ τών του σ υσ τήματος Sandy Bridge. Στο σ ημείο αυτό επισ ημαίνεται ότι σ τα παραπάνω διαγράμματα ο κάθετος άξονας του χρόνου είναι σ ε λογαριθμική κλίμακα.

4.1. Yλοποίησ η σ ε σ υσ τήματα πολλαπλών επεξεργασ τών 93 Τέλος, προκειμένου να διερευνηθεί το καλύτερο μέγεθος block της tiled υλοποίησ ης με tasks για μεγαλύτερους πίνακες σ το σ ύσ τημα Sandy Bridge, δοκιμάζονται τα δύο καλύτερα μεγέθη block για διάφορα μεγέθη γράφων, όπως φαίνεται σ το Σχήμα 4.17. 1.00 Tiled with Tasks Sandy Bridge 32 threads 10 1 TIME SEC 1,0 0,1 1Κ 2K 4K 6K 8K 10K 12K 14K 16K 18K 20K 22K 24K GRAPH SIZE 128 64 Σχ. 4.17: Χωρισ μός πίνακα σ ε υποπίνακες και διαδοχικές αναδρομικές κλήσ ης σ ε κάθε επίπεδο της αναδρομής Παρατηρείται ότι αυξάνεται το μέγεθος του γράφου, η χρήσ η block B = 128 εμφανίζει καλύτερα αποτελέσ ματα από το αντίσ τοιχο B = 64. Προφανώς, υπερισ χύει το γεγονός των μειωμένων μεταφορών από και προς την κύρια μνήμη του σ υσ τήματος σ ε σ χέσ η με το γεγονός ότι το tile 128 128 4B = 64 KB δε χωράει ολόκληρο σ την κρυφή μνήμη L1. Στα διαγράμματα που ακολουθούν, όπου σ υμπεριλαμβάνονται μετρήσ εις από την tiled υλοποίησ η σ το σ ύσ τημα Sandy Bridge, υπονοείται μέγεθος block ίσ ο B = 128 και 32 threads.

94 Κεφάλαιο 4. Υλοποίησ η αλγορίθμου Floyd-Warshall 4.2. Yλοποίηση σε κάρτες γραφικών Στην ενότητα αυτή παρουσ ιάζονται και αναλύονται οι διαφορετικές υλοποιήσ εις που έγιναν για κάρτες γραφικών. Αρχικά, η πρώτη υλοποίησ η «Global Memory» είναι η πιο απλή και δεν κάνει χρήσ η της ενσ ωματωμένης shared memory της κάρτας γραφικών. Στη σ υνέχεια, τροποποιείται κατάλληλα ώσ τε το περιορισ μένο μέγεθος της κύριας μνήμης DRAM της κάρτας γραφικών να μην αποτελεί εμπόδιο και να λειτουργεί για οσ οδήποτε μεγάλους γράφους απαιτείται. Επειτα, αναλύεται η υλοποίησ η «Shared Memory» όπου γίνεται χρήσ η της ενσ ωματωμένης μοιραζόμενης μνήμης και επιτυγχάνονται πολύ καλύτερες επιδόσ εις από την πρώτη υλοποίησ η. Τέλος, γίνεται επέκτασ η της υλοποίησ ης «Shared Memory» ώσ τε να ξεπερασ τεί το εμπόδιο του περιορισ μένου μεγέθους της κύριας μνήμης της κάρτας γραφικών. CUDA GPU Implementations GPUs Global Memory Global Memory without GPU DRAM memory limit Tesla M2050 Fermi, 3GB Shared Memory Shared Memory without GPU DRAM memory limit Tesla K40 Kepler, 12GB Σχ. 4.18: Παράλληλες υλοποιήσ εις αλγορίθμου Floyd-Warshall για κάρτες γραφικών Μετρήσ εις Διεξάγονται μετρήσ εις σ τις δύο κάρτες γραφικών αρχιτεκτονικών Fermi και Kepler της εταιρίας Nvidia που αναφέρθηκαν σ την Υποενότητα 2.4.2. Χρησ ιμοποιείται η έκδοσ ης 5.0 της πλατφόρμας Nvidia CUDA. Στις μετρήσ εις αναφέρονται οι χρόνοι που επιτυγχάνει κάθε υλοποίησ η σ ε κάθε μία από τις δύο κάρτες γραφικών που εξετάζονται, για γράφο μεγέθους 8192 8192 κόμβων. Ομοια με προηγουμένως, ο γράφος αποθηκεύεται σ τη μνήμη με τη μορφή πίνακα γειτνίασ ης και αναπαρίσ τανται με τύπο float, δηλαδή με αριθμούς κινητής υποδιασ τολής απλής ακρίβειας (32 bit). Συνεπώς, ο γράφος που εξετάζεται έχει μέγεθος 8192 8192 4B = 256 MB. Στους αναφερόμενους χρόνους σ υμπεριλαμβάνεται ο χρόνος μεταφοράς των δεδομένων από και προς την κάρτα γραφικών. Ο υπολογισ μός του speedup κάθε αποτελέσ ματος γίνεται έχοντας ως βάσ η το σ ειριακό χρόνο εκτέλεσ ης σ το σ ύσ τημα που φιλοξενεί την κάρτα γραφικών Tesla M2050 του απλού αλγορίθμου με τα 3 loops που αναλύθηκε σ την Υποενότητα 4.1.1. Πρόκειται για σ ύσ τημα με δύο επεξεργασ τές Intel Xeon X5650 αρχιτεκτονικής Westmere χρονισ μένους σ τα 2.67 GHz και 48 GB μνήμης RAM. Η μεταγλώττισ η του προγράμματος του απλού αλγορίθμου γίνεται με τον compiler GCC έκδοσ ης 4.6.3 με επίπεδο βελτισ τοποιήσ εων -O3. Ο χρόνος που χρειάζεται για να επεξεργασ τεί το γράφο των 8192 κόμβων είναι 1155, 90 sec. Ολες οι υλοποιήσ εις που θα αναλυθούν σ ε αυτή την ενότητα αναπτύχθηκαν αρχικά σ το σ ύσ τημα με την κάρτα γραφικών Tesla Μ2050 γενιάς Fermi και κριτήριο για την απόδοσ η και την βελτισ τοποίησ ή τους ήταν τα αποτελέσ ματα σ ε αυτή την κάρτα. Αργότερα, όταν είχε

4.2. Yλοποίησ η σ ε κάρτες γραφικών 95 ολοκληρωθεί η ανάπτυξη όλων των υλοποιήσ εων, αποκτήθηκε πρόσ βασ η και σ τη νεότερη κάρτα Tesla K40 γενιάς Kepler, οπότε σ υμπεριλαμβάνονται μετρήσ εις και από αυτήν. 4.2.1. Global Memory υλοποίησ η Αρχικά, εξετάζεται η πιο απλή υλοποίησ η του αλγορίθμου Floyd-Warshall σ την κάρτα γραφικών, η ονομαζόμενη Global Memory. Ο πίνακας γειτνίασ ης του γράφου μεγέθους N N μεταφέρεται ολόκληρος σ την κάρτα γραφικών και δημιουργείται ένας kernel ο οποίος υπολογίζει μία επανάληψη k του εξωτερικού loop του απλού αλγορίθμου με τα 3 loops. Ο kernel αυτός εκτελείται k = N φορές και μετά την ολοκλήρωσ η της εκτέλεσ ης σ την κάρτα γραφικών το αποτέλεσ μα αντιγράφεται σ την κύρια μνήμη του σ υσ τήματος. Εγιναν τρεις υλοποιήσ εις Global Memory, κάθε μια από τις οποίες αποτελεί βελτίωσ η της προηγούμενης. Η πρώτη έχει block 2 διασ τάσ εων (2D), η δεύτερη block μίας διάσ τασ ης (1D) και η τρίτη και γρηγορότερη block μίας διάσ τασ ης αλλά κάθε thread υπολογίζει 4 σ τοιχεία του πίνακα αντί για ένα όπως οι προηγούμενες (1D - 4 elements per thread). Σε όλες τις υλοποιήσ εις οι διασ τάσ εις των block επιλέγονται έτσ ι ώσ τε τα block να περιέχουν 256 threads, διότι έτσ ι επιτυγχάνεται 100% χρήσ η των SM/SMX των καρτών γραφικών. 2D block Σε αυτή την υλοποίησ η, ο πίνακας χωρίζεται σ ε 2D blocks διασ τάσ εων 16 16 με σ υνολικά 256 threads το καθένα, όπως φαίνεται σ το Σχήμα 4.19. Συνεπώς, το grid έχει μέγεθος ( N /16, N /16). Κάθε thread επεξεργάζεται ένα σ τοιχείο του πίνακα. Υπολογίζοντας τη θέσ η του μέσ α σ το grid βρίσ κει ποιο σ τοιχείο του πίνακα πρέπει να επεξεργασ τεί, όπως αναλύθηκε σ την Υποενότητα 2.2.4. Στον Κώδικα 4.6 φαίνεται η υλοποίησ η του kenrel και η κλήσ η του από το κύριο πρόγραμμα που εκτελείται σ τον επεξεργασ τή. Σχ. 4.19: Κατανομή blocks της υλοποίησ ης Global Memory - 2D

96 Κεφάλαιο 4. Υλοποίησ η αλγορίθμου Floyd-Warshall Κώδικας 4.6 Υλοποίησ η «CUDA Global Memory - 2D» του αλγορίθμου Floyd-Warshall global void _GPU_kernel_2D ( const int k, float *A, const int N) { int j = blockidx. x * blockdim. x + threadidx. x; int i = blockidx. y * blockdim. y + threadidx. y; int current = N * i + j; float value_i_k = A[i * N + k]; float value_k_j = A[k * N + j]; float temp = value_ i_ k + value_ k_ j ; } if ( temp < A[ current ]) A[ current ] = temp ; main () {... dim3 grid (N/16,N /16); dim3 block (16,16); for ( int k =0; k<n; k ++) _GPU_kernel_2D <<<grid, block >>>(k, A, N); }... i value_i_k k A[current] iteration k value_k_j j Στην υλοποίησ η αυτή, οι προσ βάσ εις σ τη μνήμη για την ανάγνωσ η των τιμών value_k_j και A[current] είναι coalesced (σ υνενωμένες), αφού πρόκειται για σ υνεχόμενες θέσ εις μνήμης. Αντίθετα, οι αναγνώσ εις της τιμής value_i_k δεν είναι, αφού κάθε μία ανήκει σ ε διαφορετική γραμμή του πίνακα. Οταν οι προσ βάσ εις των threads ενός warp σ την global memory της κάρτας γραφικών είναι coalesced, τότε αυτές σ υνενώνονται σ ε όσ ο λιγότερες transactions γίνεται ώσ τε να μειωθεί ο χρόνος μεταφοράς. Οταν οι προσ βάσ εις δεν είναι coalesced, απαιτείται ένα transaction για κάθε πρόσ βασ η ξεχωρισ τά. Στο Σχήμα 4.20 φαίνεται το speedup που επιτυγχάνεται σ ε κάθε κάρτα γραφικών. Στην Tesla M2050 ο χρόνος εκτέλεσ ης είναι 47,37 s, ενώ σ την Tesla K40 είναι 22,59 s.

4.2. Yλοποίησ η σ ε κάρτες γραφικών 97 Global Memory Implementations Speedup 2D 24 0 10 20 30 40 50 60 70 80 90 Tesla M2050 Fermi 2D 51 0 10 20 30 40 50 60 70 80 90 Tesla K40 Kepler Σχ. 4.20: Αποτελέσ ματα υλοποίησ ης Global Memory - 2D για γράφο μεγέθους 8192 8192 1D block Η επόμενη υλοποίησ η που δοκιμάσ τηκε είναι όμοια με την προηγούμενη με τη διαφορά ότι πλέον το block είναι μίας διάσ τασ ης και οριζόντιο. Εντούτοις, σ υνεχίζει να αποτελείται από 256 threads και κάθε thread να υπολογίζει ένα σ τοιχείο του πίνακα, όπως φαίνεται σ το Σχήμα 4.21. Ο λόγος που προτιμήθηκε η χρήσ η οριζόντιου block μίας διάσ τασ ης είναι ώσ τε όλα τα thread που ανήκουν σ το ίδιο block να υπολογίζουν σ τοιχεία που ανήκουν σ την ίδια γραμμή του πίνακα και σ υνεπώς έχουν την ίδια τιμή value_i_k. Ετσ ι: Μειώνονται οι (μη coalesced) αναγνώσ εις από την global memory των τιμών value_i_k από 16 σ ε μόνο μία για κάθε block. Οταν ολοκληρωθεί η ανάγνωσ η από ένα thread κάθε block, τα υπόλοιπα δε χρειάζεται να καταφύγουν σ τη global memory για την ίδια τιμή αλλά την βρίσ κουν σ την L1 cache, αφού όλες οι προσ βάσ εις σ τη global memory είναι cached. Στον Κώδικα 4.7 φαίνεται η υλοποίησ η του kenrel και η κλήσ η του από το κύριο πρόγραμμα. Σχ. 4.21: Κατανομή blocks της υλοποίησ ης Global Memory - 1D

98 Κεφάλαιο 4. Υλοποίησ η αλγορίθμου Floyd-Warshall Κώδικας 4.7 Υλοποίησ η «CUDA Global Memory - 1D» του αλγορίθμου Floyd-Warshall global void _GPU_kernel_1D ( const int k, float *A, const int N) { int j = blockidx. x * blockdim. x + threadidx. x; int i = blockidx. y; int current = N * i + j; float value_i_k = A[i * N + k]; float value_k_j = A[k * N + j]; float temp = value_ i_ k + value_ k_ j ; } if ( temp < A[ current ]) A[ current ] = temp ; main () {... dim3 grid (N /256, N); dim3 block (256,1); for ( int k =0; k<n; k ++) _GPU_kernel_1D <<<grid, block >>>(k, A, N); }... Στο Σχήμα 4.22 φαίνεται το speedup που επιτυγχάνεται σ ε κάθε κάρτα γραφικών. Στην Tesla M2050 παρατηρείται μείωσ η του χρόνου εκτέλεσ ης σ ε 35,08 s, ενώ σ την Tesla K40 μειώνεται οριακά σ ε 22,17 s. Global Memory Implementations Speedup 2D 24 1D 33 0 10 20 30 40 50 60 70 80 90 Tesla M2050 Fermi 2D 51 1D 52 0 10 20 30 40 50 60 70 80 90 Tesla K40 Kepler Σχ. 4.22: Αποτελέσ ματα υλοποίησ ης Global Memory - 2D για γράφο μεγέθους 8192 8192

4.2. Yλοποίησ η σ ε κάρτες γραφικών 99 1D Block - 4 elements per thread Η τρίτη και πιο αποδοτική υλοποίησ η τροποποιεί κατάλληλα την προηγούμενη υλοποίησ η ώσ τε κάθε thread να υπολογίζει 4 σ τοιχεία του πίνακα αντί για ένα. Το block παραμένει οριζόντιο μίας διάσ τασ ης και με 256 threads. Συνεπώς, ένα block δεν υπολογίζει 256 σ τοιχεία μιας γραμμής του πίνακα αλλά 4 256 = 1024 σ τοιχεία. Οπως φαίνεται σ το Σχήμα 4.23, κάθε thread υπολογίζει το σ τοιχείο που προκύπτει κανονικά από τη θέσ η του σ το grid και επιπλέον τα επόμενα 3 σ τοιχεία τα οποία απέχουν μεταξύ τους 256 θέσ εις, όσ ο είναι το μέγεθος του block. Για να γίνει περισ σ ότερο κατανοητό, έσ τω για παράδειγμα πίνακας μεγέθους 1024 1024. Το thread(0, 0) θα υπολογίσ ει τα σ τοιχεία A[0][0], A[0][256], A[0][512], A[0][768], ενώ το thread (0, 255) θα υπολογίσ ει τα σ τοιχεία A[0][255], A[0][511], A[0][767], A[0][1023]. Τελικά, με ένα μόνο block των 256 thread υπολογίζονται και τα 1024 σ τοιχεία μίας γραμμής, αντί για 4 blocks που απαιτούνται σ την προηγούμενη υλοποίησ η. Με τον τρόπο αυτό: Ολες οι προσ βάσ εις σ τη global memory παραμένουν coalesced, αφού τα σ τοιχεία που διαβάζει και επεξεργάζεται κάθε thread απέχουν τον ίδιο σ ταθερό αριθμό θέσ εων και σ υνεπώς είναι σ υνεχόμενα. Γίνονται 4 φορές λιγότερες προσ βάσ εις σ τη global memory για την ανάγνωσ η του σ τοιχείου value_i_k. Ο δρομολογητής έχει μεγαλύτερη ευελιξία σ τη δρομολόγησ η των warps και σ την εξαγωγή ILP από τα εκτελούμενα warps. Στο σ ημείο αυτό πρέπει να σ ημειωθεί ότι σ ε περίπτωσ η που το μέγεθος του πίνακα δεν είναι ακριβές πολλαπλάσ ιο του 1024 (ή εν γένει του 4 BLOCK_SIZE), υπάρχουν διάφοροι τρόποι αντιμετώπισ ης όπως το padding, ο υπολογισ μός των σ τοιχείων που περισ σ εύουν με τον απλό 1D kernel κ.ά. (με κάποια μείωσ η των επιδόσ εων σ ε κάθε περίπτωσ η). Σχ. 4.23: Κατανομή blocks της υλοποίησ ης Global Memory - 1D - 4 elements per thread

100 Κεφάλαιο 4. Υλοποίησ η αλγορίθμου Floyd-Warshall Στον Κώδικα 4.8 φαίνεται η υλοποίησ η του kenrel και η κλήσ η του από το κύριο πρόγραμμα που εκτελείται σ τον επεξεργασ τή. Κώδικας 4.8 Υλοποίησ η «CUDA Global Memory - 1D - 4 elements per thread» του αλγορίθμου Floyd-Warshall # define BLOCK_ SIZE 256 global void _GPU_kernel_1D_4elem ( const int k, float *A, const int N) { int i = N * blockidx. y; int j = (4* blockidx.x) * blockdim.x + threadidx.x; float value_i_k = A[i + k]; float value_k_j1 = A[k * N + j]; float value_ k_ j2 = A[ k * N + j + BLOCK_ SIZE ]; float value_ k_ j3 = A[ k * N + j + 2* BLOCK_ SIZE ]; float value_ k_ j4 = A[ k * N + j + 3* BLOCK_ SIZE ]; int current1 = i + j; int current2 = current1 + BLOCK_ SIZE ; int current3 = current1 + 2* BLOCK_ SIZE ; int current4 = current1 + 3* BLOCK_ SIZE ; float temp1 = value_ i_ k + value_ k_ j1 ; float temp2 = value_ i_ k + value_ k_ j2 ; float temp3 = value_ i_ k + value_ k_ j3 ; float temp4 = value_ i_ k + value_ k_ j4 ; } if ( temp1 < A[ current1 ]) A[ current1 ] = temp1 ; if ( temp2 < A[ current2 ]) A[ current2 ] = temp2 ; if ( temp3 < A[ current3 ]) A[ current3 ] = temp3 ; if ( temp4 < A[ current4 ]) A[ current4 ] = temp4 ; main () {... dim3 grid (N/ BLOCK_SIZE /4,N); dim3 block ( BLOCK_SIZE,1); for ( int k =0; k<n; k ++) _GPU_kernel_1D_4elem <<<grid, block >>>(k, A, N); }... Στο Σχήμα 4.24 φαίνεται το speedup που επιτυγχάνεται σ ε κάθε κάρτα γραφικών. Παρατηρείται μεγάλη βελτίωσ η των επιδόσ εων και σ τις δύο κάρτες. Στην Tesla M2050 παρατηρείται περαιτέρω μείωσ η του χρόνου εκτέλεσ ης σ τα 22,86 s και σ την Tesla K40 σ τα 13,61 s.

4.2. Yλοποίησ η σ ε κάρτες γραφικών 101 Το τελικό speedup που επιτυγχάνεται για την Tesla M2050 είναι ίσ ο με 51, δηλαδή ο χρόνος εκτέλεσ ης είναι 51 φορές μικρότερος από τον αντίσ τοιχο σ ειριακό του απλού αλγορίθμου με τα 3 loops σ το σ ύσ τημα με επεξεργασ τές Intel Xeon X5650 που φιλοξενεί την κάρτα Tesla M2050. Για την Tesla K40, το τελικό speedup είναι ίσ ο με 85. Global Memory Implementations Speedup 2D 24 1D 33 1D 4 elem 51 0 10 20 30 40 50 60 70 80 90 Tesla M2050 Fermi 2D 51 1D 52 1D 4 elem 85 0 10 20 30 40 50 60 70 80 90 Tesla K40 Kepler Σχ. 4.24: Αποτελέσ ματα υλοποίησ ης Global Memory - 1D - 4 elements per thread για γράφο μεγέθους 8192 8192 Στον Πίνακα 4.5 φαίνονται σ υγκεντρωμένα οι χρόνοι όλων των υλοποιήσ εων για κάθε κάρτα γραφικών. Global Memory Impl. Tesla M2050 Tesla K40 2D 47,37 sec 22,59 sec 1D 35,08 sec 22,17 sec 1D - 4 elem. per thread 22,86 sec 13,61 sec Πίν. 4.5: Χρόνοι εκτέλεσ ης όλων των Global Memory υλοποιήσ εων Στα διαγράμματα που ακολουθούν σ τις επόμενες ενότητες, όπου αναφέρεται η υλοποίησ η «Global Memory» υπονοείται η πιο αποδοτική υλοποίησ η «1D - 4 elements per thread».

102 Κεφάλαιο 4. Υλοποίησ η αλγορίθμου Floyd-Warshall 4.2.2. Global Memory υλοποίησ η χωρίς περιορισ μό μνήμης κάρτας γραφικών Η μνήμη DRAM της κάρτας γραφικών είναι περιορισ μένη. Συνεπώς, το μέγισ το μέγεθος γράφου που μπορούν να υπολογίσ ουν όλες οι προηγούμενες υλοποιήσ εις εξαρτάται άμεσ α από τη μνήμη της εκάσ τοτε κάρτας γραφικών. Για παράδειγμα, η Tesla M2050 έχει σ υνολική μνήμη DRAM ίσ η με 3 GB, από τα οποία 2.6 GB είναι διαθέσ ιμα σ τον προγραμματισ τή όταν το ECC είναι ενεργοποιημένο, μέγεθος το οποίο δεν κρίνεται ιδιαίτερα μεγάλο. Επομένως, είναι σ ημαντική η προσ πάθεια τροποποίησ ης της υλοποίησ ης Global Memory ώσ τε το μέγισ το μέγεθος του γράφου να πάψει να εξαρτάται από τη μνήμη της κάρτας γραφικών. Στο σ ημείο αυτό έρχεται να βοηθήσ ει η τεχνική του tiling, η οποία αναλύθηκε διεξοδικά σ την Υποενότητα 4.1.3. Ο πίνακας χωρίζεται σ ε μεγάλου μεγέθους tiles και ακολουθείται η γνωσ τή διαδικασ ία των τριών σ ταδίων για κάθε k επανάληψη, όπως φαίνεται σ το Σχήμα 4.25: Αρχικά, αντιγράφεται από την κύρια μνήμη του σ υσ τήματος σ τη μνήμη της κάρτας γραφικών το διαγώνιο (k, k) tile (μαύρο, CR tile), επεξεργάζεται και αντιγράφεται πίσ ω το αποτέλεσ μα. Στο δεύτερο σ τάδιο, αντιγράφονται διαδοχικά σ την κάρτα γραφικών όλα τα tiles που βρίσ κονται σ την k οσ τή γραμμή και σ την k οσ τή σ τήλη (σ κούρο γκρι, {N, S, E, W }) και επεξεργάζονται. Σημειώνεται ότι το διαγώνιο tile από το οποίο εξαρτώνται υπάρχει ήδη υπολογισ μένο σ τη μνήμη της κάρτας γραφικών. Τέλος, σ το τρίτο σ τάδιο, αντιγράφονται διαδοχικά όλα τα υπόλοιπα tiles του πίνακα (ανοιχτό γκρι, {NW, SW, NE, SE}) καθώς και τα tiles της αντίσ τοιχης γραμμής και σ τήλης από τα οποία εξαρτώνται. Οι αντιγραφές γίνονται με κατάλληλο τρόπο ώσ τε να ελαχισ τοποιηθεί ο σ υνολικός αριθμός αντιγραφών. Μετά την επεξεργασ ία κάθε tile, το αποτέλεσ μα μεταφέρεται πίσ ω σ την κύρια μνήμη του σ υσ τήματος. Stage I Stage II Stage III CPU Memory CR N W CR E E S S NW N NE NE W CR E E SW S SE SE SW S SE SE GPU Memory PCI Express CR CR Σχ. 4.25: Εφαρμογή τεχνικής tiling σ τη Global Memory υλοποίησ η για οποιοδήποτε μέγεθος μνήμης κάρτας γραφικών

4.2. Yλοποίησ η σ ε κάρτες γραφικών 103 Από τα παραπάνω γίνεται προφανές ότι το μέγισ το μέγεθος του tile είναι το 1 /3 της σ υνολικής διαθέσ ιμης μνήμης της κάρτας γραφικών, αφού σ το 3ο σ τάδιο θα πρέπει να αποθηκευτούν 3 tiles ταυτόχρονα σ τη μνήμη της κάρτας γραφικών. Με αυτό τον τρόπο μπορεί να υπολογισ τεί οσ οδήποτε μεγάλος γράφος ανεξάρτητα από το μέγεθος της μνήμης της εκάσ τοτε κάρτας, αρκεί να καθορισ τεί σ ωσ τά το μέγεθος του tile. Μεταφορά δεδομένων από και προς την κάρτα γραφικών Η σ ύνδεσ η των καρτών γραφικών σ το σ ύσ τημα γίνεται μέσ ω του διαύλου PCI Express και μέσ ω αυτού γίνεται η μεταφορά των δεδομένων. Η Tesla M2050 υποσ τηρίζει την έκδοσ η 2.0 του διαύλου PCI Express και το μέγισ το θεωρητικό εύρος ζώνης ανέρχεται σ ε 8 GB/s (χρησ ιμοποιεί 16 lanes). Για να επιτευχθεί η μέγισ τη ταχύτητα αντιγραφής ανάμεσ α σ την κύρια μνήμη του σ υσ τήματος (host) και τη μνήμη της κάρτας γραφικών (device), θα πρέπει η μνήμη που έχει δεσ μευτεί σ το σ ύσ τημα να είναι pinned και όχι pageable. Οταν μία θέσ η μνήμης δηλώνεται ως pinned, το λειτουργικό σ ύσ τημα δεν μπορεί να την κάνει swap σ ε ένα δευτερεύον σ ύσ τημα αποθήκευσ ης (λ.χ. σ κληρός δίσ κος) και παραμένει μόνιμα σ τη φυσ ική μνήμη RAM. Στο Σχήμα 4.26 φαίνονται οι ταχύτητες διαμεταγωγής προς (H2D) και από (D2H) την κάρτα γραφικών Tesla M2050, χρησ ιμοποιώντας και τα δύο είδη μνήμης pinned και pageable. TESLA M2050 MEMORY TRANSFERS HOST TO DEVICE AND DEVICE TO HOST 5.7 GB/s 6.2 GB/s 3.0 GB/s 3.6 GB/s H2D D2H H2D D2H PINNED HOST MEMORY PAGEABLE HOST MEMORY Σχ. 4.26: Εύρος ζώνης αντιγράφης προς και από την κάρτα γραφικών Tesla M2050 Παρατηρείται τεράσ τια διαφορά σ το πραγματικό εύρος ζώνης ανάμεσ α σ ε pinned και pageable είδος μνήμης, αν και το υπολείπεται από το θεωρητικό μέγισ το. Για το λόγο αυτό, το προτεινόμενο είναι να δεσ μευτεί όλος ο πίνακας με pinned memory. Σε περίπτωσ η που κάτι τέτοιο δεν είναι εφικτό, η εναλλακτική είναι να δεσ μευτεί με pinned μνήμη χώρος ίσ ος με το μέγεθος του tile και να χρησ ιμοποιηθεί ως buffer σ τις αντιγραφές, όπως φαίνεται σ το Σχήμα 4.27. Η εναλλακτική αυτή ακολουθείται σ την υλοποίησ η της παρούσ ας διπλωματικής εργασ ίας ώσ τε να τονισ τεί το αμελητέο overhead που έχει, όπως θα φανεί αργότερα σ τις μετρήσ εις.

104 Κεφάλαιο 4. Υλοποίησ η αλγορίθμου Floyd-Warshall CPU Memory GPU Memory Graph matrix Pinned Mem Σχ. 4.27: Αντιγραφή προς και από την κάρτα γραφικών μέσ ω pinned μνήμης ως buffer Μετρήσ εις Για την παρουσ ίασ η των αποτελεσ μάτων θα χρησ ιμοποιηθεί η κάρτα Tesla M2050, της οποίας το μέγεθος μνήμης είναι αρκετά μικρότερο από αυτό της Tesla K40. Επιλέγεται γράφος μεγέθους 20480 20480 4B = 1600 MB, ο οποίος χωράει ολόκληρος σ την Tesla M2050. Αρχικά υπολογίζεται ο χρόνος της κανονικής (untiled) υλοποίησ ης «Global Memory» της Υποενότητας 4.2.1 και σ τη σ υνέχεια υπολογίζεται ο χρόνος της υλοποίησ ης χωρίς περιορισ μό μνήμης για τρία διαφορετικά μεγέθη tile, ώσ τε να εκτιμηθεί το χρονικό overhead των αντιγραφών προς και από την κάρτα γραφικών. Επιλέγονται τα εξής μεγέθη tile: 10240 10240 4B = 400 M B, 5120 5120 4B = 100 MB, 4096 4096 4B = 64 MB. Στο Σχήμα 4.28 φαίνεται το διάγραμμα των μετρήσ εων. GPU Global Memory without memory limit 20K x 20K Tesla M2050 400 350 300 Time sec 250 200 150 100 50 0 Untiled 10K tiles 5K tiles 4K tiles Transfer overhead 0 4 11 15 Execution time 359 352 352 355 Σχ. 4.28: Χρόνοι εκτέλεσ ης Global Memory υλοποίησ ης χωρίς περιορισ μό μνήμης για γράφο μεγέθους 20480 20480 σ την κάρτα Tesla M2050 Παρατηρείται ότι σ ε όλες τις περιπτώσ εις το overhead που προκύπτει είναι ελάχισ το (4% σ τη χειρότερη περίπτωσ η). Επίσ ης, όσ ο μεγαλύτερο είναι το μέγεθος του tile, τόσ ο μικρότερο

4.2. Yλοποίησ η σ ε κάρτες γραφικών 105 είναι το overhead. Συνεπώς, η υλοποίησ η Global Memory χωρίς περιορισ μό μνήμης της κάρτας γραφικών είναι εξαιρετικά αποδοτική και πλέον μπορεί να επεξεργασ τεί οποιοδήποτε μέγεθος πίνακα. Δοκιμάσ τηκαν μεγέθη πίνακα μέχρι και 52K 52K 4B = 10.56 GB με απόλυτη επιτυχία. Επιπλέον, η σ υγκεκριμένη υλοποίησ η δοκιμάσ τηκε και σ την κάρτα γραφικών Tesla K40, που διαθέτει τεράσ τια μνήμη μεγέθους 12 GB, και προέκυψε αντίσ τοιχη εικόνα αποτελεσ μάτων με αυτή της Tesla M2050. 4.2.3. Shared Memory υλοποίησ η Παρά τις όποιες βελτισ τοποιήσ εις, η Global Memory υλοποίησ η της Υποενότητας 4.2.1 είναι memory bounded, αφού σ ε κάθε εκτέλεσ η του kernel πρέπει να μεταφέρεται ολόκληρος ο πίνακας από και προς την μνήμη DRAM της κάρτας γραφικών. Οπως αναφέρθηκε σ τον Πίνακα 2.1, το latency των προσ βάσ εων σ τη global memory κυμαίνεται ανάμεσ α σ ε 400 και 600 κύκλους ρολογιού. Προκειμένου να αυξηθούν οι επιδόσ εις πρέπει να μειωθούν όσ ο το δυνατόν περισ σ ότερο οι μεταφορές δεδομένων ανάμεσ α σ το chip και την global memory. Για να επιτευχθεί αυτό είναι απαραίτητο να χρησ ιμοποιηθεί ένα από τα μεγάλα πλεονεκτήματα της κάρτας γραφικών, δηλαδή η ταχύτατη on chip shared memory η οποία είναι διαχειρίσ ιμη από τον προγραμματισ τή. Η τεχνική του tiling αποδεικνύεται για άλλη μια φορά εξαιρετικά χρήσ ιμη αφού πλέον θα εφαρμοσ τεί ανάμεσ α σ τις global και shared memory. Ο πίνακας (ο οποίος βρίσ κεται ολόκληρος αποθηκευμένος σ τη global memory της κάρτας) χωρίζεται σ ε μικρά tiles κατάλληλου μεγέθους ώσ τε να χωράνε σ τη shared memory και ακολουθείται η γνωσ τή διαδικασ ία, όπως φαίνεται σ το Σχήμα 4.29: Αρχικά, αντιγράφεται από την global memory της κάρτας σ τη shared memory ενός SM το διαγώνιο (k, k) tile (μαύρο, CR tile), επεξεργάζεται και αντιγράφεται πίσ ω το αποτέλεσ μα. Στο δεύτερο σ τάδιο, αντιγράφονται διαδοχικά από την global memory της κάρτας σ τις shared memory των SM όλα τα tiles που βρίσ κονται σ την k οσ τή γραμμή και σ την k οσ τή σ τήλη (σ κούρο γκρι, {N, S, E, W }) μαζί με το διαγώνιο tile από το οποίο εξαρτώνται και επεξεργάζονται. Ομοίως, το αποτέλεσ μα αντιγράφεται πίσ ω σ τη global memory. Τέλος, σ το τρίτο σ τάδιο, αντιγράφονται διαδοχικά σ τις shared memory των SM όλα τα υπόλοιπα tiles του πίνακα (ανοιχτό γκρι, {NW, SW, NE, SE}) καθώς και τα tiles της αντίσ τοιχης γραμμής και σ τήλης από τα οποία εξαρτώνται. Μετά την επεξεργασ ία τους, το αποτέλεσ μα επισ τρέφει πίσ ω σ τη global memory. Χάρη σ την τεχνική αυτή, μειώνεται ο αριθμός των προσ βάσ εων σ τη global memory τόσ ες φορές όσ ο είναι το μέγεθος του tile. Κατά το τρίτο σ τάδιο πρέπει να αποθηκευτούν σ τη shared memory κάθε SM 3 tiles. Συνεπώς, το μέγισ το μέγεθος του tile είναι ίσ ο με: 48 KB 3 Επίσ ης, το μέγισ το μέγεθος της shared memory είναι 48KB. = 16 KB 16384 B = 4096 elements 64 64 tile 4 B/element

106 Κεφάλαιο 4. Υλοποίησ η αλγορίθμου Floyd-Warshall SM 0 SM 1 GPU Memory CR CR Shared Memory Cuda cores Inactive... Chip N W CR E S E CR SM 0 SM 1 CR... S NW N NE NE W CR E E SW S SE SE SW S SE SE SM 0 SM 1... Σχ. 4.29: Εφαρμογή τεχνικής tiling σ τη Shared Memory υλοποίησ η Κατανομή των threads εντός των tiles Με μέγισ τες διασ τάσ εις των tiles ίσ ες με 64 64, κάθε tile αποτελείται από 4096 σ τοιχεία. Η shared memory είναι μοιραζόμενη ανάμεσ α σ τα threads ενός block. Αφού με ένα block καταναλώνεται όλη η διαθέσ ιμη shared memory, για καλύτερες επιδόσ εις πρέπει το block να έχει τον μέγισ το επιτρεπτό αριθμό από threads. Ο μέγισ τος αριθμός threads ανά block που επιτρέπεται είναι 1024 threads. Συνεπώς, κάθε thread οφείλει να επεξεργασ τεί 4 σ τοιχεία του πίνακα. Η πρώτη κατανομή που δοκιμάσ τηκε είναι σ ε κάθε thread να ανατίθενται 4 σ υνεχόμενα σ τοιχεία του πίνακα προς επεξεργασ ία, όπως φαίνεται σ το Σχήμα 4.30. Ομως, με αυτή την κατανομή δημιουργούνται 4-way bank conflicts ανάμεσ α σ τα threads των warps αφού τα σ τοιχεία που πρέπει να επεξεργασ τούν τα thread 0, 8, 16 και 24 βρίσ κονται αποθηκευμένα σ τα ίδια memory banks. Τα bank conflicts αποτελούν σ ημαντική αιτία μείωσ ης των επιδόσ εων αφού οι αιτήσ εις πρόσ βασ ης δεν εξυπηρετούνται ταυτόχρονα αλλά σ ειριακά.

TILE 4.2. Yλοποίησ η σ ε κάρτες γραφικών 107 thread 0 thread 1 thread 2 thread 3 thread 4 Thread 0 Thread 1 Thread 2 Thread 3 Thread 4 Thread 5 Thread 6 Thread 7 Thread 8. Thread 16. Bank 0 Bank 1 Bank 2 Bank 3 Bank 4 Bank 5 Bank 6 Bank 7 Bank 8. Bank 16. Thread 24 Bank 24. x4. Thread 31 Bank 31 Σχ. 4.30: Packed κατανομή των σ τοιχείων των threads εντός ενός tile Αντίθετα, διατηρώντας τον ίδιο αριθμό threads ανά γραμμή του tile, σ την spread κατανομή κάθε thread επεξεργάζεται σ τοιχεία της γραμμής ενός tile που απέχουν μεταξύ τους 64 /4 = 16 θέσ εις, όπως φαίνεται σ το Σχήμα 4.31. Με τον τρόπο αυτό, μειώνονται σ ε μεγάλο βαθμό τα bank conflicts, αυξάνοντας τις επιδόσ εις όπως φαίνεται σ τις μετρήσ εις που ακολουθούν σ την επόμενη παράγραφο. read 2 thread 3 thread 4 thread 0 thread 1...... 16 elements 16 16 16 Σχ. 4.31: Spread κατανομή των σ τοιχείων των threads εντός ενός tile Μετρήσ εις Στο Σχήμα 4.32 φαίνεται το speedup που επιτυγχάνεται σ ε κάθε κάρτα γραφικών για την υλοποίησ η Shared Memory. Παρατηρείται θεαματική αύξησ η των επιδόσ εων σ ε σ ημείο που ξεπεράσ τηκαν ακόμα και οι αισ ιόδοξες προσ δοκίες. Με αυτή την υλοποίησ η η κάρτα Tesla K40 γενιάς Kepler επωφελείται περισ σ ότερο αφού πλέον είναι πάνω από δύο φορές γρηγορότερη από την Tesla M2050 γενιάς Fermi. Επίσ ης, παρατηρείται και σ τις δύο κάρτες η επίπτωσ η που έχουν σ τις επιδόσ εις τα bank conflicts σ τις προσ βάσ εις σ τη shared memory.

108 Κεφάλαιο 4. Υλοποίησ η αλγορίθμου Floyd-Warshall Shared Memory Implementation Speedup Global Memory 51 Shared Memory Packed 142 Shared Memory Spread 163 0 50 100 150 200 250 300 350 400 Tesla M2050 Fermi Global Memory 85 Shared Memory Packed 322 Shared Memory Spread 367 0 50 100 150 200 250 300 350 400 Tesla K40 Kepler Σχ. 4.32: Αποτελέσ ματα speedup υλοποίησ ης Shared Memory για γράφο μεγέθους 8192 8192 Στο Σχήμα 4.33 φαίνονται σ υγκεντρωμένοι οι χρόνοι των υλοποιήσ εων Global Memory και Shared Memory για κάθε κάρτα γραφικών. Για να υπάρχει ένα μέτρο σ ύγκρισ ης, η καλύτερη υλοποίησ η για επεξεργασ τές (Tiled with OpenMP tasks, B = 128) σ το σ ύσ τημα Sandy Bridge (με 32 threads) για τον ίδιο γράφο έχει χρόνο εκτέλεσ ης ίσ ο με 9,21 sec. 25 Shared Memory Implementation Time 20 Time sec 15 10 5 0 Global Memory Shared Memory Packed Shared Memory Spread Tesla M2050 Fermi 22,86 8,13 7,11 Tesla K40 Kepler 13,61 3,59 3,15 Σχ. 4.33: Χρόνοι εκτέλεσ ης υλοποίησ ης Shared Memory για γράφο μεγέθους 8192 8192

4.2. Yλοποίησ η σ ε κάρτες γραφικών 109 4.2.4. Shared Memory υλοποίησ η χωρίς περιορισ μό μνήμης κάρτας γραφικών Λόγω της θεαματικής αύξησ ης σ τις επιδόσ εις της Shared Memory υλοποίησ ης έναντι της Global Memory, κρίνεται σ ημαντική η επέκτασ η της Shared Memory υλοποίησ ης ώσ τε το μέγισ το μέγεθος του πίνακα να μην εξαρτάται από τη μνήμη DRAM της κάρτας γραφικών. Η τεχνική του tiling έχει ήδη χρησ ιμοποιηθεί ανάμεσ α σ την shared και σ την global memory για να επιτευχθούν οι υψηλές επιδόσ εις της Shared Memory υλοποίησ ης. Συνεπώς, δεν γίνεται να ακολουθηθεί ο ίδιος δρόμος που ακολουθήθηκε κατά την επέκτασ η της Global Memory υλοποίησ ης της Υποενότητας 4.2.2. Η εναλλακτική που προκύπτει είναι σ ε κάθε επανάληψη k των τριών σ ταδίων της τεχνικής tiling να αντιγράφονται τα tiles προς επεξεργασ ία από την κύρια μνήμη σ τη μνήμη DRAM της κάρτας γραφικών και μετά να καλείται η υλοποίησ η Shared Memory όπως περιγράφηκε σ την προηγούμενη υποενότητα. Μετά το πέρας της εκτέλεσ ης, τα αποτελέσ ματα να αντιγράφονται πίσ ω σ την κύρια μνήμη του σ υσ τήματος. Αναλυτικότερα, αρχικά αντιγράφονται και επεξεργάζονται τα tiles του πρώτου και του δεύτερου σ ταδίου και επισ τρέφονται τα αποτελέσ ματα σ την κύρια μνήμη του επεξεργασ τή. Στη σ υνέχεια, σ το τρίτο σ τάδιο της τεχνικής, τα tiles που πρέπει να υπολογισ τούν χωρίζονται σ ε όσ α κομμάτια είναι αναγκαίο ώσ τε να χωράνε σ τη μνήμη της κάρτας γραφικών. Διαδοχικά καθένα από αυτά αντιγράφεται σ την κάρτα γραφικών, γίνεται η επεξεργασ ία και επισ τρέφεται πίσ ω το αποτέλεσ μα. Η διαδικασ ία αυτή παρουσ ιάζεται σ χηματικά σ το Σχήμα 4.34. CPU Memory GPU Memory 1 st half of Stage III PCI Express 2 nd half of Stage III Σχ. 4.34: Υλοποίησ η Shared Memory χωρίς περιορισ μό μνήμης κάρτας γραφικών Το γεγονός ότι αφ ενός η μεταφορά δεδομένων μέσ ω του διαύλου PCI Express είναι αργή και αφ ετέρου το μέγεθος του tile είναι αρκετά μικρό, οδηγεί σ ε μεγάλο overhead κατά την ανταλλαγή των δεδομένων ανάμεσ α σ την κύρια μνήμη του σ υσ τήματος και σ τη μνήμη της κάρτας γραφικών. Στο Σχήμα 4.35 φαίνεται ο χρόνος της σ υγκεκριμένης υλοποίησ ης σ την κάρτα Tesla

110 Κεφάλαιο 4. Υλοποίησ η αλγορίθμου Floyd-Warshall M2050 για γράφο μεγέθους 36K 36K 4B = 5, 1 GB και για μέτρο σ ύγκρισ ης ο χρόνος της υλοποίησ ης Global Memory για τον ίδιο γράφο με tiles μεγέθους 12K 12K 4B = 576 MB. GPU Shared Memory sync 36K x 36K Tesla M2050 2000 1500 Time sec 1000 64.2 % 500 35.8 % 0 Global Memory 12K tiles Shared Memory Transfer overhead 24 1052 Execution time 2051 586 Σχ. 4.35: Χρόνος εκτέλεσ ης υλοποίησ ης Shared Memory χωρίς περιορισ μό μνήμης για γράφο μεγέθους 36K 36K σ την κάρτα Tesla M2050 Οπως ήταν αναμενόμενο, το μεγαλύτερο τμήμα του χρόνου καταναλώνεται σ τις μεταφορές δεδομένων. Ο τελικός χρόνος εκτέλεσ ης να είναι σ ημαντικά αυξημένος, πλησ ιάζοντας εκείνον της αρκετά λιγότερο αποδοτικής υλοποίησ ης Global Memory. Συνεπώς, κρίνεται απαραίτητη η μείωσ η του υψηλού overhead για να εκμεταλλευτούμε σ το έπακρον την ταχύτατη υλοποίησ η Shared Memory. Ασ ύγχρονη μεταφορά δεδομένων και εκτέλεσ η Η λύσ η σ το πρόβλημα του overhead έρχεται με την ασ ύγχρονη εκτέλεσ η kernels και μεταφορά δεδομένων που υποσ τηρίζουν οι κάρτες γραφικών και η πλατφόρμα CUDA. Στο Σχήμα 4.36 φαίνεται η διαδικασ ία που ακολουθείται σ ε κάθε σ τάδιο εκτέλεσ ης κάθε k επανάληψης της τεχνικής tiling, δηλαδή η αντιγραφή των δεδομένων από την κύρια μνήμη του σ υσ τήματος σ την κάρτα γραφικών (H2D), η επεξεργασ ία τους και η αντιγραφή του αποτελέσ ματος πίσ ω σ την κύρια μνήμη (D2H). cudamemcpy H2D kernel cudamemcpy D2H time Σχ. 4.36: Διαδικασ ία εκτέλεσ ης κάθε σ ταδίου tiling της υλοποίησ ης Shared Memory χωρίς περιορισ μό μνήμης

4.2. Yλοποίησ η σ ε κάρτες γραφικών 111 Για να είναι εφικτή η ασ ύγχρονη εκτέλεσ η και μεταφορά δεδομένων, πρέπει να χρησ ιμοποιηθούν τα λεγόμενα CUDA Streams. Ενα CUDA stream είναι μια σ ειρά από εντολές οι οποίες εκτελούνται σ την κάρτα γραφικών. Η σ ειρά με την οποία γίνονται issue τα streams από τον κώδικα που εκτελείται σ τον επεξεργασ τή είναι και η σ ειρά με την οποία θα ολοκληρωθεί η εκτέλεσ ή τους σ την κάρτα γραφικών. Ομως, ενώ οι εντολές που βρίσ κονται μέσ α σ ε ένα stream είναι εγγυημένο ότι θα εκτελεσ τούν με τη σ ειρά σ την οποία βρίσ κονται, τα streams μπορούν να εκτελούνται ταυτόχρονα, αρκεί να γίνεται σ εβασ τή η σ ειρά προτεραιότητας με βάσ η την οποία έγιναν issue. Η εκτέλεσ η ενός kernel ή η μεταφορά δεδομένων προς και από την κάρτα γραφικών μπορούν να αποτελέσ ουν ξεχωρισ τά streams. Συνεπώς, τα δεδομένα που πρέπει να επεξεργασ τούν σ την κάρτα γραφικών χωρίζονται σ ε μικρότερα διαδοχικά τμήματα. Ετσ ι, τόσ ο η διαδικασ ία μεταφοράς όσ ο και η εκτέλεσ η του kernel χωρίζονται σ ε αντίσ τοιχα τμήματα, όπως φαίνεται σ το Σχήμα 4.37a. Κάθε τέτοιο τμήμα αποτελεί ξεχωρισ τό CUDA stream και γίνεται issue με τη σ ειρά. Copy Engine Copy Engine Kernel Engine Kernel Engine H2D H2D Synchronous no overlapping Synchronous no overlapping Kernel Kernel D2H D2H H2D H2D 1 1 H2D H2D 2 2 H2D H2D 3 3 H2D H2D 4 4 1 1 (a) 2 2 3 3 4 4 D2H D2H 1 1 D2H D2H 2 2 D2H D2H 3 3 D2H D2H 4 4 Copy Engine Copy Engine Kernel Engine Kernel Engine H2D H2D 1 1 H2D H2D 2 2 1 1 Asynchronous Single Copy Engine Asynchronous Single Copy Engine H2D H2D D2H D2H D2H D2H H2D 3 H2D 4 D2H 1 D2H 2 D2H 3 D2H 4 3 4 1 2 3 4 2 3 4 2 3 4 (b) Copy Engine H2D Copy Engine H2D Kernel Engine Kernel Engine Copy Engine D2H Copy Engine D2H H2D H2D 1 1 H2D H2D 1 1 H2D H2D 2 2 1 1 Asynchronous Dual Copy Engine Asynchronous Dual Copy Engine H2D H2D H2D H2D H2D H2D H2D 3 H2D 4 H2D 5 H2D 6 H2D 7 H2D 8 3 4 5 6 7 8 2 3 4 5 6 2 3 4 5 6 D2H D2H D2H D2H D2H D2H 1 D2H 2 D2H 3 D2H 4 D2H 5 1 2 3 4 5 7 7 D2H D2H 6 6 Kernel Kernel Kernel Kernel (c) 8 8 D2H D2H 7 7 D2H D2H 8 8 D2H D2H 8 8 Σχ. 4.37: Ασ ύγχρονη εκτέλεσ η kernels και μεταφορά δεδομένων Το σ ωσ τό issue των streams εξασ φαλίζει τη σ ωσ τή εκτέλεσ η με ακριβώς το ίδιο αποτέλεσ μα σ α να γίνονταν όλα σ ύγχρονα και όχι ασ ύγχρονα. Με δεδομένη τη σ ειρά με την οποία τα strems γίνονται issue, ο τρόπος με τον οποίο θα εκτελεσ τούν είναι ευθύνη του δρομολογητή της κάρτας γραφικών και εξαρτάται από τον αριθμό των μηχανών αντιγραφής δεδομένων (copy engine) που διαθέτει η εκάσ τοτε κάρτα γραφικών. Οι απλές κάρτες γραφικών της εταιρίας Nvidia διαθέτουν μόνο μία μηχανή αντιγραφής η οποία χρησ ιμοποιείται είτε για μεταφορά από την κύρια μνήμη προς

112 Κεφάλαιο 4. Υλοποίησ η αλγορίθμου Floyd-Warshall την κάρτα CUDA γραφικών FW Sharedείτε Memory το ανάποδο, Tiled όπως φαίνεται σ το Σχήμα without 4.37b. GPU Αντίθετα, Memory sizeοι limitation επαγγελματικές κάρτες γραφικών Tesla και Quadro διαθέτουν δύο μηχανές αντιγραφής, ξεχωρισ τές για Proof of Concept κάθε κατεύθυνσ η μεταφοράς δεδομένων, όπως φαίνεται σ το Σχήμα 4.37c. Screenshot from Nvidia Visual Profiler Στο Σχήμα 4.38 φαίνεται εικόνα από το εργαλείο Nvidia Visual Profiler που αναλύει την εκτέλεσ η ενός προγράμματος σ την κάρτα γραφικών. Φαίνεται ξεκάθαρα η ασ ύγχρονη εκτέλεσ η των kernels και των αντιγραφών δεδομένων. Host to Device Queue Execution Queue Device to Host Queue Stage I kernel Stage II column kernel Stage II row kernel Stage III kernel Memory Transfers Σχ. 4.38: Εικόνα ασ ύγχρονης εκτέλεσ ης από το εργαλείο Nvidia Visual Profiler Μετρήσ εις Στο Σχήμα 4.39 φαίνεται ο χρόνος της ασ ύγχρονης υλοποίησ ης Shared Memory σ την κάρτα Tesla M2050 για τον ίδιο γράφο με προηγουμένως, διασ τάσ εων 36K 36K. Για μέτρο σ ύγκρισ ης σ υμπεριλαμβάνεται ο χρόνος εκτέλεσ ης της καλύτερης υλοποίησ ης για επεξεργασ τές (Tiled with OpenMP tasks, B = 128) σ το σ ύσ τημα Sandy Bridge. GPU Shared Memory without memory limit 36K x 36K Tesla M2050 2001 64.2 % overhead Time sec 1501 1001 11.2 % overhead 501 1 Global Memory 12K tiles Shared Memory sync Shared Memory async Sandy Bridge Tiled,32thr Transfer overhead 24 1052 74 0 Execution time 2051 586 586 1036 Σχ. 4.39: Χρόνος εκτέλεσ ης υλοποίησ ης Shared Memory χωρίς περιορισ μό μνήμης για γράφο μεγέθους 36K 36K σ την κάρτα Tesla M2050

4.2. Yλοποίησ η σ ε κάρτες γραφικών 113 Χάρη σ την ασ ύγχρονη εκτέλεσ η παρατηρείται σ ημαντική μείωσ η του overhead των μεταφορών δεδομένων που πλέον ανέρχεται σ το 11.2 % του σ υνολικού χρόνου εκτέλεσ ης, ποσ οσ τό που κρίνεται αποδεκτό. Σημαντικό πλεονέκτημα της σ υγκεκριμένης υλοποίησ ης είναι ότι μπορεί εύκολα να υποσ τηρίξει πολλαπλές κάρτες γραφικών και με σ ωσ τό σ υγχρονισ μό των αντιγραφών δεδομένων να παρουσ ιάζει πολύ καλή κλιμάκωσ η. Η κάρτα Tesla K40 έχει μεγάλη μνήμη DRAM μεγέθους 12 GB, οπότε ο γράφος διασ τάσ εων 36K 36K 4B = 5, 1 GB χωράει να εκτελεσ τεί αυτούσ ιος. Στο Σχήμα 4.40 φαίνονται οι χρόνοι εκτέλεσ ης των υλοποιήσ εων Global και Shared Memory με τον πίνακα αποθηκευμένο ολόκληρο σ τη μνήμη της κάρτας και ο χρόνος της ασ ύγχρονης υλοποίησ ης Shared Memory, προσ ομοιώνοντας την περίπτωσ η που ο γράφος δεν χωρούσ ε αυτούσ ιος σ τη μνήμη. GPU Shared Memory without memory limit 36K x 36K Tesla K40 1200 1000 Time sec 800 600 400 20.6 % overhead 200 0 Global Memory Shared Memory Shared Memory async Sandy Bridge Tiled,32thr Transfer overhead 0 0 70 0 Execution time 1213 270 270 1036 Σχ. 4.40: Χρόνος εκτέλεσ ης υλοποίησ ης Shared Memory χωρίς περιορισ μό μνήμης για γράφο μεγέθους 36K 36K σ την κάρτα Tesla K40 Παρατηρείται αυξημένο ποσ οσ τό overhead σ ε σ χέσ η με την Tesla M2050. Οταν η κάρτα γραφικών έχει δύο μηχανές αντιγραφής και η χρονική διάρκεια εκτέλεσ ης του kernel είναι μεγαλύτερη από αυτή της μίας αντιγραφής, τότε κατά τη διάρκεια σ υνεχόμενων εκτελέσ εων όλες οι μεταφορές δεδομένων εκτός από την πρώτη και την τελευταία «κρύβονται» αφού πραγματοποιούνται ταυτόχρονα με την εκτέλεσ η του kernel, όπως φαίνεται σ το Σχήμα 4.37c. Κατά την εκτέλεσ η ενός σ ταδίου της τεχνικής tiling της υλοποίησ ης Shared Memory, η διάρκεια εκτέλεσ ης του kernel είναι μεγαλύτερη από αυτή μίας αντιγραφής σ την κάρτα Tesla M2050. Αντίθετα, σ την κάρτα Tesla K40 είναι μικρότερη, αφού η αύξησ η της επεξεργασ τικής ισ χύος της είναι μεγαλύτερη από την αντίσ τοιχη αύξησ η του εύρους ζώνης που προέκυψε από τη χρήσ η της έκδοσ ης 3.0 του διαύλου PCI Express. Για το λόγο αυτό προκύπτει το μεγαλύτερο ποσ οσ τό του overhead.

114 Κεφάλαιο 4. Υλοποίησ η αλγορίθμου Floyd-Warshall 4.2.5. Συγκεντρωτικά αποτελέσ ματα Στο Σχήμα 4.41 φαίνονται σ υγκεντρωμένοι οι χρόνοι εκτέλεσ ης για διάφορα μεγέθη γράφων των δύο υλοποιήσ εων Global και Shared Memory σ τις δύο κάρτες γραφικών και της υλοποίησ ης Tiled with OpenMP tasks σ το σ ύσ τημα Sandy Bridge. Eπισ ημαίνεται ότι σ το παρακάτω διάγραμμα ο κάθετος άξονας του χρόνου είναι σ ε λογαριθμική κλίμακα. 10000 ALL GPU IMPLEMENTATIONS 1000 100 TIME SEC 10 1,00 0,10 1 2K 4K 6K 8K 10K 12K 14K 16K 18K 20K 22K 24K 28K 32K 36K 40K 44K GRAPH SIZE Global Memory Tesla M2050 Global Memory Tesla K40 Sandy Bridge Tiled, 32thr Shared Memory Tesla M2050 Shared Memory Tesla K40 Σχ. 4.41: Χρόνοι εκτέλεσ ης υλοποιήσ εων Global και Shared Memory Παρατηρείται αμέσ ως η εξαιρετική απόδοσ η της Shared Memory υλοποίησ ης και η σ ημαντική υπεροχή της αρχιτεκτονικής Kepler έναντι της αρχιτεκτονικής Fermi. Για καλύτερη σ ύγκρισ η των υλοποιήσ εων και των αρχιτεκτονικών, σ την Ενότητα 4.4 φαίνεται η αξιολόγησ η των επιδόσ εων σ ε σ χέσ η με την κατανάλωσ η και το κόσ τος αγοράς. Μετρήσ εις με χρήσ η αριθμών διπλής ακρίβειας 64 bit Στο Σχήμα 4.42 φαίνονται οι αντίσ τοιχοι χρόνοι εκτέλεσ ης του Σχήματος 4.41 με χρήσ η αριθμών κινητής υποδιασ τολής διπλής ακρίβειας (double precision 64 bit) για την αναπαράσ τασ η του πίνακα γειτνίασ ης του γράφου. Επίσ ης, για καλύτερη σ ύγκρισ η, σ το Σχήμα 4.43 φαίνονται οι χρόνοι εκτέλεσ ης των δύο υλοποιήσ εων Global και Shared Memory με χρήσ η αριθμών απλής και διπλής ακρίβειας για κάθε μία από τις δύο κάρτες γραφικών.

4.2. Yλοποίησ η σ ε κάρτες γραφικών 115 1000 ALL GPU IMPLEMENTATIONS DOUBLE PRECISION 64 BIT 100 10 TIME SEC 1,00 0,10 1 2K 4K 6K 8K 10K 12K 14K 16K GRAPH SIZE Global Memory Tesla M2050 Shared Memory Tesla M2050 Global Memory Tesla K40 Shared Memory Tesla K40 Sandy Bridge Tiled, 32thr Σχ. 4.42: Χρόνοι εκτέλεσ ης υλοποιήσ εων Global και Shared Memory με χρήσ η αριθμών διπλής ακρίβειας 64 bit 1000 GPU IMPLEMENTATIONS FLOAT 32 BIT VS DOUBLE 64 BIT TESLA M2050 1000 GPU IMPLEMENTATIONS FLOAT 32 BIT VS DOUBLE 64 BIT TESLA K40 100 100 10 10 TIME SEC 1,00 TIME SEC 1,00 0,10 0,10 1 2K 4K 6K 8K 10K 12K 14K 16K GRAPH SIZE Global Memory Float 32bit Global Memory Double 64bit Shared Memory Float 32bit Shared Memory Double 64bit (a) 1 2K 4K 6K 8K 10K 12K 14K 16K GRAPH SIZE Global Memory Float 32bit Global Memory Double 64bit Shared Memory Float 32bit Shared Memory Double 64bit (b) Σχ. 4.43: Σύγκρισ η χρόνων εκτέλεσ ης υλοποιήσ εων Global και Shared Memory για αριθμούς απλής και διπλής ακρίβειας

116 Κεφάλαιο 4. Υλοποίησ η αλγορίθμου Floyd-Warshall 4.3. Υλοποίηση στον Intel Xeon Phi Η τρίτη και τελευταία αρχιτεκτονική η οποία εξετάζεται είναι η αρχιτεκτονική Intel MIC σ την οποία βασ ίζεται ο σ υνεπεξεργασ τής Intel Xeon Phi. Χρησ ιμοποιείται το Native Execution μοντέλο εκτέλεσ ης κατά το οποίο οι εφαρμογές μεταγλωττίζονται και εκτελούνται εγγενώς σ τη σ υσ κευή. Λόγω της περιορισ μένης διάρκειας πρόσ βασ ης σ τη σ υσ κευή, σ κοπός της παρούσ ας διπλωματικής εργασ ίας είναι η επιβεβαίωσ η ή μη ενός από τα βασ ικά επιχειρήματα προώθησ ης της σ υσ κευής, δηλαδή η αποδοτική εκτέλεσ η σ τον Xeon Phi ήδη υλοποιημένων προγραμμάτων για επεξεργασ τές. Θα αξιολογηθούν οι επιδόσ εις των υλοποιήσ εων του αλγορίθμου Floyd-Warshall που αναπτύχθηκαν για σ υσ τήματα επεξεργασ τών σ την Ενότητα 4.1, με μικρές αλλαγές ώσ τε να εκτελούνται πιο αποδοτικά σ τη σ υσ κευή. Το μέγεθος γράφου επιλέγεται ίσ ο με 2048 2048 κόμβους. Η σ υσ κευή Intel Xeon Phi 5120D σ την οποία υπήρχε πρόσ βασ η διαθέτει 60 x86 πυρήνες, οπότε ο μέγισ τος αριθμός threads που υποσ τηρίζει είναι ίσ ος με 240 threads. Τέλος, σ ε όλες τις υλοποιήσ εις εφαρμόζεται vectorization και επιλέγεται «scatter» κατανομή των threads μέσ ω της enviromental variable KMP _AF F INIT Y του μεταγλωττισ τή της Intel, αφού με εκείνη προκύπτουν οι καλύτεροι χρόνοι εκτέλεσ ης. Οι διάφορες κατανομές που υποσ τηρίζονται φαίνονται σ το Σχήμα 4.44. compact 1 2 3 4 5 6 7 8 balanced 1 2 3 4 5 6 7 8 scatter 1 5 2 6 3 7 4 8 Σχ. 4.44: Διαφορετικές κατανομές threads του Intel Compiler Σειριακή υλοποίησ η Αρχικά, αξιολογείται η απλή σ ειριακή υλοποίησ η των τριών loops της Υποενότητας 4.1.1, παραλληλοποιημένη ομοίως με χρήσ η OpenMP parallel for. Στο Σχήμα 4.45 φαίνονται τα αποτελέσ ματα του χρόνου εκτέλεσ ης και του speedup.

4.3. Υλοποίησ η σ τον Intel Xeon Phi 117 erial with parallel for 2048x2048 2 Time Serial with parallel for 2048x2048 Time 35,0 Serial with parallel for 2048x2048 35,0 Speedup Serial with parallel for 2048x2048 S 18,0 3 3 16,0 14,0 25,0 25,0 TIME SEC 12,0 1 8,0 SPEEDUP 2 15,0 SPEEDUP 2 15,0 6,0 1 1 4,0 2,0 5,0 5,0 2 4 8 16 32 60 120 180 240 4 8 16 32 60 120 180 240 (a) 2 4 8 16 32 60 120 180 2 2404 8 16 32 60 1 (b) Σχ. 4.45: Αποτελέσ ματα μετρήσ εων σ ειριακής υλοποίησ ης σ τον Xeon Phi για γράφο μεγέθους 2048 2048 Αναδρομική υλοποίησ η Η αναδρομική υλοποίησ η της Υποενότητας 4.1.2 υλοποιημένη με OpenMP tasks εμφάνισ ε εξαιρετικά μεγάλους χρόνους εκτέλεσ ης, γεγονός που εξηγείται από το σ ημαντικό κομμάτι κώδικα που εκτελείται σ ειριακά. Για το λόγο αυτό, τροποποιείται η υλοποίησ η με tasks και εφαρμόζεται παραλληλοποίησ η με parallel for σ τη σ υνάρτησ η FWI του Κώδικα 4.2. Η σ υγκεκριμένη υλοποίησ η δοκιμάσ τηκε και εμφάνισ ε χειρότερο χρόνο εκτέλεσ ης σ τα σ υσ τήματα επεξεργασ τών και σ υνεπώς για εκείνα προτιμήθηκε η υλοποίησ η με tasks. Τα αποτελέσ ματα φαίνονται σ το Σχήμα 4.46. ursive with parallel for 2048x2048 TimeRecursive with parallel for 2048x2048 Time 10 4 Recursive with parallel for 2048x2048 4 Speedup Recursive with parallel for 2048x2048 35,0 35,0 3 3 25,0 25,0 TIME SEC 1 SPEEDUP 2 SPEEDUP 2 15,0 15,0 1 1 5,0 5,0 1,0 2 4 8 16 32 60 120 180 240 4 8 16 32 60 120 180 240 2 4 8 16 32 60 120 180 2 240 8 16 32 60 1 1024 512 256 1024 512 256 (a) 1024 512 256 (b) 1024 512 Σχ. 4.46: Αποτελέσ ματα μετρήσ εων αναδρομικής υλοποίησ ης σ τον Xeon Phi για γράφο μεγέθους 2048 2048

118 Κεφάλαιο 4. Υλοποίησ η αλγορίθμου Floyd-Warshall Tiled υλοποίησ η Τέλος, δοκιμάσ τηκαν οι δύο tiled υλοποιήσ εις της Υποενότητας 4.1.3. Τις καλύτερες επιδόσ εις εμφάνισ ε η tiled υλοποίησ η παραλληλοποιημένη με OpenMP tasks, τα αποτελέσ ματα της οποίας φαίνονται σ το Σχήμα 4.47. d with tasks 2048x2048 Time 10 Tiled with tasks 2048x2048 Time 6 Tiled with tasks 2048x2048 Speedup 6 Tiled with tasks 2048x2048 Speedup 5 5 4 4 TIME SEC 1 SPEEDUP 3 SPEEDUP 3 2 2 1 1 1,0 4 8 16 32 60 120 180 240 4 8 16 32 60 120 180 240 2 4 8 16 32 60 120 180 2 240 8 16 32 60 120 8 64 32 16 128 64 32 16 (a) 128 64 32 16 (b) 128 64 32 1 Σχ. 4.47: Αποτελέσ ματα μετρήσ εων tiled υλοποίησ ης σ τον Xeon Phi για γράφο μεγέθους 2048 2048 Συγκεντρωτικά αποτελέσ ματα Στον Πίνακα 4.6 φαίνονται οι καλύτεροι χρόνοι εκτέλεσ ης κάθε υλοποίησ ης που αναφέρθηκε παραπάνω. (Graph size 2K 2K) Global Memory (M2050) Shared Memory (M2050) Global Memory (K40) Shared Memory (K40) Sandy Bridge (Tiled, 32 thr) Xeon Phi (Serial, 120 thr) Xeon Phi (Recursive, 120 thr) Xeon Phi (Tiled, 60 thr) Time 0,43 sec 0,13 sec 0,25 sec 8 sec 0,26 sec 0,56 sec 1,46 sec 1,47 sec Πίν. 4.6: Χρόνοι εκτέλεσ ης όλων των υλοποιήσ εων σ τον Xeon Phi για γράφο μεγέθους 2048 2048

4.3. Υλοποίησ η σ τον Intel Xeon Phi 119 Τέλος, σ το Σχήμα 4.48 φαίνονται οι χρόνοι εκτέλεσ ης των καλύτερων υλοποιήσ εων από κάθε αρχιτεκτονική που έχει αναπτυχθεί σ την παρούσ α διπλωματική εργασ ία (CPU, GPU, Xeon Phi) για τον αλγόριθμο Floyd-Warshall και για διάφορα μεγέθη γράφων με χρήσ η αριθμών απλής ακρίβειας (32 bit). 1000 BEST IMPLEMENTATIONS 100 10 TIME SEC 1,00 0,10 1 2K 4K 6K 8K 10K 12K 14K 16K 18K 20K 22K 24K GRAPH SIZE Tesla M2050 Shared Memory Tesla K40 Shared Memory Xeon Phi Serial parallel for Tesla K40 Global Memory Sandy Bridge Tiled, 32thr Xeon Phi Recursive, B 2048 Σχ. 4.48: Χρόνοι εκτέλεσ ης των καλύτερων υλοποιήσ εων από κάθε αρχιτεκτονική του αλγορίθμου Floyd Warshall Παρατηρείται ότι η αναδρομική υλοποίησ η σ τον Xeon Phi με μέγεθος block B = 2048 εμφανίζεται εν τέλει καλύτερες επιδόσ εις από την απλή υλοποίησ η των 3 loops. Ομως, παραμένει σ ημαντικά πιο αργή από τις καλύτερες υλοποιήσ εις τόσ ο για κάρτες γραφικών όσ ο και για σ υσ τήματα επεξεργασ τών, με την Shared Memory υλοποίησ η σ την κάρτα Tesla K40 να είναι με μεγάλη διαφορά η ταχύτερη. Ετσ ι, σ ύμφωνα με τα παραπάνω αποτελέσ ματα, δεν επιβεβαιώνεται το επιχείρημα της εταιρίας Intel για την αποδοτική εκτέλεσ η σ τον Xeon Phi ήδη γραμμένων προγραμμάτων. Φυσ ικά, αν αφιερωθεί ο χρόνος ώσ τε να γίνουν οι απαραίτητες βελτισ τοποιήσ εις τότε σ ίγουρα οι επιδόσ εις σ τον Xeon Phi θα είναι πολύ καλύτερες. Ομως, αυτό ξεφεύγει από το σ κοπό της παρούσ ας διπλωματικής εργασ ίας. Τέλος, σ το διάγραμμα σ υμπεριλαμβάνονται τα αποτελέσ ματα της Global Memory υλοποίησ ης σ την κάρτα Tesla K40. Ο λόγος είναι η καλύτερη σ ύγκρισ η ανάμεσ α σ την κάρτα γραφικών και τον Xeon Phi αφού ο χρόνος ανάπτυξης της σ υγκεκριμένης υλοποίησ ης (Global Memory) βρίσ κεται σ ε σ υγκρίσ ιμο επίπεδο με τις αντίσ τοιχες (serial, recursive) για τον Xeon Phi. Επίσ ης, τη σ τιγμή που γράφονται αυτές οι γραμμές, η αρχιτεκτονική Kepler είναι ο ισ χυρότερος ανταγ-

120 Κεφάλαιο 4. Υλοποίησ η αλγορίθμου Floyd-Warshall ωνισ τής του Xeon Phi σ την αγορά του HPC. Υπό αυτή την οπτική γωνία, τα αποτελέσ ματα μπορούν να κριθούν (έως ένα βαθμό) σ υγκρίσ ιμα. 4.4. Συμπεράσματα Ο αλγόριθμος Floyd-Warshall σ ε κάθε επανάληψη εκτελεί δύο πράξεις: μία σ ύγκρισ η και μία πρόσ θεσ η. Συνεπώς, για μέγεθος γράφου ίσ ο με N N, σ τη χειρότερη περίπτωσ η εκτελούνται σ υνολικά 2 N 3 πράξεις κινητής υποδιασ τολής. Προκειμένου να αντληθούν χρήσ ιμα σ υμπεράσ ματα από τη σ ύγκρισ η των αρχιτεκτονικών επεξεργασ τών και καρτών γραφικών, υπολογίζεται η επίδοσ η κάθε υλοποίησ ης σ ε FLOP/s (floating point operations per second) με βάσ η τα αποτελέσ ματα για γράφους μεγέθους από 8K 8K έως 24K 24K με χρήσ η αριθμών κινητής υποδιασ τολής απλής ακρίβειας (32 bit). Στο Σχήμα 4.49 φαίνεται το διάγραμμα των επιδόσ εων σ ε GFLOP/s των υλοποιήσ εων σ τις δύο κάρτες γραφικών και σ το καλύτερο σ ύσ τημα επεξεργασ τών Intel Sandy Bridge. Performance algorithm Floyd Warshall Intel Sandy Bridge 4P Tiled, 32thr 145 Nvidia Tesla K40 Shared Memory 365 Nvidia Tesla K40 Global Memory 83 Nvidia Tesla M2050 Shared Memory 154 Nvidia Tesla M2050 Global Memory 48 0 50 100 150 200 250 300 350 400 GFLOP/s Σχ. 4.49: Επιδόσ εις σ ε GFLOP/s (single precision 32 bit) Στο παραπάνω διάγραμμα δεν σ υμπεριλαμβάνονται το σ ύσ τημα επεξεργασ τών Dunnington λόγω παλαιότητας της πλατφόρμας και ο σ υνεπεξεργασ τής Xeon Phi, καθώς κρίνεται άδικη η σ ύγκρισ ή του με τις υπόλοιπες αρχιτεκτονικές αφού δεν αφιερώθηκε χρόνος για τη βελτισ τοποίησ η των υλοποιήσ εών του. Παρατηρείται για ακόμα μια φορά η υπεροχή της Shared Memory υλοποίησ ης για κάρτες γραφικών. Ακόμα και η παλαιότερη γενιά καρτών Fermi κατάφερε να εμφανίσ ει καλύτερες επιδόσ εις από το σ ύσ τημα επεξεργασ τών Sandy Bridge. Ομως, η επίτευξη τέτοιων αποτελεσ μάτων «κόσ τισ ε» αρκετά σ ε χρόνο. Για να αναπτυχθεί η σ υγκεκριμένη υλοποίησ η απαιτήθηκε απόκτησ η βαθιάς γνώσ ης και εξοικείωσ ης με το hardware και το software της πλατφόρμας Nvidia CUDA. Αντίθετα, η υλοποίησ η Global Memory, αν και επίσ ης απαιτεί καλή γνώσ η της πλατφόρμας CUDA, χρειάσ τηκε λιγότερο χρόνο για την ανάπτυξή της. Ομως, οι επιδόσ εις της είναι σ ημαντικά μειωμένες και αρκετά χαμηλότερες από το σ ύσ τημα Sandy Bridge.

4.4. Συμπεράσ ματα 121 Για καλύτερη αξιολόγησ η των διαφορετικών αρχιτεκτονικών, ακολουθεί σ τo Σχήμα 4.50 διάγραμμα των επιδόσ εων σ ε σ χέσ η με την κατανάλωσ η. Η κατανάλωσ η σ ε Watt κάθε αρχιτεκτονικής λαμβάνεται από τους επίσ ημους πίνακες προδιαγραφών (όπως φαίνονται σ την Ενότητα 2.4). Performance per Watt algorithm Floyd Warshall Nvidia Tesla K40 Shared Memory Nvidia Tesla M2050 Shared Memory Intel Sandy Bridge 4P Tiled, 32thr Nvidia Tesla K40 Global Memory Nvidia Tesla M2050 Global Memory 0,2 0,4 0,6 0,8 1,0 1,2 1,4 1,6 GFLOPS/watt Σχ. 4.50: Επιδόσ εις σ ε σ χέσ η με την κατανάλωσ η Τέλος, σ το Σχήμα 4.51 φαίνεται διάγραμμα των επιδόσ εων σ ε σ χέσ η με το κόσ τος αγοράς. Από το σ υγκεκριμένο διάγραμμα σ τόχος δεν είναι η ακριβής αποτύπωσ η της σ ύγκρισ ης ανάμεσ α σ τις δύο αρχιτεκτονικές, αφού οι τιμές πώλησ ης δεν παραμένουν σ ταθερές και φυσ ικά υπάρχουν σ ημαντικές διαφορές ανάλογα με τον αριθμό τεμαχίων αγοράς. Οι τιμές αγοράς των τεσ σ άρων επεξεργασ τών Sandy Bridge λαμβάνονται από τον επίσ ημο τιμοκατάλογο της εταιρίας Intel. Για αγορά 1000 τεμαχίων, κάθε επεξεργασ τής κοσ τίζει περίπου $1600, σ υνεπώς όλοι μαζί κοσ τίζουν $6400. Η κάρτα γραφικών Tesla M2050 είναι παλαιότερης γενιάς και δεν παράγεται πλέον από την εταιρία. Σαν τιμή αγοράς δεν λαμβάνεται η αυξημένη αρχική τιμή πώλησ ης αλλά η τωρινή τιμή πώλησ ης σ ε γνωσ τό κατάσ τημα της Αμερικής, η οποία είναι ίσ η με $1300. Τέλος, η τιμή αγοράς της Tesla K40 λαμβάνεται από τον μέσ ο όρο γνωσ τών κατασ τημάτων της Αμερικής, δηλαδή ίσ η με $5000.

122 Κεφάλαιο 4. Υλοποίησ η αλγορίθμου Floyd-Warshall Performance per Dollar algorithm Floyd Warshall Nvidia Tesla M2050 Shared Memory Nvidia Tesla K40 Shared Memory Nvidia Tesla M2050 Global Memory Intel Sandy Bridge 4P Tiled, 32thr Nvidia Tesla K40 Global Memory 0 20 40 60 80 100 120 140 MFLOPS/dollar Σχ. 4.51: Επιδόσ εις σ ε σ χέσ η με το κόσ τος αγοράς

Κεφάλαιο 5 Υλοποίησ η αλγορίθμου LU Decomposition 5.1. Yλοποίηση σε συστήματα πολλαπλών επεξεργαστών Ομοια με τον αλγόριθμο Floyd-Warshall (FW), ακολουθούν τρεις διαφορετικές υλοποιήσ εις για σ υσ τήματα πολλαπλών επεξεργασ τών που έχουν παραλληλοποιηθεί με χρήσ η του OpenMP. Μεταγλωττίζονται με χρήσ η του Intel C Compiler 14.0 και με επίπεδο βελτισ τοποιήσ εων -Ο3. Χρησ ιμοποιούνται ειδικές εντολές οδηγιών προς τον μεταγλωττισ τή της Intel για διανυσ ματοποίησ η (vectorization) όπου είναι εφικτό. Διεξάγονται μετρήσ εις σ τα δύο σ υσ τήματα που αναφέρθηκαν σ την Υποενότητα 2.4.1 και χρησ ιμοποιείται πίνακας μεγέθους 4096 4096 σ τοιχείων (ώσ τε να μη χωράει ολόκληρος σ τη μνήμη cache), όπως φαίνεται σ το Σχήμα 5.1. Ο πίνακας μεγέθους 2048 2048 σ τοιχείων εμφάνισ ε αντίσ τοιχα αποτελέσ ματα με αυτά του αλγορίθμου FW για γράφο μεγέθους 2048 2048 κόμβων και για τον λόγο αυτό δεν περιλαμβάνονται μετρήσ εις. Τα σ τοιχεία του πίνακα αναπαρίσ τανται σ τη μνήμη με τύπο double, δηλαδή με αριθμούς κινητής υποδιασ τολής διπλής ακρίβειας (64 bit). Τα εκτελέσ ιμα που προορίζονται για το σ ύσ τημα με επεξεργασ τές Dunnington μεταγλωττίζονται με υποσ τήριξη των SIMD εντολών SSE 4.1 ενώ εκείνα που προορίζονται για το σ ύσ τημα με επεξεργασ τές Sandy Bridge με υποσ τήριξη των SIMD εντολών AVX. CPU Implementations CPU Systems Test cases Serial 3 loops with OpenMP parallel for Recursive with OpenMP Tasks Dunnington 24 cores 4096 x 4096 elements Tiled with OpenMP Tasks Tiled with OpenMP Tasks and Intel MKL Sandy Bridge 32 cores 4096 x 4096 elements Σχ. 5.1: Παράλληλες υλοποιήσ εις αλγορίθμου LU Decomposition για σ υσ τήματα επεξεργασ τών 5.1.1. Σειριακή υλοποίησ η Αρχικά, παραλληλοποιείται η απλή σ ειριακή υλοποίησ η του αλγορίθμου, όπως φαίνεται σ τον Κώδικα 5.1. Με κατάλληλη οδηγία προς τον μεταγλωττισ τή γίνεται vectorization των εσ ωτερικών loop του κώδικα.

124 Κεφάλαιο 5. Υλοποίησ η αλγορίθμου LU Decomposition Κώδικας 5.1 Απλή σ ειριακή υλοποίησ η αλγορίθμου LU Decomposition # pragma omp parallel firstprivate ( k) for (k =0;k<N -1; k ++) { # pragma omp for for (i=k +1;i<N;i ++) A[i][k] = A[i][k]/A[k][k]; } # pragma omp for private ( j) for (i=k +1;i<N;i ++) for (j=k +1;j<N;j ++) A[i][j]-=A[i][k]*A[k][j]; Αποτελέσ ματα Dunnington Στο Σχήμα 5.2 φαίνονται τα διαγράμματα χρόνου και speedup των μετρήσ εων σ το σ ύσ τημα Dunnington για τον πίνακα διασ τάσ εων 4096 4096 για τις διάφορες κατανομές που περιγράφηκαν σ την Ενότητα 4.1. Ο πίνακας καταλαμβάνει χώρο σ τη μνήμη ίσ ο με 4096 4096 8B = 128M B. l 4096x4096 Time 10 Serial 4096x4096 Time 5,0 Serial 4096x4096 Speedup 5,0 Serial 4096x4096 Speedu 9 4,5 4,5 8 4,0 4,0 7 3,5 3,5 6 3,0 3,0 TIME SEC 5 4 SPEEDUP 2,5 2,0 SPEEDUP 2,5 2,0 3 1,5 1,5 2 1,0 1,0 1 0,5 0,5 (a) (b) Σχ. 5.2: Αποτελέσ ματα μετρήσ εων απλής σ ειριακής υλοποίησ ης LU Decomposition σ το σ ύσ τημα Dunnington Παρατηρείται σ χεδόν η ίδια εικόνα με εκείνη του αλγορίθμου FW λόγω της ίδιας φύσ ης του αλγορίθμου LU Decomposition, δηλαδή των χωρίς χωρική τοπικότητα προσ βάσ εων σ τη μνήμη. Αρχικά, κακή κλιμάκωσ η του αλγορίθμου όσ ο αυξάνεται ο αριθμός των threads. Στις packed κατανομές οι επιδόσ εις είναι σ ημαντικά χειρότερες από τις αντίσ τοιχες spread επειδή η σ υνολικά διαθέσ ιμη κρυφή μνήμη είναι αρκετά μικρότερη. Τέλος, σ τις κατανομές different_l2 οι επιδόσ εις είναι καλύτερες από τις αντίσ τοιχες same_l2 λόγω του ίδιου φαινομένου.

5.1. Yλοποίησ η σ ε σ υσ τήματα πολλαπλών επεξεργασ τών 125 Αποτελέσ ματα Sandy Bridge Serial 4096x4096 Time 8 Serial 4096x4096 Time 1,6 Serial 4096x4096 Speedup 1,6 Serial 4096x4096 Speedup 7 1,4 1,4 6 1,2 1,2 5 1,0 1,0 TIME SEC 4 SPEEDUP 0,8 SPEEDUP 0,8 3 0,6 0,6 2 0,4 0,4 1 0,2 0,2 (a) (b) Σχ. 5.3: Αποτελέσ ματα μετρήσ εων απλής σ ειριακής υλοποίησ ης LU Decomposition σ το σ ύσ τημα Sandy Bridge Οπως ήταν αναμενόμενο, η εικόνα που παρατηρείται σ το σ ύσ τημα Sandy Bridge είναι η εξαιρετικά κακή κλιμάκωσ η του αλγορίθμου για τους λόγους που έχουν ήδη εξηγηθεί σ την αντίσ τοιχη παράγραφο της Υποενότητας 4.1.1 5.1.2. Αναδρομική υλοποίησ η Η memory bounded φύσ η του αλγορίθμου και ο μη ευνοϊκός (για την επαναχρησ ιμοποίησ η δεδομένων) τρόπος πρόσ βασ ης σ τα σ τοιχεία του πίνακα σ ε κάθε επανάληψη εξηγεί το γεγονός της κακής κλιμάκωσ ης του αλγορίθμου σ ε αρχιτεκτονικές μοιραζόμενης μνήμης. Συνεπώς, ομοίως με τον αλγόριθμο Floyd-Warshall, προτάθηκαν οι ίδιες δύο εναλλακτικές μέθοδοι υλοποίησ ης για καλύτερη εκμετάλλευσ η της κρυφής μνήμης, δηλαδή η αναδρομική και η tiled. Στο Σχήμα 5.4 φαίνεται ο τρόπος με τον οποίο χωρίζεται ο πίνακας σ ε κάθε επίπεδο της αναδρομής (με βάσ η μία δεδομένη τιμή μεγέθους του block) και η σ ειρά με την οποία γίνονται οι αναδρομικές κλήσ εις για την επεξεργασ ία κάθε υποπίνακα. Στον Κώδικα 5.2 φαίνεται ο πηγαίος κώδικας της αναδρομικής υλοποίησ ης παραλληλοποιημένης με τη χρήσ η OpenMP tasks σ ε όλα τα σ ημεία όπου αυτό είναι εφικτό. A00 A01 A00 A01 L00 U00 A01 L00 U00 A01 L00 U00 A01 A10 A11 A10 A11 A10 A11 A10 A11 A10 A11 Σχ. 5.4: Αναδρομική υλοποίησ η LU Decomposition

126 Κεφάλαιο 5. Υλοποίησ η αλγορίθμου LU Decomposition Αναλυτικότερα: Αναδρομικός υπολογισ μός της παραγοντοποίησ ης LU του υποπίνακα A 00. Επίλυσ η του σ υσ τήματος L 00 A 01 = A 01 ώσ τε να υπολογισ τεί ο υποπίνακας A 01. Η υλοποίησ η της επίλυσ ης (lower_solve()) είναι υλοποιημένη αναδρομικά και παραλληλοποιημένη με χρήσ η tasks. Ομοίως, επίλυσ η του σ υσ τήματος A 10 U 00 = A 10. Υπολογισ μός του σ υμπληρώματος schur (schur complement) A 11 = A 11 A 10 A 01. Η υλοποίησ η της σ υνάρτησ ης υπολογισ μού (schur()) είναι επίσ ης υλοποιημένη αναδρομικά και παραλληλοποιημένη με χρήσ η tasks. Τέλος, αναδρομικός υπολογισ μός της παραγοντοποίησ ης LU του υποπίνακα A 11. Κώδικας 5.2 Αναδρομική (recursive) υλοποίησ η αλγορίθμου LU Decomposition με OpenMP tasks LU_recursive(A): if (base case) LU_kernel(A); else { LU_recursive(A 00); #pragma omp task lower_solve(a 01,A 00); #pragma omp task upper_solve(a 10,A 00); #pragma omp taskwait schur(a 11,A 10,A 01); } LU_recursive(A 11); schur(a,v,w): if (base case) block_schur(a,v,w); else { #pragma omp task schur(a 00,V 00,W 00); #pragma omp task schur(a 01,V 00,W 01); #pragma omp task schur(a 10,V 10,W 00); #pragma omp task schur(a 11,V 10,W 01); #pragma omp taskwait } #pragma omp task schur(a 00,V 01,W 10); #pragma omp task schur(a 01,V 01,W 11); #pragma omp task schur(a 10,V 11,W 10); #pragma omp task schur(a 11,V 11,W 11); #pragma omp taskwait

5.1. Yλοποίησ η σ ε σ υσ τήματα πολλαπλών επεξεργασ τών 127 Αποτελέσ ματα Dunnington Στο Σχήμα 5.5 φαίνονται τα αποτελέσ ματα των μετρήσ εων της αναδρομικής υλοποίησ ης σ το σ ύσ τημα Dunnington για πίνακα διασ τάσ εων 4096 4096. Λαμβάνονται μετρήσ εις για διάφορες τιμές μεγέθους του block που κυμαίνονται από 512 512 σ τοιχεία έως 16 16 σ τοιχεία. cursive 4096x4096 Time 10 Recursive 4096x4096 Time 18,0 Recursive 4096x4096 Speedup 18,0 Recursive 4096x4096 S 16,0 16,0 14,0 14,0 1 12,0 12,0 TIME SEC SPEEDUP 1 8,0 SPEEDUP 1 8,0 1,0 6,0 6,0 4,0 4,0 2,0 2,0 0,1 256 128 64 32 16 512 256 128 64 32 16 512 256 128 64 32 16 512 256 128 6 (a) (b) Σχ. 5.5: Αποτελέσ ματα μετρήσ εων αναδρομικής υλοποίησ ης σ το σ ύσ τημα Dunnington Ομοια με τον αλγόριθμο FW, παρατηρείται σ ημαντική βελτίωσ η των χρόνων σ ε σ χέσ η με την απλή υλοποίησ η των τριών loops, τόσ ο σ τη σ ειριακή όσ ο και σ τις παράλληλες εκτελέσ εις. Ομως, λόγω του ότι είναι εφικτή η παραλληλοποίησ η κάθε σ ταδίου εκτέλεσ ης των αναδρομικών κλήσ εων, η αναδρομική υλοποίησ η του αλγορίθμου LU Decomposition εμφανίζει πολύ καλή κλιμάκωσ η, σ ε αντίθεσ η με την αντίσ τοιχη υλοποίησ η του FW. Τα καλύτερα αποτελέσ ματα προκύπτουν για μεγέθη block ίσ α με 32 32 8B = 8 KB και 64 64 8B = 32 KB, γεγονός αναμενόμενο αν ληφθεί υπ όψιν ότι η κρυφή μνήμη L1 έχει μέγεθος 32 KB. Αποτελέσ ματα Sandy Bridge Αντίσ τοιχα με προηγουμένως, σ το Σχήμα 5.6 φαίνονται τα αποτελέσ ματα των μετρήσ εων της αναδρομικής υλοποίησ ης σ το σ ύσ τημα Sandy Bridge.

128 Κεφάλαιο 5. Υλοποίησ η αλγορίθμου LU Decomposition ve 4096x4096 Time 10 Recursive 4096x4096 Time 2 Recursive 4096x4096 Speedup 2 Recursive 4096x4096 Speed 18,0 18,0 16,0 16,0 1 14,0 14,0 12,0 12,0 TIME SEC SPEEDUP 1 8,0 SPEEDUP 1 8,0 1,0 6,0 6,0 4,0 4,0 2,0 2,0 0,1 128 64 32 16 512 256 128 64 32 16 512 256 128 64 32 16 512 256 128 64 (a) (b) Σχ. 5.6: Αποτελέσ ματα μετρήσ εων αναδρομικής υλοποίησ ης σ το σ ύσ τημα Sandy Bridge Και σ ε αυτά τα αποτελέσ ματα παρατηρείται η ίδια σ υμπεριφορά που αναλύθηκε προηγουμένως για το σ ύσ τημα Dunnington, με τα καλύτερα αποτελέσ ματα χρόνου να προκύπτουν για τα ίδια μεγέθη block, με το block μεγέθους 32 32 να εμφανίζει λίγο καλύτερο χρόνο για 32 threads. 5.1.3. Tiled υλοποίησ η H δεύτερη εναλλακτική μέθοδος υλοποίησ ης για καλύτερη εκμετάλλευσ η της κρυφής μνήμης είναι γνωσ τή πλέον τεχνική του tiling. Στο Σχήμα 5.7 φαίνεται ο τρόπος με τον οποίο χωρίζεται ο πίνακας σ ε tiles μεγέθους B B και οι διαδοχικές εκτελέσ εις του αλγορίθμου για κάθε επανάληψη. Στην k οσ τή επανάληψη: Αρχικά, υπολογίζεται η παραγοντοποίησ η LU του διαγώνιου (k, k) tile (μαύρο του Σχήματος 5.7). Στη σ υνέχεια υπολογίζονται οι αντίσ τροφοι πίνακες L 1 kk και U 1 kk. Στη σ υνέχεια, ενημερώνονται τα tiles που βρίσ κονται σ την k οσ τή γραμμή και σ την k οσ τή σ τήλη (σ κούρο γκρι) ως εξής: A ki = L 1 kk A ki και A ik = A ik Ukk 1. Δηλαδή, υπάρχει εξάρτησ η δεδομένων από το αρχικό διαγώνιο tile που έχει ήδη ενημερωθεί. Οι ενημερώσ εις μπορούν να γίνουν παράλληλα και παραλληλοποιούνται με χρήσ η OpenMP tasks. Τέλος, ενημερώνονται τα υπόλοιπα tiles του πίνακα (ανοιχτό γκρι) ως εξής: A ij = A ij A ik A kj. Ομοίως με προηγουμένως, οι ενημερώσ εις μπορούν να γίνουν παράλληλα μεταξύ τους και παραλληλοποιούνται με χρήσ η OpenMP tasks.

5.1. Yλοποίησ η σ ε σ υσ τήματα πολλαπλών επεξεργασ τών 129 A00 A01 A02 A03 A10 A11 A12 A13 A20 A21 A22 A23 A30 A31 A32 A33 Β Σχ. 5.7: Εφαρμογή τεχνικής tiling σ τον αλγόριθμο LU Decomposition Στον Κώδικα 5.2 φαίνεται ο πηγαίος κώδικας της tiled παραλληλοποιημένης υλοποίησ ης του αλγορίθμου που περιγράφηκε παραπάνω. Κώδικας 5.3 Tiled υλοποίησ η αλγορίθμου LU Decomposition παραλληλοποιημένη με OpenMP tasks lu_tiled(a): range=n/b; for (k=0;k<range-1;k++) { lu_kernel(a kk ); l_inv=get_inv_l(a kk ); u_inv=get_inv_u(a kk ); for (i=k+1;i<range;i++) { #pragma omp task firstprivate(i) mm_lower(l_inv, A ki, A ki ); #pragma omp task firstprivate(i) mm_upper(a ik, u_inv, A ik ); #pragma omp taskwait } for (i=k+1;i<range;i++) #pragma omp task firstprivate(i) for (j=k+1;j<range;j++) mm(a ik, A ki, A ij ); } #pragma omp taskwait lu_kernel(a range 1,range 1 ); Αποτελέσ ματα Dunnington Στο Σχήμα 5.8 φαίνονται τα αποτελέσ ματα των μετρήσ εων της tiled υλοποίησ ης σ το σ ύσ τημα Dunnington για πίνακα διασ τάσ εων 4096 4096. Λαμβάνονται μετρήσ εις για διάφορες τιμές μεγέθους του block που κυμαίνονται από 512 512 σ τοιχεία έως 16 16 σ τοιχεία και για δύο διαφορετικές υλοποιήσ εις ανάλογα με τον τρόπο που έχουν παραλληλοποιηθεί οι πολλαπλασ ιασ μοί πινάκων. Οι σ υνεχόμενες γραμμές αφορούν την υλοποίησ η όπου παραλληλοποιούνται με OpenMP tasks. Αντίθετα, οι διακεκομμένες αφορούν την υλοποίησ η όπου οι πολλαπλασ ιασ μοί

130 Κεφάλαιο 5. Υλοποίησ η αλγορίθμου LU Decomposition πινάκων γίνονται με την πολύ αποδοτική σ υνάρτησ η cblas_dgemm() της βιβλιοθήκης Intel MKL (Math Kernel Library). tasks 4096x4096 Time Tiled with tasks 4096x4096 Time 18,0 Tiled with tasks 4096x4096 Speedup 18,0 Tiled with tasks 4096x4096 Sp 10 16,0 16,0 14,0 14,0 12,0 12,0 TIME SEC 1 SPEEDUP 1 8,0 SPEEDUP 1 8,0 6,0 6,0 4,0 4,0 2,0 2,0 1,0 256 256 128 128 512 512 256 256 128 128 32 32 16 16 64 64 32 32 16 16 (a) 512 512 256 256 128 128 512 512 256 256 64 64 32 32 16 16 64 64 32 32 (b) Σχ. 5.8: Αποτελέσ ματα μετρήσ εων tiled υλοποίησ ης σ το σ ύσ τημα Dunnington Παρατηρείται αμέσ ως ότι η υλοποίησ η με χρήσ η της βιβλιοθήκης MKL είναι σ ημαντικά πιο γρήγορη από την αντίσ τοιχη όπου οι πολλαπλασ ιασ μοί πινάκων παραλληλοποιούνται με χρήσ η tasks. Οι χρόνοι εκτέλεσ ης των spread κατανομών είναι αρκετά γρηγορότεροι από τους χρόνους των αντίσ τοιχων packed, λόγω μεγαλύτερης σ υνολικής μνήμης cache και περισ σ ότερου διαθέσ ιμου εύρους ζώνης προς τη μνήμη. Χαρακτηρισ τικό είναι ότι η spread κατανομή των 16 threads είναι γρηγορότερη των 24 threads. Τέλος, λόγω του ήδη υψηλού επιπέδου βελτισ τοποιήσ εων των σ υναρτήσ εων της σ υγκεκριμένης βιβλιοθήκης, η κλιμάκωσ η δεν είναι μεγάλη. Αντίθετα, σ την υλοποίησ η των πολλαπλασ ιασ μών με tasks παρατηρείται σ ημαντικά καλύτερη κλιμάκωσ η, γεγονός αναμενόμενο. Αποτελέσ ματα Sandy Bridge Στο Σχήμα 5.9 φαίνονται τα αποτελέσ ματα των μετρήσ εων της tiled υλοποίησ ης σ το σ ύσ τημα Sandy Bridge για τις δύο διαφορετικές παραλληλοποιήσ εις των πολλαπλασ ιασ μών πινάκων που αναφέρθηκαν προηγουμένως.

5.1. Yλοποίησ η σ ε σ υσ τήματα πολλαπλών επεξεργασ τών 131 with tasks 4096x4096 Time Tiled with tasks 4096x4096 Time 18,0 Tiled with tasks 4096x4096 Speedup 18,0 Tiled with tasks 4096x4096 10 16,0 16,0 14,0 14,0 TIME SEC 1 SPEEDUP 12,0 1 8,0 SPEEDUP 12,0 1 8,0 1,0 6,0 6,0 4,0 4,0 2,0 2,0 0,1 12 256 256 128 128 512 512 256 256 128 128 4 32 32 16 16 64 64 32 32 16 16 (a) 512 512 256 256 128 128 512 512 256 25 64 64 32 32 16 16 64 64 32 32 (b) Σχ. 5.9: Αποτελέσ ματα μετρήσ εων tiled υλοποίησ ης σ το σ ύσ τημα Sandy Bridge Αντίσ τοιχη εικόνα με προηγουμένως παρατηρείται και σ τα αποτελέσ ματα του σ υσ τήματος Sandy Bridge. Στην υλοποίησ η με χρήσ η της βιβλιοθήκης MKL ανάλογα με το μέγεθος του block εμφανίζονται διαφορετικές προτιμήσ εις ανάμεσ α σ ε spread και packed κατανομές, ανάλογα με την προτίμησ η σ ε μεγαλύτερο σ υνολικό μέγεθος cache και περισ σ ότερο bandwidth ή μικρότερο σ υνολικό μέγεθος cache και επαναχρησ ιμοποίησ ης των tiles λόγω μοιραζόμενης μνήμης cache. 5.1.4. Συγκεντρωτικά αποτελέσ ματα Στα Σχήματα 5.10 και 5.11 φαίνονται σ υγκεντρωμένα οι μετρήσ εις από όλες τις υλοποιήσ εις που εξετάσ τηκαν σ τις προηγούμενες υποενότητες σ τα δύο σ υσ τήματα. Για όσ ες υλοποιήσ εις περιέχουν blocking επιλέγονται τα μεγέθη block με τους καλύτερους χρόνους.

132 Κεφάλαιο 5. Υλοποίησ η αλγορίθμου LU Decomposition 10 All Implementations 4096x4096 Time TIME SEC 1 1,0 Serial with OpenMP Recursive, B 32 Tiled with tasks MKL, B 64 Recursive, B 64 Tiled with tasks, B 32 Σχ. 5.10: Συγκεντρωτικές μετρήσ εις για τον πίνακα των 4096 4096 σ τοιχείων σ το σ ύσ τημα Dunnington 10 All Implementations 4096x4096 Time 1 TIME SEC 1,0 0,1 Serial with OpenMP Recursive, B 32 Tiled with tasks, B 32 Tiled with tasks MKL, B 64 Recursive, B 64 Tiled with tasks, B 64 Tiled with tasks MKL, B 128 Σχ. 5.11: Συγκεντρωτικές μετρήσ εις για τον πίνακα των 4096 4096 σ τοιχείων σ το σ ύσ τημα Sandy Bridge Στο σ ύσ τημα Dunnington, η tiled υλοποίησ η με χρήσ η της βιβλιοθήκης MKL εμφανίζει ξεκάθαρα τις καλύτερες επιδόσ εις. Αντίθετα, σ το σ ύσ τημα Sandy Bridge η εικόνα είναι πιο σ ύνθετη. Συνεπώς, προκειμένου να σ χηματισ τεί μια ολοκληρωμένη εικόνα και επίσ ης να αξιολογηθούν οι επιδόσ εις για μεγαλύτερους πίνακες σ το σ ύσ τημα Sandy Bridge, δοκιμάζονται οι δύο καλύτερες υλοποιήσ εις για διάφορα μεγέθη πινάκων και για τα καλύτερα μεγέθη block. Τα αποτελέσ ματα φαίνονται σ τo Σχήμα 5.12.

5.2. Yλοποίησ η σ ε κάρτες γραφικών 133 30 BEST IMPLEMENTATIONS 4096X4096 TIME SANDY BRIDGE 32 THREADS 25 20 TIME SEC 15 10 5 0 1K 2K 4K 6K 8K 10K 12K 14K ARRAY SIZE Recursive, B 64 Recursive, B 32 Tiled with tasks MKL, B 512 Tiled with tasks MKL, B 64 Tiled with tasks MKL, B 512, 16 thr Spread Σχ. 5.12: Χρόνοι εκτέλεσ ης των καλύτερων υλοποιήσ εων LU Decomposition σ το σ ύσ τημα Sandy Bridge Παρατηρείται ότι με μικρή διαφορά η καλύτερη υλοποίησ η σ το σ ύσ τημα Sandy Bridge είναι η αναδρομική με μέγεθος block B = 64. 5.2. Yλοποίηση σε κάρτες γραφικών Στην ενότητα αυτή παρουσ ιάζεται η υλοποίησ η του αλγορίθμου LU Decomposition για κάρτες γραφικών. Σε αντίθεσ η με τον αλγόριθμο Floyd-Warshall, αναπτύχθηκε μόνο υλοποίησ η όπου ο πίνακας αποθηκεύεται ολόκληρος σ τη μνήμη DRAM της κάρτας γραφικών και δεν γίνεται χρήσ η της on-chip shared memory, δηλαδή η απλή «Global Memory» υλοποίησ η. Φυσ ικά, αν και δεν κρίθηκε σ κόπιμο για το σ κοπό της παρούσ ας διπλωματικής εργασ ίας, είναι εφικτή η εφαρμογή της τεχνικής του tiling και σ τον αλγόριθμο LU Decomposition. Συνεπώς, μπορούν να αναπτυχθούν οι ίδιες υλοποιήσ εις με αυτές που αναπτύχθηκαν για τον αλγόριθμο Floyd-Warshall, με τα αντίσ τοιχα θετικά αποτελέσ ματα. Ομοια με την Ενότητα 4.2, για την αξιολόγησ η της απόδοσ ης χρησ ιμοποιείται πίνακας μεγέθους 8192 8192 σ τοιχείων. Επίσ ης, χρησ ιμοποιούνται αριθμοί διπλής ακρίβειας (64 bit). Συνεπώς, ο γράφος που εξετάζεται έχει μέγεθος 8192 8192 8B = 512 MB. Ο υπολογισ μός του speedup γίνεται έχοντας ως βάσ η το σ ειριακό χρόνο εκτέλεσ ης σ το σ ύσ τημα που φιλοξενεί την κάρτα γραφικών Tesla M2050 του απλού αλγορίθμου με τα 3 loops που αναλύθηκε σ την Υποενότητα 5.1.1. Η μεταγλώττισ η του προγράμματος του απλού αλγο-

134 Κεφάλαιο 5. Υλοποίησ η αλγορίθμου LU Decomposition ρίθμου γίνεται με τον compiler GCC έκδοσ ης 4.6.3 με επίπεδο βελτισ τοποιήσ εων -O3 και Ο χρόνος που χρειάζεται για να επεξεργασ τεί το γράφο των 8192 κόμβων είναι 350, 05 sec. 5.2.1. Global Memory υλοποίησ η Ο πίνακας μεγέθους N N μεταφέρεται ολόκληρος σ τη μνήμη DRAM της κάρτας γραφικών. Δημιουργούνται δύο kernels. Ο ένας υπολογίζει το πρώτο απλό for loop εντός του εξωτερικού k loop του αλγορίθμου με τα 3 loops της Υποενότητας 5.1.1. Ο δεύτερος υπολογίζει το διπλό for loop που ακολουθεί. Οι kernels εκτελούνται ο ένας μετά τον άλλον για κάθε k και μετά την ολοκλήρωσ η της εκτέλεσ ης το αποτέλεσ μα αντιγράφεται σ την κύρια μνήμη του σ υσ τήματος. Ομοια με τις υλοποιήσ εις του αλγορίθμου FW, το καλύτερο block είναι το οριζόντιο μίας διάσ τασ ης. Κάθε block περιέχει 256 threads, διότι έτσ ι επιτυγχάνεται 100% χρήσ η των SM/SMX των καρτών γραφικών. Αντίθετα όμως με τον αλγόριθμο FW, το μέγεθος του grid δεν είναι σ ταθερό για όλες τις k επαναλήψεις αλλά μειώνεται σ υνεχώς σ ε κάθε επανάληψη, όπως φαίνεται σ το Σχήμα 5.13. Λόγω του γεγονότος αυτού, δεν είναι αποδοτική η υλοποίησ η όπου κάθε thread υπολογίζει παραπάνω από ένα σ τοιχεία του πίνακα που απέχουν απόσ τασ η ίσ η με το μέγεθος του block, όπως ήταν εφικτό σ την υλοποίησ η 1D Block - 4 elements per thread του αλγορίθμου FW σ την Υποενότητα 4.2.1. Σχ. 5.13: Κατανομή blocks της υλοποίησ ης Global Memory του αλγορίθμου LU Decomposition Στον Κώδικα 4.8 φαίνεται η υλοποίησ η των δύο kenrels και οι κλήσ εις τους από το κύριο πρόγραμμα που εκτελείται σ τον επεξεργασ τή καθώς και η τροποποίησ η του μεγέθους του grid σ ε κάθε k επανάληψη.