[Advcomparch] Απορία στην 4η άσκηση

Nikos Anastopoulos anastop at cslab.ece.ntua.gr
Wed Jul 6 19:54:20 EEST 2011


Καλησπέρα,

On 07/06/2011 06:09 PM, Alexandros Dagklis wrote:
> Καλησπέρα,
>
> έχω κολλήσει στο 1ο κομμάτι της άσκησης στον simics καθώς δεν μπορώ να
> κατανοήσω κάτι που παρατηρώ. Εκτελώντας όλα τα πιθανά loop interchanges
> παρατηρώ ότι σε σχέση με το αρχικό υπάρχουν άλλοι συνδυασμοί που έχουν
> σημαντικά μικρότερα missrates. Παρόλα αυτά, τα instructions κάθε φορά
> έχουν σημαντικές αποκλίσεις μεταξύ τους. Κατ αρχάς δεν καταλαβαίνω
> γιατί, αφού κάθε φορά οι εντολές που εκτελούνται είναι ακριβώς οι ίδιες
> σε πλήθος.

Αυτό ισχύει σε θεωρητικό επίπεδο, όχι όμως και σε πρακτικό, αφού ο 
compiler φαίνεται ότι κάνει διαφορετικά optimizations σε κάθε έκδοση του 
interchanged κώδικα που οδηγούν τελικά σε διαφορετικό αριθμό εντολών. 
Για να το διαπιστώσεις αυτό αρκεί να απενεργοποιήσεις τα όποια 
optimizations (-Ο0), και τότε θα δεις ότι ο αριθμός των εντολών είναι 
λίγο-πολύ ο ίδιος, αλλά σημαντικά πιο μεγάλος. Αυτό θα οδηγούσε σε 
καλύτερη σύγκλιση της θεωρητικής με την πρακτική συμπεριφορά, όμως θα 
εισήγαγε μεγαλύτερους χρόνους προσομοίωσης, κάτι που θέλαμε να 
αποφύγουμε, λαμβάνοντας υπόψη ειδικά τις πολλές περιπτώσεις που πρέπει 
να εξεταστούν στο blocking. Το O1 επομένως μπήκε με το σκεπτικό ότι 
είναι το επίπεδο που εισάγει τα λιγότερo "aggressive" optimizations, που 
όμως απ' ό,τι βλέπετε είναι αρκετά για να κάνουν αισθητές 
διαφοροποιήσεις στην απόδοση ανάμεσα σε κώδικες με (θεωρητικά) ίδιο 
αριθμό εντολών.
Και φυσικά, διαφοροποιήσεις ενδέχεται να προκύπτουν όχι μόνο λόγω των 
optimization levels, αλλά ακόμα και λόγω της εκάστοτε έκδοσης του gcc, 
θεωρώντας το ίδιο level! Με άλλα λόγια, δεν υπάρχει μία ενιαία απάντηση 
στην ερώτηση του βέλτιστου interchange (σε πρακτικό επίπεδο), αλλά 
εξαρτάται από το compilation framework του καθενός και την 
παραμετροποίηση του compiler.

Επιπλέον, αυτό φέρνει ένα ακόμα πρόβλημα: σύμφωνα με το
> μοντέλο που εφαρμόζουμε για τον υπολογισμό των συνολικών κύκλων, όπου
> λαμβάνονται υπόψη και τα instructions, επειδή τυχαίνει (;) η πρώτη
> διάταξη των βρόχων να δίνει σημαντικά λιγότερα instructions παρόλο που
> έχει υψηλότερα missrates, τελικά προκύπτει ότι με την 1η (δοσμένη)
> διάταξη των i,j,k ο κώδικας εκτελείται σε λιγότερους κύκλους.
> Δεδομένου ότι στην εκφώνηση λέει κιόλας ότι η δοσμένη διάταξη δεν είναι η
> καλύτερη, αναρωτιέμαι αν κάπου κάτι κατάλαβα λάθος.
Δεν είναι η καλύτερη όσον αφορά την αξιοποίηση της cache, σε θεωρητικό 
επίπεδο.
Σε πρακτικό επίπεδο (ουσιαστικά, λαμβάνοντας υπόψη μόνο τα misses όπως 
τα μετράει ο simics), μπορεί όντως να μην γίνεται η καλύτερη δυνατή 
αξιοποίηση με την απλοϊκή έκδοση, μπορεί όμως και να γίνεται. Διότι τα 
optimizations που έκανε τελικά η συγκεκριμένη έκδοση του compiler, στο 
συγκεκριμένο level, και τα οποία σου επηρέασαν τα instructions, μπορεί 
να σου επηρεάσουν τελικά και τον τρόπο/αριθμό/σειρά που γίνονται τα 
memory references.

  Πώς τελικά θα
> αποφασίσουμε πιο είναι το καλύτερο ώστε να το χρησιμοποιήσουμε και στο
> blocking;
>

Παραπέμπω σε παλαιότερη συζήτηση επί του θέματος που είχε γίνει στη 
λίστα, νομίζω θα βοηθήσει:

http://lists.cslab.ece.ntua.gr/pipermail/advcomparch/2009-July/000320.html
http://lists.cslab.ece.ntua.gr/pipermail/advcomparch/2009-July/000323.html
http://lists.cslab.ece.ntua.gr/pipermail/advcomparch/2009-July/000324.html
http://lists.cslab.ece.ntua.gr/pipermail/advcomparch/2009-July/000325.html

Ν.



More information about the Advcomparch mailing list