-
Notifications
You must be signed in to change notification settings - Fork 0
/
REPORT
60 lines (42 loc) · 4.29 KB
/
REPORT
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
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
Υλοποίηση loop unrolling [1], symbolic loop unrolling (software pipelining) [2]
Ο κώδικας βρίσκεται στον φάκελο src/
Η μεταγλώττιση γίνεται με την κληση της compile() απο το αρχείο main_app.c, μέσα στην
οποία φαίνεται η δομή και τα διάφορα στάδια της διαδικασίας μεταγλώττισης:
FRONT END --> IR --> BACK END
Η ανάλυση ροής και εξαρτήσεων γινεται στο front end σε 2 περάσματα (analysis.c):
1. define_blocks(); //ομαδοποίηση statements σε blocks
2. analyse_blocks(); //ανάλυση εξαρτήσεων, μεταξυ των statements του block,
//δημιουργια input/output vectors (αναγνώσεις/εγγραφές μεταβλητών)
//ανάλυση βρόχων, μαρκάρισμα βρόχων 'κατάλληλων' για βελτιστοποίηση
//ανάλυση εξαρτήσεων βρόχου (ΑΜΑ,ΑΜΕ,ΕΜΑ,ΕΜΕ)
Μετά την συλλογή των δεδομένων ανάλυσης ακολουθουν 3 περάσματα βελτιστοποίησης βρόχων. Για να
ενεργοποιηθούν υπαρχουν παράμετροι που δίνονται στην γραμμη εντολων (--help για την λίστα παραμέτρων
και το τι ενεργοποιεί η καθεμία)
Πέρασματα βελτιστοποίησης βρόχων (opt_for_stmt.c):
1. simplify:
Αφαιρεί απο το σώμα του βρόχου ανεξάρτητα statements
ΜΗ ΟΛΟΚΛΗΡΩΜΕΝΟ:
καποια test files παρήγαγαν λάθος κώδικα,
λειπουν καποιοι έλεγχοι για μεταβλητές που είναι μονο για
ανάγνωση σε ένα statement αλλά γράφονται σε κάποιο άλλο
εντός του βρόχου (εγγραφές εξαρτώμενες απο την μεταβλητή βρόχου)
ΑΠΕΝΕΡΓΟΠΟΙΗΜΕΝΟ
μεχρι να περάσουν όλα τα test files (τουλάχιστον)
2. loop unrolling:
Αντιγράφει το σώμα του βρόχου πολλές φορές κάνοντας τις κατάλληλες μετατροπές
στο βήμα της μεταβλητής βρόχου, στα offsets των μεταβλητών οι οποίες αναφέρονται
σε στοιχείο πίνακα (array), κατάλληλος κώδικας εξόδου σε περίπτωση που απομένουν
επαναλήψεις (ο unroll_factor δεν διαιρεί ακριβώς τον αριθμό επαναλήψεων).
Προς το παρόν ο unroll_factor είναι hardcoded και ισος με 4.
TODO: καθορισμός unloop_factor από την γραμμή εντολών
3. symbolic unrolling:
Μεταφέρει κάθε statement του βρόχου σε διαφορετική επανάληψη με δημιουργία
prologue/epilogue statements για είσοδο και έξοδο απο το βρόχο αντίστοιχα.
Τα 3 περάσματα μπορούν να ενεργοποιηθούν χωρίς το ένα να επηρεάζει το άλλο.
Η σειρά εκτελεσής τους σε κάθε περίπτωση είναι ίδια με την σειρά που αναφέρονται
εδώ. Στο αρχείο algorithms/sym_unroll_pattern.c υπάρχει ο αλγόριθμος με τον οποίο
δημιουργούνται τα prologue/epilogue statements.
Για περισσοτερες πληροφορίες υπάρχουν σχόλια στο κώδικα σε κάποια κρίσιμα σημεία.
Επίσης εάν για οποιδήποτε σημείο του κώδικα δεν είναι εμφανής η χρήση του ή η λογική
πίσω απο αυτό (αλγόριθμος) επικοινωνήστε μαζι μου :)
Μαρούδας Μανώλης<kapamaroo@gmail.com>