Presentation is loading. Please wait.

Presentation is loading. Please wait.

Τσόλκας Χρήστος & Αντωνίου Χρυσόστομος

Similar presentations


Presentation on theme: "Τσόλκας Χρήστος & Αντωνίου Χρυσόστομος"— Presentation transcript:

1 Τσόλκας Χρήστος & Αντωνίου Χρυσόστομος
VECTOR PROCESSING Τσόλκας Χρήστος & Αντωνίου Χρυσόστομος

2 Contents Introduction Vector Processor Definition
Components & Properties of Vector Processors Advantages/Disadvantages of Vector Processors Vector Machines & Architectures Virtual Processors Model Vectorization Inhibitors Improving Performance Vector Metrics Applications

3 Architecture Classification
SISD Single Instruction Single Data SIMD Single Instruction Multiple Data MIMD Multiple Instruction Multiple Data MISD Multiple Instruction Single Data Υπάρχουν πολλοί δυνατοί τρόποι να περιγράψουμε υπολογιστικά συστήματα. Κατά καιρούς έχουν προταθεί πολυάριθμες κατηγοριοποιήσεις, ανάλογα με τα χαρακτηριστικά στα οποία κάθε φορά δίδεται έμφαση. Η πιο συνήθης από όλες είναι η ταξινόμηση κατά Flynn. Η τελευταία χωρίζει τις μηχανές ανάλογα με Τον αριθμό των ροών εντολών (instruction streams) που υπάρχουν Τον αριθμό των ροών δεδομένων (data streams) Με τον όρο «ροή εντολών» εννοούμε τους διακριτούς και ανεξάρτητους δρόμους ελέγχου και κατάστασης (path of control and state). Αυτό σημαίνει ότι κάθε ροή εντολών έχει τον δικό της μετρητή προγράμματος (program counter) και τους δικούς της καταχωρητές. Με τον όρο ροή δεδομένων εννοούμε τα ανεξάρτητα τμήματα πληροφοριών. Ένας πίνακας που περιέχει δεδομένα μπορεί να αντιμετωπιστεί ως μια σειρά από πολλές και ξεχωριστές ροές δεδομένων. Τόσο οι εντολές (instructions Ι) όσο και τα δεδομένα (data D) μπορούν να χαρακτηριστούν ως μονά (single S) ή πολλαπλά (multiple M). Συνεπώς προκύπτουν τέσσερις δυνατοί συνδυασμοί: SISD: Μια και μόνο ροή εντολών εκτελείται χρησιμοποιώντας μόνο μια ροή δεδομένων. Σε αυτήν την περίπτωση ανήκουν παραδοσιακοί CISC καθώς και οι superscalar επεξεργαστές SIMD: Μια και μόνο ροή εντολών εκτελείται χρησιμοποιώντας πολλαπλές ροές δεδομένων παράλληλα. Χαρακτηριστικές υλοποιήσεις αυτής της κατηγορίας είναι οι vector αρχιτεκτονικές MISD: Δεν υπάρχουν αξιόλογες αρχιτεκτονικές βασισμένες σε αυτό το συνδυασμό. MIMD: Πολλές ανεξάρτητες ροές εντολών εκτελούνται χρησιμοποιώντας συνδρομικά, η κάθε μια την αντίστοιχή της ροή δεδομένων. Χαρακτηριστικά παράδειγμα αυτής της κατηγορίας είναι οι παράλληλοι υπολογιστές (που χρησιμοποιούνται λόγου χάρη στην μοντελοποίηση του κλίματος της γης). Εξίσου γνωστή υλοποίηση αυτής της αρχιτεκτονικής είναι υπολογιστές που έχουν δύο Pentium επεξεργαστές στην ίδια μητρική. Εδώ πρέπει να τονιστεί ότι η ροές δεδομένων είναι γνωστές στον προγραμματιστή. Κάποιος που γράφει ένα πρόγραμμα για μια μηχανή MIMD πρέπει να συντάξει περισσότερα από ένα νήματα εκτέλεσης (ροές εντολών) και να εξασφαλίσει ότι ο χειρισμός των δεδομένων γίνεται σωστά. Σε έναν superscalar επεξεργαστή πολλαπλές εντολές μπορούν να εκτελεστούν ταυτόχρονα σε διαφορετικά block δεδομένων χωρίς όμως ο προγραμματιστής να έχει τη δυνατότητα να επέμβει. Γιατί όμως υπάρχουν τόσες διαφορετικές ταξινομήσεις? Το ενδιαφέρον της κατηγοριοποιήσεως των υπολογιστικών συστημάτων έγκειται στο ότι με αυτόν τον τρόπο γίνονται πιο κατανοητές οι δυνατότητες και οι περιορισμοί της κάθε αρχιτεκτονικής. Η ταξινόμηση του Flynn είναι από τις πιο γνωστές και χρησιμοποιείται πιο πολύ από όλες τις υπόλοιπες κατηγοριοποιήσεις. Ο λόγος είναι ότι είναι πολύ απλή. Δυστυχώς όμως είναι χοντροκομμένη (coarse) με αποτέλεσμα να έχει εμπλουτιστεί κατά καιρούς ώστε να καλύπτει και τις τελευταίες τεχνολογικές εξελίξεις.

4 Alternative Forms of Machine Parallelism
Instruction Level Parallelism (ILP) Thread Level Parallelism (TLP) vector Data Parallelism (DP) Αρχιτέκτονες υπολογιστών έχουν υλοποιήσει αρκετές μορφές παραλληλισμού με σκοπό να πετύχουν μεγαλύτερη αύξηση στην απόδοση από αυτήν που έχει σημειωθεί με τις βελτιώσεις στα ηλεκτρονικά κυκλώματα . Το pipelining ήταν η πρώτη και πιο απλή μορφή παραλληλισμού. Σήμερα χρησιμοποιείται σε όλα τα υπολογιστικά συστήματα. Πέρα από το pipelining υπάρχουν και άλλα σχήματα που μπορούν να πετύχουν παραλληλισμό αυξάνοντας τη συνολική απόδοση. Αυτά μπορούν να χωριστούν σε τρεις κατηγορίες: Instruction Level Parallelism (ILP), Thread Level Parallelism (TLP) και vector Data Parallelism (DP)

5 Alternative Forms of Machine Parallelism
Instruction Level Parallelism (ILP): Εδώ εκτελούνται ταυτόχρονα περισσότερες από μια εντολές μιας ροής εντολών (instruction stream). Superscalar υπολογιστές έχουν τη δυνατότητα να υλοποιούν τον παραλληλισμό εντολών (ILP) από μια βαθμωτή (scalar) δέσμη εντολών. Thread Level Parallelism (TLP): Στην περίπτωση αυτή εκτελούνται ταυτόχρονα πολλά νήματα εντολών. Μηχανές με πολλούς επεξεργαστές εκμεταλλεύονται την TLP αναθέτοντας ανεξάρτητα νήματα σε ξεχωριστούς επεξεργαστές. vector Data Parallelism (DP): Η ίδια λειτουργία πραγματοποιείται σε μια σειρά από στοιχεία. Vector μηχανές εκμεταλλεύονται την παραλληλοποίηση δεδομένων (DP) πραγματοποιώντας πολλές ομοιογενείς λειτουργίες σε ένα vector στα πλαίσια μιας vector εντολής την ίδια χρονική στιγμή. Αυτές οι μορφές παραλληλίας δεν αποκλείουν η μια την άλλη. Αυτό σημαίνει ότι μια μηχανή μπορεί να ενσωματώσει και τις τρεις τεχνολογίες έτσι ώστε να πετύχει την μέγιστη δυνατή αύξηση ταχύτητας. Για παράδειγμα ο NEC SX-4 vector υπερυπολογιστής έχει pipelined-superscalar-vector-multiprocessor αρχιτεκτονική αξιοποιώντας όλες τις προαναφερθείσες μορφές παραλληλοποίησης. Η λιγότερο ευέλικτη από όλες είναι η DP. Κάθε παραλληλοποίση που επιτυγχάνεται με την τελευταία μπορεί να υλοποιηθεί με τις ILP και TLP. Για παράδειγμα ένας superscalar υπολογιστής μπορεί να εκτελέσει DP λειτουργίες προγραμματίζοντας πολλές ανεξάρτητες εντολές να εκτελούνται παράλληλα, ενώ μια μηχανή με πολλούς επεξεργαστές μπορεί να αναθέσει σε αυτούς τις ίδιες εντολές σε μια σειρά από δεδομένα. Ακριβώς όμως αυτή η δυσκινησία είναι που προσδίδει στην DP το χαρακτηριστικό της απλότητας και την αναδεικνύει ως την πιο φτηνή υλοποίηση παραλληλοποίησης. Μια data parallel μηχανή χρειάζεται να φέρει στον πυρήνα και να αποκωδικοποιήσει μία και μοναδική εντολή για να περιγράψει μια ολόκληρη ακολουθία από παράλληλες εντολές. Αυτό ελαττώνει την control logic complexity. Ένα ακόμη πλεονέκτημα της DP τεχνικής είναι ότι η απόδοσή της αυξάνεται όσο επεκτείνεται η παραλληλοποίηση. Στην ILP η πιθανότητα αλληλεξάρτησης των εντολών αυξάνεται δραματικά όταν μεγαλώνει ο αριθμός των εντολών που εκτελούνται παράλληλα, πράγμα που θέτει έναν μεγάλο περιορισμό στην αύξηση της απόδοσης με την εκτέλεση περισσότερων εντολών παράλληλα. Όμοια στην TLP το overhead για το συγχρονισμό και επικοινωνία των εντολών μεταξύ διαφορετικών νημάτων αυξάνεται δραματικά καθιστώντας ασύμφορη μια τέτοια προσέγγιση. Γι’ αυτόν το λόγο οι vector μηχανές έχουν καλύτερη απόδοση σε παράλληλους κώδικες από τις ILP και TLP.

6 Drawbacks of ILP and TLP
Coherency Synchronization Large Overhead instruction fetch and decode: at some point, its hard to fetch and decode more instructions per clock cycle cache hit rate: some long-running (scientific) programs have very large data sets accessed with poor locality; others have continuous data streams (multimedia) and hence poor locality Από τις προαναφερθείσες μορφές παραλληλισμού οι ILP και TLP παρουσιάζουν ορισμένα σημαντικά μειονεκτήματα. Πρώτα απ’ όλα, όσο περισσότερες είναι οι εντολές που εκτελούνται ταυτόχρονα στην ILP ή αντίστοιχα όσο περισσότερα νήματα εξάγονται από την TLP τόσο δυσκολότερος είναι ο συντονισμός των διεργασιών που πραγματοποιούνται. Είναι δύσκολο από την πλευρά του προγραμματιστή να κατακερματίσει την εφαρμογή έτσι ώστε η πρόσβαση στα δεδομένα να γίνεται με συνέπεια και ασφάλεια. Ακόμη και όταν πετυχαίνεται κάτι τέτοιο το overhead που απαιτείται για να εξασφαλιστεί η σωστή εκτέλεση των εντολών είναι αρκετά μεγάλο, πράγμα που θέτει ένα άνω φράγμα στην αύξηση της συνολικής απόδοσης του επεξεργαστή. Η κατάσταση επιβαρύνεται αν λάβομε υπ’ όψη το γεγονός ότι από κάποιο σημείο και μετά είναι δύσκολο να φέρουμε και να αποκωδικοποιήσουμε ακόμη περισσότερες εντολές στον επεξεργαστή σε έναν και μοναδικό κύκλο ρολογιού. Τέλος, σε επιστημονικές εφαρμογές ο επεξεργαστής δουλεύει σε έναν μεγάλο όγκο δεδομένων. Η εκτέλεση του προγράμματος δηλαδή δεν περιορίζεται σε ένα μικρό τμήμα της μνήμης. Το ίδιο συμβαίνει στις multimedia εφαρμογές, όπου ο όγκος των πληροφοριών φτάνει και την τάξη των GB. Αυτό όμως σημαίνει την αδυναμία αξιοποίησης της λανθάνουσας μνήμης, με αποτέλεσμα οι τα τεχνικές ILP και TLP να είναι ανεπαρκείς.

7 Alternative: Vector Processors
Με γνώμονα το τελευταίο προτάθηκε το μοντέλο του vector επεξεργαστή. Οι pielined και οι superscalar υπολογιστές ονομάζονται και μονοεπεξεργαστικά (uniprocessor) συστήματα. Αυτό σημαίνει ότι οι επεξεργαστές αυτοί έχουν ένα νήμα εκτέλεσης. Με άλλα λόγια διαθέτουν μόνο έναν μετρητή προγράμματος (program counter). Οι Vector υπολογιστές διαθέτουν και αυτοί έναν μόνο επεξεργαστή με αποτέλεσμα να μοιάζουν αρκετά στη φιλοσοφία με τους SISD υπολογιστές. Υπάρχει ένας και μοναδικός program counter, οι τυπικοί καταχωρητές οι λογικές μονάδες (functional units) κοκ. Η διαφορά έγκειται στο ότι μια vector μηχανή διαθέτει επιπρόσθετα vector καταχωρητές, vector λογικές μονάδες και vector εντολές που διαχειρίζονται vector δεδομένα. Μια τυπική μορφή ενός τέτοιου επεξεργαστή φαίνεται στο σχήμα της διαφάνειας. Εδώ είναι εμφανής η διαφορά μεταξύ μιας scalar και μιας vector μηχανής. Στην πρώτη περίπτωση προστίθενται δύο αριθμοί και το αποτέλεσμα αποθηκεύεται σε έναν τρίτο, ενώ στη δεύτερη περίπτωση γίνεται η ίδια διαδικασία πάνω όμως σε μια σειρά από αριθμούς.

8 What is a Vector Processor?
Provides high-level operations that work on vectors Vector is a linear array of numbers Type of number can vary, but usually 64 bit floating point (IEEE 754, 2’s complement) Length of the array also varies depending on hardware Example vectors would be 64 or 128 elements in length Small vectors (e.g. MMX/SSE) are about 4 elements in length Με τον όρο vector εννοούμε μια σειρά από στοιχεία- αριθμούς. Το μήκος της σειράς αυτής μπορεί να μεταβάλλεται από σύστημα σε σύστημα, ανάλογα με την εφαρμογή για την οποία προορίζεται η κάθε μηχανή. Συνήθως ο αριθμός των στοιχείων που συνθέτουν ένα vector κυμαίνεται μεταξύ 64 και 128 και κατά κανόνα το κάθε στοιχείο είναι τύπου 64 bit floating point. Αυτό όμως δεν αποκλείει τις υλοποιήσεις με vectors μικρού μεγέθους. Χαρακτηριστικό παράδειγμα είναι οι MMX επεκτάσεις που χρησιμοποιούνται στους εμπορικούς Pentium οι οποίες χρησιμοποιούν vectors που αποτελούνται από 4 στοιχεία.

9 Components of Vector Processor
Vector Registers Fixed length bank holding a single vector Has at least 2 read and 1 write ports Typically 8-32 vector registers, each holding bit elements Vector Functional Units Fully pipelined, start new operation every clock Typically 4-8 FUs: FP add, FP mult, FP reciprocal, integer add, logical, shift Scalar Registers Single element for FP scalar or address Load Store Units Τα στοιχεία που συνθέτουν έναν vector επεξεργαστή είναι: οι vector καταχωρητές, οι vector λειτουργικές μονάδες (vector functional units), μια σειρά από scalar καταχωρητές και οι μονάδες φόρτωσης και αποθήκευσης (load store units). Οι vector καταχωρητές έχουν τον ίδιο ρόλο με τους κοινούς καταχωρητές στα ήδη γνωστά υπολογιστικά συστήματα, με τη μόνη διαφορά ότι αποθηκεύουν και διοχετεύουν στον επεξεργαστή vector δεδομένα που αξιοποιούνται από τις εξειδικευμένες γι΄αυτόν το σκοπό εντολές. Τη μεταφορά μεταξύ της μνήμης και των καταχωρητών την αναλαμβάνουν οι μονάδες φόρτωσης και αποθήκευσης. Ο λόγος που υπάρχουν και scalar καταχωρητές είναι να εξυπηρετούν τις scalar εντολές που εκτελούνται επίσης από τον vector επεξεργαστή. Οι vector λογικές μονάδες πρέπει να είναι σε θέση να εκτελούν πράξεις κινητής υποδιαστολής πρόσθεση, αφαίρεση, πολλαπλασιασμό, διαίρεση ή αντιστροφή,ολίσθηση καθώς και λογικές πράξεις όπως σύγκριση κοκ. Η διαίρεση μπορεί να υλοποιηθεί με την αλληλουχία αντιστροφής και πολλαπλασιασμού (x/y=x*1/y). Ο λόγος που χρησιμοποιείται η αντιστροφή περισσότερο από την διαίρεση είναι ότι η πρώτη διασωληνώνεται (pipelined) πιο εύκολα και αποδοτικά

10 Components of Vector Processor

11 Vector Processor Properties
Computation of each result must be independent of previous results Single vector instruction specifies a great deal of work Equivalent to executing an entire loop Vector instructions must access memory in a known access pattern Many control hazards can be avoided since the entire loop is replaced by a vector instruction Για να μπορέσουν να αξιοποιηθούν οι πρόσθετες δυνατότητες του vector επεξεργαστή θα πρέπει σε κάθε κύκλο ρολογιού οι υπολογισμοί που πραγματοποιούνται να μην εξαρτώνται από προηγούμενα αποτελέσματα. Η μεγάλη δύναμη που έχουν οι vector επεξεργαστές όπως θα δούμε στη συνέχεια στα παραδείγματά μας είναι ότι μπορούν να αντικαταστήσουν απλούς βρόγχους με εντολές. Αυτό από μόνο του συντελεί στο να αποφευχθούν κίνδυνοι ελέγχου (control hazards) εξασφαλίζοντας τις προϋποθέσεις να αναπτυχθεί συμπαγής κώδικας με μικρότερες πιθανότητες σφαλμάτων. Για να γίνει αυτό θα πρέπει τα δεδομένα που βρίσκονται στην κύρια μνήμη σε ένα καθορισμένο μοτίβο. Το ιδανικό θα ήταν τα στοιχεία να βρίσκονταν σε γειτονικές θέσεις μνήμης

12 Advantages of Vector Processors
Increase in code density Decrease in total number of instructions Data is organized in patterns which is easier for the hardware to compute Simple loops are replaced with vector instructions, hence decrease in overhead Scalable Τα πλεονεκτήματα των vector επεξεργαστών είναι: Βελτίωση στην πυκνότητα του κώδικα: Η μείωση του αριθμού των εντολών που χρειάζονται να εκτελεστεί το πρόγραμμα έχει ως αποτέλεσμα την καλύτερη αξιοποίηση της cache μνήμης, όταν αυτή χρησιμοποιείται. Η μείωση στις αστοχίες στην cache επιφέρουν άμεσα αύξηση της ταχύτητας των υπολογισμών. Ελάττωση του αριθμού των εντολών που χρειάζεται να εκτελεστεί το πρόγραμμα: Αν διατηρηθούν όλοι οι άλλοι παράγοντες σταθεροί, η μείωση του συνολικού αριθμού των εντολών ενός προγράμματος έχει ως αποτέλεσμα τη μείωση του χρόνου εκτέλεσης του. Οργάνωση των δεδομένων σε patterns που μπορούν να αντιμετωπιστούν πιο αποτελεσματικά από το υλικό (hardware): Η vector οργάνωση των δεδομένων είναι πολύ χρήσιμη διότι μειώνει την αλληλεξάρτηση των δεδομένων κατά την εκτέλεση των εντολών (data dependencies). Αυτό σημαίνει ότι το hardware είναι πολύ πιο απλό σε σύγκριση με την out-of-order λογική, πετυχαίνοντας ταυτόχρονα ικανοποιητική παραλληλία Απλοί βρόγχοι μπορούν να αντικατασταθούν από απλές εντολές εξαλείφοντας έτσι το overhead του βρόγχου: Η εκτέλεση ενός βρόχου απαιτεί αρκετές διακοπές για την εκτέλεση των εντολών από τον επεξεργαστή καθώς και την ύπαρξη branch prediction. Επίσης, σε superscalar υπολογιστές η παραλληλία περιορίζεται από το γεγονός ότι οι εντολές μπορούν να σταλούν στον πυρήνα του επεξεργαστή με περιορισμένο ρυθμό. Τέλος είναι εξαιρετικά επεκτάσιμοι με αποτέλεσμα να μπορούν να προσαρμοστούν πιο εύκολα στις αυξανόμενες ανάγκες για υπολογιστική ισχύ και στις ιδιομορφίες της κάθε εφαρμογής.

13 Disadvantages of Vector Processors
Expansion of the Instruction Set Architecture (ISA) is needed Additional vector functional units and registers Modification of the memory system Οι vector επεξεργαστές δεν έχουν φυσικά μόνο πλεονεκτήματα. Τα κυριότερα αρνητικά τους είναι τα εξής: Επεκτάσεις-Τροποποιήσεις της αρχιτεκτονικής του σετ εντολών (Instruction Set Architecture ISA): Η το σετ εντολών θα πρέπει να καθοριστεί από την αρχή ώστε να υποστηρίζει τις vector λειτουργίες και δομές δεδομένων, ή θα πρέπει να προστεθούν στις ήδη υπάρχουσες εντολές, νέες ειδικά για vector λειτουργίες. Στην πρώτη περίπτωση το ήδη υπάρχον λογισμικό δε θα τρέχει, ενώ στη δεύτερη περίπτωση δε θα παρατηρηθεί καμία αύξηση στην ταχύτητα. Το μεγάλο πλεονέκτημα των super scalar υπολογιστών ήταν ότι η αρχιτεκτονική αυτή πετύχαινε αύξηση των επιδόσεων του ήδη υπάρχοντος κώδικα. Στην πράξη βέβαια αποδείχτηκε ότι αναθεωρημένοι compilers οι οποίοι είχαν γνώση της νέας αρχιτεκτονικής μπορούσαν να πετύχουν ακόμη καλύτερη ταχύτητα. Επεκτάσεις στις λογικές μονάδες και στους καταχωρητές: Αυτό στην αρχή σήμαινε σημαντική αύξηση στην επιφάνεια του chip του επεξεργαστή. Η παραγωγή VLSI συστημάτων κατέστησε σήμερα δυνατή την ύπαρξη πολύ μεγάλων vectors που περιέχουν αριθμούς με πολλά δεκαδικά ψηφία σε πολύ μικρή επιφάνεια. Επέκταση του συστήματος μνήμης: Αποτελεί στην πραγματικότητα ένα από τα πιο σημαντικά ζητήματα σε μια vector μηχανή. Πρόκειται ουσιαστικά για το διαθέσιμο εύρος ζώνης. Για να εκτελεστεί παράλληλα ένας μεγάλος αριθμός από οδηγίες σε μικρό χρονικό διάστημα θα πρέπει το σύστημα μνήμης να έχει διαθέσιμα όλα τα απαραίτητα δεδομένα εξίσου γρήγορα. Επίσης, η χρήση της cache δεν είναι ιδιαίτερα χρήσιμη στην περίπτωση των vector ή matrix δεδομένων. Αυτό συμβαίνει διότι η προσπέλαση των στοιχείων ενός vector ή ενός matrix γίνεται συχνά με έναν προκαθορισμένο τρόπο και στην πλειοψηφία των περιπτώσεων ανακαλείται ολόκληρη η γραμμή ή η στήλη. Έτσι όμως καταλήγουμε σε θέσεις μνήμης οι οποίες έχουν μια σταθερή απόσταση μεταξύ τους (stride). Αν η απόσταση αυτή και ο αριθμός των γραμμών της cache έχουν κοινό πολλαπλάσιο τότε όλα τα δεδομένα μπορούν να χαρτογραφηθούν σε ένα μικρό υποσύνολο των γραμμών της cache, πράγμα που δεν γίνεται συχνά. Γι’ αυτόν το λόγο η πλειοψηφία των vector συστημάτων δεν αποθηκεύει τα δεδομένα στην cache και τα φορτώνει απευθείας από την κύρια μνήμη.

14 Example Vector Machines
Machine Year Clock Regs Elements FUs LSUs Cray MHz Cray XMP MHz L, 1 S Cray YMP MHz L, 1 S Cray C MHz Cray T MHz Conv. C MHz Conv. C MHz Fuj. VP MHz NEC SX/ MHz 8+8K 256+var 16 8 NEC SX/ MHz 8+8K 256+var 16 8

15 Vector Instruction Execution
Static scheduling Prefetching Dynamic scheduling Ο κυριότερος περιορισμός στην απόδοση των vector μηχανών είναι το bandwidth της μνήμης. Για να διατηρήσουμε υψηλό το bandwidth της μνήμης πρέπει να εξασφαλίσουμε μια συνεχή ροή από κλήσεις προς αυτήν. Για να πετύχουμε υψηλό bandwidth μνήμης πρέπει να δημιουργήσουμε πολλές ανεξάρτητες κλήσεις προς την κύρια μνήμη. Τρεις είναι οι βασικές τεχνικές που χρησιμοποιούνται να αντιμετωπίσουν τις μεγάλες latencies της κύριας μνήμης. ·        Στατικός χρονοπρογραμματισμός (static scheduling). Έχει τις λιγότερες απαιτήσεις από πλευράς υλικού. Το πρόγραμμα παρεμβάλλει ανεξάρτητες εντολές ανάμεσα στο φόρτωμα δεδομένων και στην εκτέλεση εντολών που χρησιμοποιούν τα δεδομένα αυτά. Με αυτόν τον τρόπο η μηχανή μπορεί να εκτελέσει ανεξάρτητες εντολές την ώρα που γίνεται ανάκληση δεδομένων από την κύρια μνήμη. Οι vector εντολές είναι μια μορφή στατικού χρονοπρογραμματισμού, αφού μια εντολή πραγματοποιεί πολλές ανεξάρτητες λειτουργίες στα δεδομένα ενός vector. ·        Prefetching. Μπορεί να υλοποιηθεί τόσο μέσω του υλικού όσο και του λογισμικού. Και στις δυο περιπτώσεις τα απαιτούμενα δεδομένα ανακαλούνται από την κύρια μνήμη πριν εκτελεστεί η εντολή load, πράγμα που μειώνει την ορατή από τον χρήστη latency. Σχήματα που χρησιμοποιούν prefetching χρειάζονται καταχωρητές στους οποίους αποθηκεύονται τα δεδομένα πριν αυτά ζητηθούν από την εντολή load. Το prefetching μέσω software δεν εμπλέκει το υλικό της μηχανής. Το πρόγραμμα εκτελεί τις αντίστοιχες εντολές και αποθηκεύει τα δεδομένα στην λανθάνουσα μνήμη (cache). Οι τεχνικές prefetching μέσω hardware επιχειρούν να προβλέψουν μελλοντικές κλήσεις βασιζόμενες σε προηγούμενα patterns. Δυναμικός χρονοπρογραμματισμός ( Dynamic scheduling). Υλοποιείται με μια πολλές τεχνικές μέσω hardware οι οποίες εκτελούν εντολές out of order. Αντί να μπλοκάρεται η κατάσταση της μηχανής σε μια εντολή όταν οι τελεστές της δεν είναι ακόμη διαθέσιμοι, γίνεται αποθήκευσή της σε έναν καταχωρητή μέχρι να βρεθούν τα απαραίτητα δεδομένα. Έτσι η μηχανή είναι σε θέση να εκτελέσει άλλες ανεξάρτητες εντολές που βρίσκονται πιο μπροστά στη ροή εντολών (instruction stream).

16 Styles of Vector Architectures
Memory-memory vector processors All vector operations are memory to memory CDC Star 100 Vector-register processors All vector operations between vector registers Vector equivalent of load-store architecture Includes all vector machines since late 1980s Cray, Convex, Fujitsu, Hitachi, NEC Υπάρχουν δύο βασικές φιλοσοφίες στην vector αρχιτεκτονική, ανάλογα με τη θέση των vector operands. Οι αρχιτεκτονικές memory-memory, διαθέτουν εντολές που εκτελούνται σε vectors που βρίσκονται στην κύρια μνήμη, διαβάζουν τα αρχικά δεδομένα και γράφουν τα αποτελέσματα σε αυτήν. Oι αρχιτεκτονικές Vector-register, όπως η σειρά Cray και όλοι οι υπερυπολογιστές που σχεδιάστηκαν στην Ιαπωνία , κάνουν την ίδια δουλειά χρησιμοποιώντας vector καταχωρητές. Ξεχωριστές εντολές load και store αναλαμβάνουν την μεταφορά δεδομένων μεταξύ κύριας μνήμης και καταχωρητών. Οι vector register αρχιτεκτονικές έχουν πολλά πλεονεκτήματα σε σύγκριση με τους memory-memory. Η δεύτερη πρέπει να γράψει όλα τα ενδιάμεσα αποτελέσματα στην κύρια μνήμη και μετά να ανακτήσει εκ νέου από αυτήν. Η vector-register αρχιτεκτονική μπορεί να κρατήσει τα ενδιάμεσα αποτελέσματα στους καταχωρητές, κοντά στις vector functional units περιορίζοντας απαιτήσεις σε προσωρινή αποθήκευση, bandwidth μνήμης και ελαττώνοντας την καθυστέρηση μεταξύ των εντολών (inter instruction latency). Αν πολλές vector εντολές χρειάζονται ένα vector- αποτέλεσμα, στην memory-memory αρχιτεκτονική αυτό πρέπει να φορτωθεί ισάριθμες φορές από τη μνήμη, ενώ στην vector-register αρχιτεκτονική γίνεται κλήση στον καταχωρητή που το περιέχει, αποφεύγοντας τις πολλαπλές προσπελάσεις της μνήμης. Για τους παραπάνω λόγους οι vector register μηχανές αποδείχτηκαν αποδοτικότερες από τις memory-memory.

17 Vector-Register Architecture
Στη διαφάνεια φαίνονται τα βασικά στοιχεία μιας Vector-Register υλοποίησης. Επάνω αριστερά διακρίνουμε την κύρια μνήμη του συστήματος. Παρατηρούμε ότι οι functional units (οι οποίες εκτελούν πρόσθεση αφαίρεση πολλαπλασιασμό σύγκριση κοκ) δεν επικοινωνούν άμεσα με τη μνήμη. Αντ’ αυτού όπως άλλωστε είδαμε προηγουμένως παρεμβάλλονται vector αλλά και scalar καταχωρητές. Αυτοί χάρη στη Vector load and store unit ανακαλούν τις πληροφορίες που χρειάζονται οι functional units για να κάνουν τους υπολογισμούς που απαιτεί κάθε εφαρμογή.

18 Memory operations Load/store operations move groups of data between registers and memory Three types of addressing Unit stride access Fastest Non-unit (constant) stride access Indexed (gather-scatter) Vector equivalent of register indirect Increases number of programs that vectorize Οι μονάδες φόρτωσης και αποθήκευσης μπορούν να προσπελάσουν την μνήμη με τρεις διαφορετικούς τρόπους. Όταν τα δεδομένα βρίσκονται σε συνεχόμενες θέσεις στη μνήμη, τότε ο τρόπος ανάκλησης ονομάζεται unit stride access. Στην περίπτωση που αυτά έχουν μεταξύ τους μια σταθερή μετατόπιση, τότε έχουμε non-unit stride access. Τέλος αν οι θέσεις των στοιχείων που αναζητά η μηχανή για να σχηματίσει ένα vector περιγράφονται σε έναν άλλο vector, τότε μιλάμε για indexed ή (gather scatter) τεχνικές. Από τα παραπάνω πιο γρήγορη είναι η unit stride access. Οι συνθήκες όμως που πρέπει να πληρούνται είναι αρκετά αυστηρές με αποτέλεσμα να μην εφαρμόζεται τόσο συχνά στην πράξη. Ο indexed είναι η γενικότερη από όλες και χρησιμοποιείται συχνά για να αυσματοποιήσουμε εφαρμογές που με την βοήθεια των δύο πρώτων τεχνικών θα ήταν αδύνατο. 32

19 Vector Stride Position of the elements we want in memory may not be sequential Consider following code: Do 10 I=1, 100 Do 10 j =1, 100 A(I,j) = 0.0 Do 10 k =1,100 A(I,j) = A(I,j) + B(I,k)*C(k,j) 10 Continue Ας υποθέσουμε τώρα ότι θέλουμε να υπολογίσουμε το γινόμενο δύο πινάκων μήκους 100x100. Η πράξη αυτή υλοποιείται με τον αλγόριθμο που φαίνεται στην διαφάνεια. Στον εσωτερικό βρόχο γίνεται η ο πολλαπλασιασμός των γραμμών του πίνακα B με τις στήλες του πίνακα C. Αν προσέξουμε την τελευταία γραμμή του βρόγχου αυτού θα διαπιστώσουμε ότι κάθε φορά που αυξάνεται το κ μεταπηδάμε και σε μια νέα στήλη του Β και σς μια νέα γραμμή του C. Άρα τα στοιχεία που χρειάζονται για την πράξη αυτή μπορούν να είναι συνεχόμενα στη μνήμη (stride 1). Δε συμβαίνει το ίδιο και για τις γραμμές του Β ή τις στήλες του C. Εδώ μεσολαβούν 100 στοιχεία (λόγω του κ) μέχρι να αναζητηθεί η επόμενη γραμμή ή στήλη αντίστοιχα (stride λοιπόν 100).

20 Virtual Processor Model
Vector operations are SIMD (single instruction multiple data)operations Each element is computed by a virtual processor (VP) Number of VPs given by vector length Παράλληλα με την παραδοσιακή προσέγγιση ενός vector επεξεργαστή είναι σημαντικό να τον εξετάσουμε και σαν ένα σύνολο από απλούς scalar επεξεργαστές Ο αριθμός των εικονικών αυτών επεξεργαστών είναι ίσος με το μήκος των vector καταχωρητών της μηχανής. Η προσέγγιση αυτή αντιμετωπίζει έναν vector καταχωρητή ως μια σειρά από τοπικούς καταχωρητές καθένας εκ των οποίων ανήκει σε έναν εικονικό επεξεργαστή. Κάθε vector εντολή πραγματοποιεί μια SIMD operation, δηλαδή μια operation ανά επεξεργαστή. Οι επεξεργαστές είναι εικονικοί γιατί οι εντολές τους πολυπλέκονται χρονικά εκμεταλλευόμενοι τους διαθέσιμους φυσικούς πόρους του συστήματος. Για παράδειγμα η vector unit του Cray-1 μπορεί να θεωρηθεί ότι περιέχει 64 εικονικούς επεξεργαστές, των οποίων οι πράξεις της πρόσθεσης πολυπλέκονται χρονικά για να αξιοποιήσουν την μία και μοναδική addition pipeline.

21 Virtual Processor Model
Στο σχήμα που φαίνεται στη διαφάνεια βλέπουμε τη δομή ενός vector επεξεργαστή. Αυτός μπορεί σύμφωνα με τα προηγούμενα να θεωρηθεί ότι ανάγεται σε VLR (όσο είναι το μήκος των vector καταχωρητών) εικονικούς επεξεργαστές σε κάθε έναν από τους οποίους ανήκουν 8 scalar καταχωρητές. Αυτοί οι επεξεργαστές εκτελούν συντονισμένα την ίδια εντολή σε μια ακολουθία από δεδομένα. Στο συγκεκριμένο παράδειγμα καθένας από αυτούς προσθέτει το περιεχόμενο δύο εκ των καταχωρητών που διαθέτει (V1 και V2) και αποθηκεύει το αποτέλεσμα σε έναν τρίτο (V3). Από τα παραπάνω είναι φανερό ότι η ίδια εντολή εκτελείται από όλους τους εικονικούς επεξεργαστές χωρίς να υπάρχει δυνατότητα ανεξάρτητου χειρισμού. Αντίστοιχα στο δεύτερο παράδειγμα κάθε εικονικός επεξεργαστής ανακαλεί ένα δεδομένο από την κύρια μνήμη και το αποθηκεύει στον τοπικό του καταχωρητή V1. Η αρχική θέση των δεδομένων αυτών είναι η r1 και το stride του είναι ίσο με r2.

22 Vectorization Example
DO 100 I = 1, N A(I) = B(I) + C(I) 100 CONTINUE Scalar process: B(1) will be fetched from memory C(1) will be fetched from memory A scalar add instruction will operate on B(1) and C(1) A(1) will be stored back to memory Step (1) to (4) will be repeated N times. Στο παρακάτω παράδειγμα θα διαπιστώσουμε τη διαφορά μεταξύ μιας scalar και μιας vector εκτέλεσης της ίδιας λειτουργίας. Ας υποθέσουμε ότι έχουμε τον βρόχο που φαίνεται στη διαφάνεια. Βλέπουμε ότι πραγματοποιείται μια πρόσθεση μεταξύ δύο μονοδιάστατων πινάκων B και C, το αποτέλεσμα των οποίων αποθηκεύεται σε έναν τρίτο πίνακα A. Στην γνωστή μας scalar διαδικασία ανακαλείται από την κύρια μνήμη το πρώτο στοιχείο του Β, το Β(1) και στον επόμενο κύκλο ανακαλείται το αντίστοιχο στοιχείο του C, το C(1). Στη συνέχεια εκτελείται μια scalar εντολή πρόσθεσης και το αποτέλεσμα Α(1) αποθηκεύεται στη μνήμη. Τα παραπάνω βήματα επαναλαμβάνονται μέχρι να προστεθούν όλα τα στοιχεία των Α και C δηλ Ν φορές.

23 Vectorization Example
DO 100 I = 1, N A(I) = B(I) + C(I) 100 CONTINUE Vector process: A vector of values in B(I) will be fetched from memory A vector of values in C(I) will be fetched from memory. A vector add instruction will operate on pairs of B(I) and C(I) values. After a short start-up time, stream of A(I) values will be stored back to memory, one value every clock cycle. c

24 Example (2): Y=aX+Y 64 is element size .So we need no loop now
Scalar Code: LD F0, A ADDI R4,Rx, #512 ; Last addr Loop: LD F2, 0(Rx) MULTD F2, F0, F2 ; A * X[I] LD F4, 0(Ry) ADDD F4, F2, F4 ; + Y[I] SD 0(Ry), F4 ADDI Rx, Rx, #8 ; Inc index ADDI Ry, Ry, #8 SUB R20, R4, Rx BNEZ R20, Loop Vector Code: LD F0, A LV V1, Rx ; Load vecX MULTSV V2, F0, V1 ; Vec Mult LV V3, Ry ; Load vecY ADDV V4, V2, V3 ; Vec Add SV Ry, V4 ; Store result 64 is element size .So we need no loop now 1+5*64=321 operations Vector/Scalar=1.8x Ας υποθέσουμε ότι έχουμε έναν scalar αριθμό ο οποίος πολλαπλασιάζεται με με έναν vector Χ και το αποτέλεσμα του πολλαπλασιασμού προστίθεται σε έναν άλλο vector Υ, στη θέση του οποίου αποθηκεύεται και το αποτέλεσμα. Θεωρούμε ότι το μήκος των vectors είναι 64. Στη συνέχεια θα δούμε πως υλοποιούνται τα παραπάνω σε έναν scalar και σε έναν vector επεξεργαστή: Scalar επεξεργαστής: Οι εντολές που θα πρέπει να εκτελεσθούν είναι οι εξής: LD F0,a ADDI R4,Rx,#512 Loop: LD F2,0(Rx) MULTD F2,F0,F2 LD F4,0(Ry) ADDD F4,F2,F4 SD F4,0(Ry) ADDI Rx,Rx,#8 ADDI Ry,Ry,#8 SUB R20,R4,Rx BNZ R20,loop Με την πρώτη εντολή φορτώνεται στον καταχωρητή F0 η τιμή του αριθμού a. Στη συνέχεια ανατίθεται στον R4 η τελευταία διεύθυνση της μνήμης στην οποία υπάρχουν χρήσιμα δεδομένα προς επεξεργασία.(ουσιαστικά μας δίνει τη διεύθυνση στην οποία μπορούμε να βρούμε το τελευταίο στοιχείο του Υ). Αφού δόθηκαν οι αρχικές συνθήκες το πρόγραμμα μπαίνει σε έναν βρόχο όπου φορτώνεται το ν-οστό στοιχείο του Χ, πολλαπλασιάζεται με τον αριθμό a, φορτώνεται το ν-οστό στοιχείο του Υ και προστίθεται στο αντίστοιχο στοιχείο του Χ. Το αποτέλεσμα αντικαθιστά το ν-στο στοιχείο του Υ. Οι επόμενες δύο εντολές (ADDI) προσδιορίζουν σε ποιο σημείο της μνήμης θα βρεθούν τα επόμενα (ν+1) στοιχεία του Χ και Υ αντίστοιχα. Τέλος, το τελευταίο ζευγάρι εντολών δεν κάνουν τίποτε άλλο από το να ελέγχουν αν έχουν προσπελαστεί όλα τα στοιχεία των Χ και Υ. Αν πολλαπλασιάσουμε το 64 που είναι το μήκος των vector με το 8 (που είναι το stride), το αποτέλεσμα θα μας δώσει την τελική διεύθυνση 512. Vector επεξεργαστής: Στην περίπτωση αυτή οι εντολές που θα πρέπει να εκτελεστούν είναι οι εξής: LV V1,Rx MULTS V2,F0,V1 LV V3,Ry ADDV V4,V2,V3 SV Ry,V4 Εδώ, με την πρώτη εντολή φορτώνεται ο scalar a. Στη συνέχεια φορτώνεται ο vector Χ, πολλαπλασιάζεται με τον a και το αποτέλεσμα αποθηκεύεται σε ένα νέο vector V2. Αφού φορτωθεί και ο Y στην μνήμη θα προστεθεί στον V2 και το αποτέλεσμα θα αντικαταστήσει τον αρχικό Υ vector.  Ο συνολικός αριθμός των operation που εκτελεί ο scalar επεξεργαστής είναι (τόσες φορές εκτελείται ο βρόγχος)*9 (ο αριθμός των εντολών που βρίσκονται μέσα στο βρόγχο)+2(οι εντολές που βρίσκονται εκτός βρόγχου και εκτελούνται μόνο μια φορά)=578 Από την άλλη στον vector επεξεργαστή ο αριθμός των operation είναι: 1(η φόρτωση του scalar a) +5(ο αριθμός των vector εντολών)*64(το μήκος των vector)=321 Ο λόγος των δύο μεγεθών αυτών φανερώνει μια αύξηση στην ταχύτητα εκτέλεσης κατά έναν συντελεστή κοντά στο 1,8. Loop goes 64 times. 2+9*64=578 operations

25 Vector Length We would like loops to iterate the same number of times that we have elements in a vector But unlikely in a real program Also the number of iterations might be unknown at compile time Problem: n, number of iterations, greater than MVL (Maximum Vector Length) Solution: Strip Mining Create one loop that iterates a multiple of MVL times Create a final loop that handles any remaining iterations, which must be less than MVL Μέχρι τώρα είδαμε παραδείγματα όπου το μήκος του vector ήταν ίσο με τον αριθμό των επαναλήψεων του βρόγχου. Κάτι τέτοιο όμως είναι μάλλον σπάνιο σε ένα πραγματικό πρόγραμμα. Συνήθως ο αριθμός των επαναλήψεων ξεπερνά κατά πολύ το MVL Maximum Vector Length). Από την άλλη είναι σύνηθες φαινόμενο να μην είναι καν γνωστό το πόσες φορές θα εκτελεστεί ο βρόγχος την ώρα που γίνεται η μεταγλώττιση. Για τους προαναφερθέντες λόγους είναι σημαντικό να μελετήσουμε το πρόβλημα στο οποίο ο αριθμός n που εκφράζει τις επαναλήψεις ενός βρόγχου είναι κατά πολύ μεγαλύτερος από το μέγεθος του vector MVL. Η λύση που δόθηκε ονομάζεται Strip Mining. Το σκεπτικό είναι να δημιουργηθεί ένας βρόγχος που θα εκτελεί την πλειοψηφία των απαιτούμενων πράξεων και το μήκος του οποίου θα είναι πολλαπλάσιο του μήκους του vector. Ένας άλλος βρόγχος που θα φωλιάζει μέσα στον πρώτο θα είναι υπεύθυνος για τις εναπομένουσες επαναλήψεις στην περίπτωση που δεν έχουμε ακριβή πολλαπλάσια. Στο ίδιο αποτέλεσμα θα καταλήξουμε βέβαια αν υπολογίσουμε πρώτα τα στοιχεία που περισσεύουν και έπειτα τα πολλαπλάσια του MVL

26 Strip Mining Example low=1 VL = (n mod MVL) ; Find odd-sized piece
Do 1 j=0,(n/MVL) ; Outer Loop Do 10 I = low, low+VL-1 ; runs for length VL Y(I) = a*X(I)+Y(I) ; Main operation 10 continue low = low + VL VL = MVL 1 Continue Για να το διαπιστώσουμε αυτό υποθέτουμε ότι θέλουμε να υπολογίσουμε την παράσταση Y=a*X+Y. Βασικός σκοπός είναι να δημιουργήσουμε block από επαναλήψεις μεγέθους όσο και το μήκος του vector, καθώς και να βρούμε πόσες από αυτές περισσεύουν. Αυτό βέβαια δεν είναι τίποτε άλλο από το υπόλοιπο του πηλίκου των επαναλήψεων δια του μήκους του vector, το οποίο υπολογίζεται από τη δεύτερη εντολή. Στη συνέχεια συγκροτούνται δύο βρόγχοι, εκ των οποίων ο πρώτος εκτελείται τόσες φορές όσο ο αριθμός των προαναφερθέντων block ενώ ο δεύτερος αναλαμβάνει την εκτέλεση του κυρίως προγράμματος. Με μια προσεκτική ματιά μπορούμε να συμπεράνουμε ότι πρώτα εκτελείται ο βρόγχος για τα στοιχεία που περισσεύουν και έπειτα για τα block. Αυτό βέβαια γίνεται άμεσα αντιληπτό αν βάλουμε στα παραπάνω ενδεικτικές τιμές. Ας υποθέσουμε λοιπόν ότι το μέγεθος του vector είναι 32 και ο αριθμός των επαναλήψεων 130. Executes loop in blocks of MVL Inner loop can be vectorized

27 Strip Mining Example low=1 ; low=1 VL = (n mod MVL) ; VL=2
Do 1 j=0,(n/MVL) ; j=1 Do 10 I = low, low+VL-1 ; I=1 .. 2 Y(I) = a*X(I)+Y(I) ; Υ(1) and Υ(2) 10 continue ; low = low + VL ; low=3 VL = MVL ; VL=32 1 Continue ; Όταν ξεκινά η εκτέλεση του προγράμματος η low έχει την τιμή μηδέν, ενώ η VL ισούται με 2. Ο εξωτερικός βρόγχος δίνει την τιμή 0 στο j και ο δεύτερος εκτελείται από low, δηλαδή ένα έως low+VL-1 που ισούται με 1+2-1=2. Συνεπώς οι τιμές του Υ που βρίσκονται όταν j=1 είναι μόνο οι Y(1) και Υ(2). Στη συνέχεια αυξάνεται το low και γίνεται 3 και το VL παίρνει την τιμή 32.

28 Strip Mining Example low=1 ; low=3 VL = (n mod MVL) ; VL=32
Do 1 j=0,(n/MVL) ; j=2 Do 10 I = low, low+VL-1 ; I= Y(I) = a*X(I)+Y(I) ; Υ(3) .. Υ(34) 10 continue ; low = low + VL ; low=35 VL = MVL ; VL=32 1 Continue ; Επομένως όταν ο εξωτερικός βρόγχος θα εκτελεστεί για δεύτερη φορά, δηλαδή το j θα γίνει ίσο με 2, ο αριθμός των επαναλήψεων του εσωτερικού θα είναι 32 (από 3 έως =34). Άρα λοιπόν θα υπολογιστούν τα Υ(3) έως και Υ(34) και το low θα γίνει τώρα 35. Είναι φανερό ότι το low είναι ο δείκτης που δηλώνει από το που θα ξεκινήσει κάθε φορά ο βρόγχος να υπολογίζει τα Υ. Η διαδικασία επαναλαμβάνεται στο ίδια μοτίβο ως το τέλος. Οι τιμές των μεταβλητών θα έχουν διαμορφωθεί ως εξής.

29 Strip Mining Example low=1 ; low=99 VL = (n mod MVL) ; VL=32
Do 1 j=0,(n/MVL) ; j=4 Do 10 I = low, low+VL-1 ; I= Y(I) = a*X(I)+Y(I) ; Υ(99) .. Υ(130) 10 continue ; low = low + VL ; low=130 VL = MVL ; VL=32 1 Continue ; Η low θα είναι 99, η VL αμετάβλητη και ο εξωτερικός βρόγχος εκτελείται για 4 και τελευταία φορά. (είναι ο αριθμός των block που προέκυψαν + 1 από τον υπολογισμό των στοιχείων που περίσσεψαν) Βλέπουμε ότι ο εσωτερικός βρόγχος υπολογίζει τα τελευταία 32 στοιχεία. Το low τώρα γίνεται 130, αλλά αυτό δεν έχει σημασία αφού το πρόγραμμα οδηγείται στο continue και συνεχίζει τη ροή του. Με λίγα λόγια καταφέραμε να χωρίσουμε τον αριθμό των επαναλήψεων σε block των 32 + δύο που περίσσευαν. Ο εσωτερικός βρόγχος μπορεί να ανυσματοποιηθεί επιτυγχάνοντας τώρα σημαντική βελτίωση στην ταχύτητα εκτέλεσης.

30 Vectorization Inhibitors
Subroutine calls I/O Statements Character data Unstructured branches Data dependencies Complicated programming Οι κυριότεροι παράγοντες που εμποδίζουν το vectorization ενός προγράμματος είναι η κλήση υπορουτινών, οι εντολές εισόδου/εξόδου, η ύπαρξη χαρακτήρων, μη δομημένα κλαδιά ελέγχου, εξάρτηση δεδομένων και ο πολύπλοκος προγραμματισμός. Αναλυτικότερα:

31 Vectorization Inhibitors
Subroutine calls I/O Statements Character data Unstructured branches Data dependencies Complicated programming Οι ρουτίνες διακόπτουν το πρόγραμμα από την κανονική του ροή. Στο σύγχρονο όμως προγραμματισμό θεωρούνται πολύτιμα εργαλεία τα οποία δεν μπορούμε να εγκαταλείψουμε για χάρη των vector επεξεργαστών. Γι’ αυτό το λόγο προτάθηκε η λύση να ενσωματώνονται οι ρουτίνες στον κώδικά της εφαρμογής. Γλώσσες προγραμματισμού όπως η C++ διαθέτουν compilers οι οποίοι είναι σε θέση να εκτελέσουν αυτόματα αυτήν την λειτουργία (subroutine inline). Ο ίδιος ο μεταγλωττιστής αναλαμβάνει να αντιμετωπίσει πιθανές συγκρούσεις ονομάτων μεταβλητών κλπ. Αφού γίνει αυτό, το vectorization μπορεί να επιτευχθεί μέσω του κανονικού compilation.

32 Subroutine calls Solution: Inline
inline double radius( double x, double y, double z ) { return sqrt( x*x + y*y + z*z ); } .. int main() for( int i=1; i<=n; ++i ){ r[i] = radius( x[i], y[i], z[i] ); Στο παράδειγμα που φαίνεται στη διαφάνεια δίνεται εντολή στον compiler να ενσωματώσει την υπορουτίνα radius όπου αυτό απαιτείται στο κυρίως πρόγραμμα. Αυτό συμβαίνει στον βρόγχο for εντός του οποίου βλέπουμε ότι γίνεται κλήση στην εν λόγω υπορουτίνα. O compiler ουσιαστικά θα αντικαταστήσει την radius(x[i],y[i],z[i]) του βρόγχου με το sqrt(x[i]*x[i]+y[i]*y[i]+z[i]*z[i])

33 Vectorization Inhibitors
Subroutine calls I/O Statements Character data Unstructured branches Data dependencies Complicated programming Οι εντολές εισόδου/ εξόδου πραγματοποιούνται ασύγχρονα και χωρίς να υπάρχει συνήθως κάποιο Pattern.

34 Vectorization Inhibitors
Subroutine calls I/O Statements Character data Unstructured branches Data dependencies Complicated programming Οι χαρακτήρες εμποδίζουν και αυτοί με τη σειρά τους το vectorization για τον απλό λόγο ότι δεν έχουν την μορφή 64 bit floating point

35 Vectorization Inhibitors
Subroutine calls I/O Statements Character data Unstructured branches Data dependencies Complicated programming Οι μη δομημένοι βρόγχοι ( π.χ όταν γίνεται άλμα από το κυρίως πρόγραμμα μέσα σε έναν βρόγχο ή το αντίθετο) δεν μπορούν με κανέναν τρόπο να τροποποιηθούν ώστε να συμβαδίσουν με το vectorization. Πρέπει απλά να αποφεύγονται.

36 Vectorization Inhibitors
Subroutine calls I/O Statements Character data Unstructured branches Data dependencies Complicated programming Εξίσου σημαντικό πρόβλημα είναι και η εξάρτηση δεδομένων. Το χαρακτηριστικό παράδειγμα είναι η αναδρομή σε έναν βρόγχο. Το vectorization αποτυγχάνει επειδή χρησιμοποιούνται δεδομένα που υπολογίστηκαν από προηγούμενο βρόγχο.

37 Dependence Example do i=2,n a(i) = a(i-1) enddo do i=2,n
temp(i) = a(i-1) ! temporary vector enddo temp(1) = a(1) do i=1,n a(i) = temp(i) Στο παράδειγμά μας παρατηρούμε ότι πραγματοποιείται μια ολίσθηση προς τα αριστερά. Η τιμή όμως του a(ι) εξαρτάται από το a(I-1) που υπολογίστηκε από την αμέσως προηγούμενη εκτέλεση του βρόγχου. Το πρόβλημα μπορεί να ξεπεραστεί αν χρησιμοποιήσουμε ένα προσωρινό vector temp(i). Ο δεύτερος βρόγχος μπορεί τώρα να υποστεί vectorization. Σε πρώτη φάση δε φαίνεται να έχει αποτέλεσμα αφού δεν αποφεύγουμε τον πρώτο βρόγχο. Στην πραγματικότητα όμως το δεύτερο {do…enddo} εμφανίζεται περισσότερες από μια φορές, οπότε το τέχνασμα αποδίδει.

38 Vectorization Inhibitors
Subroutine calls I/O Statements Character data Unstructured branches Data dependencies Complicated programming Κλείνοντας μπορούμε με ασφάλεια να υποστηρίξουμε ότι ο πολύπλοκος προγραμματισμός είναι το α και το ω στην αποτροπή του vectorization. Όσο πιο δαιδαλώδης είναι ένας βρόγχος τόσο πιο δύσκολα διανυσματοποιείται. Σύνθετες εκφράσεις και πολλά goto συνθέτουν ένα δύσκολο σενάριο στο οποίο ένας compiler δύσκολα θα ανταποκριθεί. Γι’ αυτό το λόγο η συγγραφή κώδικα πρέπει πάντα να γίνεται λαμβάνοντας υπ΄όψη τις δυνατότητες για vectorization.

39 Improving Vector Performance
Better compiler techniques As with all other techniques, we may be able to rearrange code to increase the amount of vectorization Techniques for accessing sparse matrices Hardware support to move between dense (no zeros), and normal (include zeros) representations Chaining Same idea as forwarding in pipelining Consider: MULTV V1, V2, V3 ADDV V4, V1, V5 ADDV must wait for MULTV to finish But we could implement forwarding; as each element from the MULTV finishes, send it off to the ADDV to start work Ακόμη και όταν μια εφαρμογή είναι vectorizable, ένα σημαντικό θέμα είναι το πώς θα πετύχουμε το μέγιστη αύξηση της απόδοσης της vector μηχανής. Ένα σημαντικό μάθημα που πήρε η επιστημονική κοινότητα ήταν ότι οι υπάρχοντες κώδικες δεν μπορούσαν να χρησιμοποιηθούν αυτούσιοι. Παλιά προγράμματα χρειάστηκαν προσθήκες, τροποποιήσεις και πολλές φορές πλήρη επανασύνταξη. Μέσω αυτής της διαδικασίας προέκυψαν βασικοί κανόνες που επιτρέπουν την καλύτερη προσαρμογή της εφαρμογής στις δυνατότητες των vector επεξεργαστών με αποτέλεσμα την άμεση αύξηση της απόδοσης. Πέρα από την αναδιοργάνωση του κώδικα μπορούν να ληφθούν υπόψη οι ιδιομορφίες δομών δεδομένων που χρησιμοποιούνται ευρέως σε επιστημονικές εφαρμογές όπως λόγου χάρη sparse matrices. Η δυνατότητα του υλικού να μεταπηδά από συνεπτυγμένες μορφές (χωρίς δηλαδή τα μηδενικά) στις πλήρης διατυπώσεις των ανωτέρω πινάκων επιφέρει άμεση αύξηση στην ταχύτητα της μηχανής. Μια εξίσου σημαντική τεχνική είναι η chaining, η οποία στοχεύει στην ελαχιστοποίηση της memory latency. Η φιλοσοφία είναι η εξής: Δεν είναι απαραίτητο να ολοκληρωθεί η εκτέλεση μιας vector εντολής προτού αρχίσει η επόμενη. Με άλλα λόγια μπορούμε να έχουμε αλληλοεπικάλυψη εντολών. Ας υποθέσουμε ότι έχουμε δυο vector εντολές. Στην πρώτη πολλαπλασιάζονται οι V2 και V3 και το αποτέλεσμα αποθηκεύεται στον V1. Αυτός στη συνέχεια προστίθεται στον V5 και το τελικό αποτέλεσμα αποθηκεύεται στον V4. Παρατηρούμε ότι τα προϊόντα της πρώτης εντολής είναι ταυτόχρονα και είσοδος της δεύτερης.

40 Chaining Example Unchained Chained
Unchained Total = 141 MULTV ADDV Chained MULTV Total = 77 Αν υποθέσουμε ότι το μήκος των vector είναι ίσο με 64 τότε η πρώτη εντολή θα διοχετεύσει 64 ζευγάρια από στοιχεία σε έναν Pipelined πολλαπλασιαστή. Σε κάποια φάση της εκτέλεσης της εντολής η μηχανή θα βρίσκεται σε μια ενδιαφέρουσα κατάσταση. Τα πρώτα στοιχεία του V1 θα περιέχουν τα σωστά υπολογισμένα δεδομένα, ένα μέρος των επόμενων στοιχείων που θα συνθέσουν το τελικό V1 βρίσκονται στον Pipelined πολλαπλασιαστή και τα υπόλοιπα είναι υπό τη μορφή τελεστών V2 και V3 και περιμένουν να ακολουθήσουν την πορεία πολλαπλασιαστή-V1. Τα στοιχεία όμως που βρίσκονται ήδη στον V1 μπορούν να διοχετευθούν σε έναν pipelined adder, όπου μαζί με τα στοιχεία του V5 θα δώσουν το τελικό αποτέλεσμα, δηλαδή τον vector V4. Με αυτήν την τεχνική επιτυγχάνεται η εκτέλεση της πρόσθεσης πριν ολοκληρωθεί ο πολλαπλασιασμός του παραδείγματος. Αν υποθέσουμε ότι έχουμε μια μηχανή που δεν ενσωματώνει chaining, οι κύκλοι που απαιτούνται είναι οι εξής: 7 για την αρχικοποίηση της πράξης του πολλαπλασιασμού, 64 για τον υπολογισμό του γινομένου των ισάριθμων ζευγαριών, 6 κύκλους για την αρχικοποίηση της πρόσθεσης και τέλος 64 για το άθροισμα των στοιχείων. Συνολικά έχουμε λοιπόν 141 κύκλους ρολογιού. Αν εξετάσουμε στη συνέχεια μια μηχανή στην οποία υλοποιείται η τεχνική chaining ο αριθμός των κύκλων διαμορφώνεται ως εξής: 7 κύκλοι για την αρχικοποίηση του πολλαπλασιασμού. Αφότου υπολογιστεί το πρώτο στοιχείο του V2, ξεκινά η αρχικοποίηση της πρόσθεσης. Μέχρι να ολοκληρωθεί αυτή είναι ήδη διαθέσιμα τα πρώτα στοιχεία του V1, τα οποία έχουν διοχετευθεί στον adder. Συνεπώς στον αμέσως επόμενο κύκλο ρολογιού μπορεί να παραχθεί το πρώτο αποτέλεσμα της πρόσθεσης, παράλληλα με αυτό του πολλαπλασιασμού. Άρα λοιπόν σε αυτήν την περίπτωση απαιτούνται 7 και 6 κύκλοι για την αρχικοποίηση του πολλαπλασιασμού και της πρόσθεσης αντίστοιχα και 64 για την ολοκλήρωση του τελευταίου αθροίσματος. Σύνολο 77. Είναι φανερό από τα παραπάνω ότι η τεχνική chaining αυξάνει την ταχύτητα της vector μηχανής. ADDV 6 and 7 cycles are start-up-times of the adder and multiplier Every vector processor today performs chaining

41 Improving Performance
Conditionally Executed Statements Consider the following loop Do 100 i=1, 64 If (a(i) .ne. 0) then a(i)=a(i)-b(i) Endif 100 continue Not vectorizable due to the conditional statement But we could vectorize this if we could somehow only include in the vector operation those elements where a(i) != 0 Πέρα από αυτήν υπάρχουν και άλλοι τρόποι που επιτυγχάνουν αύξηση της απόδοσης ακόμη και σε τμήματα του κώδικα που δε φαίνεται να μπορεί να εφαρμοστεί το vectorization. Ας υποθέσουμε ότι έχουμε έναν βρόγχο ο οποίος εκτελεί μια εντολή υπό συνθήκη. Στο συγκεκριμένο παράδειγμα αν το ν-στο στοιχείο του vector Α δεν είναι μηδέν, τότε αυτό ελαττώνεται κατά Β(Ι). Και πάλι υποθέτουμε ότι το μήκος του vector είναι 64. Σύμφωνα με τα προηγούμενα ο βρόγχος δεν μπορεί να ανυσματοποιηθεί, εκτός και αν βρίσκαμε έναν τρόπο να εκτελέσουμε το βρόγχο επιλεκτικά μόνο όταν το εκάστοτε Α(Ι) δεν είναι μηδέν.

42 Conditional Execution
Solution: Create a vector mask of bits that corresponds to each vector element 1=apply operation 0=leave alone As long as we properly set the mask first, we can now vectorize the previous loop with the conditional Implemented on most vector processors today Για να το πετύχουμε αυτό αρκεί να χρησιμοποιήσουμε ένα vector μάσκα, οι τιμή των στοιχείων του οποίου θα εξαρτώνται από τον α. Αν λοιπόν το ν-στο στοιχείο του α είναι διάφορο του μηδενός τότε το αντίστοιχο στοιχείο του vector μάσκα θα είναι 1. Στην αντίθετη περίπτωση θα είναι 0. Με την προσθήκη αυτή μπορεί πλέον ο βρόγχος να υποστεί vectorization ως εξής.

43 Conditional Execution
lv v1 ra ;load vector into v1 lv v2 rb ;load vector into v2 id f0 # ;f0=0 vsnes f0 v ;set VM to 1 if v1(i)!=0 vsub v1 v1 v2 ;sub. under vector mask cvm ;set vector mask all to 1 sv ra v ; store the reslult to a Θεωρούμε ότι η διεύθυνση του πρώτου στοιχείου των v1 και v2 είναι οι ra και rb αντίστοιχα. Με τις πρώτες δύο εντολές φορτώνονται οι v1 και v2. Η τρίτη εκχωρεί στην f0 την τιμή 0 ενώ η επόμενη διαμορφώνει τον vector καταχωρητή μάσκα. Με βάση αυτόν γίνεται η αφαίρεση και το αποτέλεσμα αντικαθιστά τον αρχικό vector α αφού δώσουμε πάλι στη μάσκα την τιμή 1

44 Common Vector Metrics Rn: MFLOPS rate on an infinite-length vector
Real problems do not have unlimitend vector lengths, and the start-up penalties encountered in real problems will be larger (Rn is the MFLOPS rate for a vector of length n) N1/2: The vector length needed to reach one-half of Rn a good measure of the impact of start-up NV: The vector length needed to make vector mode faster than scalar mode measures both start-up and speed of scalars relative to vectors, quality of connection of scalar unit to vector unit

45 Applications Linear Algebra
Image processing (Convolution, Composition, Compressing, etc.) Audio synthesis Compression Cryptography Speech recognition

46 Applications in multimedia
Kernel Vector length Matrix transpose/multiply # vertices at once DCT (video, communication) image width FFT (audio) Motion estimation (video) image width,iw/16 Gamma correction (video) image width Median filter (image processing) image width Separable convolution (img. proc.) image width 44

47 Vector Summary Alternate model,doesn’t rely on caches as does Out-Of-Order and superscalar implementations Handles memory in a more organized way Powerful instructions that replace loops Cope with multimedia applications Ideal architecture for scientific simulation


Download ppt "Τσόλκας Χρήστος & Αντωνίου Χρυσόστομος"

Similar presentations


Ads by Google