Γνωρίζουμε ότι μία τεχνική του μεταγλωττιστή, για αποκάλυψη περισσότερης παραλληλίας ανάμεσα στις εντολές, είναι η ανάπτυξη του βρόχου. Υπάρχουν άλλες δύο σημαντικές τεχνικές που αναπτύχθηκαν γι' αυτό το σκοπό. Αυτές είναι :
Η σωλήνωση λογισμικού αναδιοργανώνει τους βρόχους έτσι ώστε, κάθε επανάληψη του σωληνωμένου λογισμικού κώδικα να σχηματίζεται από εντολές επιλεγμένες, από διαφορετικές επαναλήψεις του αρχικού βρόχου.
Παράδειγμα
Για τον παρακάτω βρόχο δίνεται ο αντίστοιχος πίνακας με τις επιλεγμένες εντολές από τις διαφορετικές επαναλήψεις του βρόχου :
loop: | LD | F0, | 0(R1) ; | F0 = στοιχείο πίνακα | |
ADDD | F4, | F0, | F2 ; | πρόσθεση με το βαθμωτό μέγεθος του F2 | |
SD | 0(R1), | F4 ; | αποθήκευση του αποτελέσματος | ||
SUBI | R1, | R1, | #8 ; | μείωση δείκτη 8 bytes (για κάθε DW) | |
BNEZ | R1, | loop; | διακλάδωση R1!= μηδέν |
Στον πίνακα έχουμε πέντε αντίγραφα των εντολών LD, ADDD και SD από διαφορετικές επαναλήψεις του βρόχου και ένα αντίγραφο των εντολών SUBI και BNEZ.
Η λογισμική σωλήνωση του βρόχου επιλέγει εντολές από διαφορετικές επαναλήψεις του βρόχου, χωρίς να χρειάζεται η ανάπτυξή του, διαχωρίζοντας έτσι τις εξαρτώμενες εντολές που υπάρχουν μέσα σε μια επανάληψη του βρόχου. Σχηματικά παρουσιάζεται στο σχήμα 1.
Σχήμα 1 - Λογισμική σωληνωμένη επανάληψη
Παράδειγμα
Δίνεται ο παρακάτω βρόχος:
loop: | LD | F0, | 0(R1) ; | F0 = στοιχείο πίνακα | |
ADDD | F4, | F0, | F2 ; | πρόσθεση με το βαθμωτό μέγεθος του F2 | |
SD | 0(R1), | F4 ; | αποθήκευση του αποτελέσματος | ||
SUBI | R1, | R1, | #8 ; | μείωση δείκτη 8 bytes (για κάθε DW) | |
BNEZ | R1, | loop; | διακλάδωση R1!= μηδέν |
Δείξτε μία έκδοση του βρόχου με σωλήνωση λογισμικού, η οποία αυξάνει όλα τα στοιχεία ενός πίνακα, του οποίου η αρχική διεύθυνση είναι η R1, από τα περιεχόμενα του F2.
Απάντηση:
Η σωλήνωση λογισμικού συμβολικά αναπτύσσει το βρόχο και μετά επιλέγει εντολές από κάθε επανάληψη. Μια και η ανάπτυξη του βρόχου είναι συμβολική, οι εντολές SUBI και BNEZ δεν χρειάζεται να εμφανιστούν σε αυτό το στάδιο. Παρακάτω παρουσιάζονται οι εντολές τριών διαδοχικών επαναλήψεων :
Επανάληψη i : | LD | F0, | 0 (R1) | |
ADDD | F4, | F0, | F2 | |
SD | 16(R1), | F4 | ||
Επανάληψη i + 1 : | LD | F0, | 0 (R1) | |
ADDD | F4, | F0, | F2 | |
SD | 16 (R1), | F4 | ||
Επανάληψη i + 2 : | LD | F0, | 0 (R1) | |
ADDD | F4, | F0, | F2 | |
SD | 16 (R1), | F4 |
loop: | SD | 0 (R1), | F4 ; | αποθηκεύει στο Μ[i] | |
ADDD | F4, | F0, | F2 ; | προσθέτει στο Μ[i-1] | |
LD | F0, | 0 (R1) ; | φορτώνει το Μ[i-2] | ||
SUBI | R1, | R1, | #8 ; | ||
BNEZ | R1, | loop; |
Ο βρόχος αυτός μπορεί να τρέξει σε πέντε κύκλους ανά αποτέλεσμα. Επειδή η εντολή φόρτωσης χωρίζεται από την εντολή αποθήκευσης κατά 16, ο βρόχος θα τρέχει με δύο λιγότερες επαναλήψεις.
Η σωλήνωση λογισμικού μπορεί να θεωρηθεί ως η συμβολική ανάπτυξη του βρόχου.
ΔΡΑΣΤΗΡΙΟΤΗΤΑ 4
|
|