Η όγδοη έκδοση των μεταγλωττιστών Intel. Μεταγλωττιστές για την πλατφόρμα Microsoft Windows

Δεν είσαι σκλάβος!
Κλειστό εκπαιδευτικό μάθημα για παιδιά της ελίτ: «Η αληθινή διάταξη του κόσμου».
http://noslave.org

Από την Βικιπαίδεια, την ελεύθερη εγκυκλοπαίδεια

Intel C++ Compiler
Σφάλμα Lua στο Module:Wikidata στη γραμμή 170: προσπάθεια δημιουργίας ευρετηρίου του πεδίου "wikibase" (τιμή μηδενική).
Τύπος
Συγγραφέας

Σφάλμα Lua στο Module:Wikidata στη γραμμή 170: προσπάθεια δημιουργίας ευρετηρίου του πεδίου "wikibase" (τιμή μηδενική).

Προγραμματιστής
προγραμματιστές

Σφάλμα Lua στο Module:Wikidata στη γραμμή 170: προσπάθεια δημιουργίας ευρετηρίου του πεδίου "wikibase" (τιμή μηδενική).

Γραμμένο σε

Σφάλμα Lua στο Module:Wikidata στη γραμμή 170: προσπάθεια δημιουργίας ευρετηρίου του πεδίου "wikibase" (τιμή μηδενική).

Διεπαφή

Σφάλμα Lua στο Module:Wikidata στη γραμμή 170: προσπάθεια δημιουργίας ευρετηρίου του πεδίου "wikibase" (τιμή μηδενική).

λειτουργικό σύστημα
Γλώσσες διεπαφής

Σφάλμα Lua στο Module:Wikidata στη γραμμή 170: προσπάθεια δημιουργίας ευρετηρίου του πεδίου "wikibase" (τιμή μηδενική).

Πρώτη έκδοση

Σφάλμα Lua στο Module:Wikidata στη γραμμή 170: προσπάθεια δημιουργίας ευρετηρίου του πεδίου "wikibase" (τιμή μηδενική).

Πλατφόρμα υλικού
τελευταία έκδοση
υποψήφιος απελευθέρωσης

Σφάλμα Lua στο Module:Wikidata στη γραμμή 170: προσπάθεια δημιουργίας ευρετηρίου του πεδίου "wikibase" (τιμή μηδενική).

δοκιμαστική έκδοση

Σφάλμα Lua στο Module:Wikidata στη γραμμή 170: προσπάθεια δημιουργίας ευρετηρίου του πεδίου "wikibase" (τιμή μηδενική).

άλφα έκδοση

Σφάλμα Lua στο Module:Wikidata στη γραμμή 170: προσπάθεια δημιουργίας ευρετηρίου του πεδίου "wikibase" (τιμή μηδενική).

Δοκιμαστική έκδοση

Σφάλμα Lua στο Module:Wikidata στη γραμμή 170: προσπάθεια δημιουργίας ευρετηρίου του πεδίου "wikibase" (τιμή μηδενική).

Αναγνώσιμες μορφές αρχείων

Σφάλμα Lua στο Module:Wikidata στη γραμμή 170: προσπάθεια δημιουργίας ευρετηρίου του πεδίου "wikibase" (τιμή μηδενική).

Δημιουργήθηκαν μορφές αρχείων

Σφάλμα Lua στο Module:Wikidata στη γραμμή 170: προσπάθεια δημιουργίας ευρετηρίου του πεδίου "wikibase" (τιμή μηδενική).

κατάσταση

Σφάλμα Lua στο Module:Wikidata στη γραμμή 170: προσπάθεια δημιουργίας ευρετηρίου του πεδίου "wikibase" (τιμή μηδενική).

Αδεια

Βασικά χαρακτηριστικά:

  • Vectorization για SSE , SSE2 , SSE3 , SSE4

Ο μεταγλωττιστής υποστηρίζει το πρότυπο OpenMP 3.0 για τη σύνταξη παράλληλων προγραμμάτων. Περιέχει επίσης μια τροποποίηση του OpenMP που ονομάζεται Cluster OpenMP, με την οποία μπορείτε να εκτελέσετε εφαρμογές γραμμένες σύμφωνα με το OpenMP σε συμπλέγματα χρησιμοποιώντας MPI.

Ο μεταγλωττιστής Intel C++ χρησιμοποιεί ένα frontend (το τμήμα του μεταγλωττιστή που αναλύει το πρόγραμμα που μεταγλωττίζεται) από την ομάδα σχεδίασης Edison. Το ίδιο frontend χρησιμοποιείται από τους μεταγλωττιστές SGI MIPSpro, Comeau C++, Portland Group.

Αυτός ο μεταγλωττιστής χρησιμοποιείται ευρέως για τη μεταγλώττιση σημείων αναφοράς CPU SPEC.

Υπάρχουν 4 σειρές προϊόντων από την Intel που περιέχουν τον μεταγλωττιστή:

  • Intel C++ Compiler Professional Edition
  • Intel Cluster Toolkit (Έκδοση μεταγλωττιστή)

Τα μειονεκτήματα της έκδοσης Linux του μεταγλωττιστή περιλαμβάνουν μερική ασυμβατότητα με τις επεκτάσεις GNU της γλώσσας C (που υποστηρίζονται από τον μεταγλωττιστή GCC), η οποία μπορεί να προκαλέσει προβλήματα κατά τη μεταγλώττιση ορισμένων προγραμμάτων.

Πειραματικές παραλλαγές

Οι ακόλουθες πειραματικές εκδόσεις του μεταγλωττιστή έχουν δημοσιευτεί:

  • Intel STM Compiler Prototype Edition με ημερομηνία 17 Σεπτεμβρίου 2007. Υποστήριξη Συναλλακτικής Μνήμης Λογισμικού (STM). Κυκλοφόρησε μόνο για Linux και Windows, IA-32 (επεξεργαστές x86).
  • Intel Concurrent Collections για C/C++ 0.3, Σεπτέμβριος 2008. Περιέχει μηχανισμούς που διευκολύνουν τη σύνταξη παράλληλων προγραμμάτων C++.

Κύριες σημαίες

Windows Linux, Mac OSX Περιγραφή
/od -Ο0 Απενεργοποιήστε τις βελτιστοποιήσεις
/Ο1 -Ο1 Βελτιστοποιήστε για να ελαχιστοποιήσετε το μέγεθος του εκτελέσιμου αρχείου
/Ο2 -Ο2 Βελτιστοποίηση για ταχύτητα. Περιλαμβάνονται ορισμένες βελτιστοποιήσεις
/Ο3 -Ο3 Ενεργοποιήστε όλες τις βελτιστοποιήσεις από το O2. Εκτελέστε επίσης εντατικές βελτιστοποιήσεις βρόχου
/Οιπ -Οιπ Ενεργοποίηση διαδικαστικής βελτιστοποίησης ανά αρχείο
/Oipo -Οίπο Ενεργοποίηση καθολικής διαδικαστικής βελτιστοποίησης
/QxO -xO Να επιτρέπεται η χρήση επεκτάσεων SSE3, SSE2 και SSE για επεξεργαστές που κατασκευάζονται από οποιαδήποτε εταιρεία
/γρήγορα -γρήγορα "Γρήγορη λειτουργία". Ισοδυναμεί με "/O3 /Qipo /QxHost /no-prec-div" στα Windows και "-O3 -ipo -static -xHOST -no-prec-div" στο Linux. Σημειώστε ότι η σημαία "-xHOST" σημαίνει βελτιστοποίηση για τον επεξεργαστή στον οποίο εκτελείται ο μεταγλωττιστής.
/Qprof-gen -prof_gen Δημιουργήστε μια έκδοση με όργανα του προγράμματος που θα συναρμολογήσει το προφίλ εκτέλεσης
/Qprof-use -άφθονος Επωφεληθείτε από τις πληροφορίες προφίλ από τις εκκινήσεις προγραμμάτων που έχουν συγκεντρωθεί με τη σημαία prof_gen.

Γράψτε μια κριτική για το άρθρο "Intel C++ compiler"

Σημειώσεις

δείτε επίσης

Συνδέσεις

Ένα απόσπασμα που χαρακτηρίζει τον μεταγλωττιστή Intel C++

Κι όμως, επέστρεψε για να δει τον Λευκό Μάγο για τελευταία φορά... Τον άντρα της και πιο αληθινό φίλο της, τον οποίο δεν μπορούσε ποτέ να ξεχάσει. Στην καρδιά της τον συγχώρεσε. Αλλά, προς μεγάλη του λύπη, δεν μπόρεσε να του φέρει τη συγχώρεση της Μαγδαληνής… Έτσι, όπως βλέπεις, Ισιδώρα, ο μεγάλος χριστιανικός μύθος για τη «συγχώρηση» είναι απλώς ένα παιδικό ψέμα για αφελείς πιστούς που τους επιτρέπουν να κάνουν οτιδήποτε Κακό, γνωρίζοντας ότι ό,τι και να κάνουν, στο τέλος θα συγχωρεθούν. Αλλά μπορείτε να συγχωρήσετε μόνο αυτό που αξίζει πραγματικά συγχώρεση. Ο άνθρωπος πρέπει να καταλάβει ότι πρέπει να λογοδοτήσει για κάθε κακό που γίνεται... Και όχι ενώπιον κάποιου μυστηριώδους Θεού, αλλά ενώπιον του εαυτού του, αναγκάζοντας τον εαυτό του να υποφέρει σκληρά. Η Magdalena δεν συγχώρεσε τον Vladyka, αν και τον σεβόταν βαθιά και τον αγαπούσε ειλικρινά. Όπως δεν κατάφερε να συγχωρήσει όλους μας για τον τρομερό θάνατο του Ράντομιρ. Άλλωστε, ΑΥΤΗ ήταν που κατάλαβε καλύτερα από όλα - μπορούσαμε να τον βοηθήσουμε, μπορούσαμε να τον σώσουμε από έναν σκληρό θάνατο... Αλλά δεν θέλαμε. Θεωρώντας την ενοχή του Λευκού Μάγου πολύ σκληρή, τον άφησε να ζήσει με αυτή την ενοχή, χωρίς να το ξεχάσει ούτε στιγμή... Δεν ήθελε να του δώσει μια εύκολη συγχώρεση. Δεν την είδαμε ποτέ ξανά. Όπως δεν είδαν ποτέ τα μωρά τους. Μέσω ενός από τους ιππότες του Ναού της - του μάγου μας - η Magdalena μετέφερε την απάντηση στον Κύριο στο αίτημά του να επιστρέψει σε εμάς: «Ο ήλιος δεν ανατέλλει δύο φορές σε μια μέρα ... Η χαρά του κόσμου σας (Ράντομιρ) δεν θα επιστρέψω σε εσένα, όπως δεν θα επιστρέψω σε σένα και εγώ... Βρήκα την ΠΙΣΤΗ και την ΑΛΗΘΕΙΑ μου, είναι ΖΩΝΤΑΝΑ, τα δικά σου είναι ΠΕΘΑΜΕΝΑ... Θλίψε τους γιους σου - σε αγάπησαν. Δεν θα σας συγχωρήσω ποτέ για τον θάνατό τους όσο ζω. Και ας μείνει μαζί σου η ενοχή σου. Ίσως κάποια μέρα να σου φέρει Φως και Συγχώρεση... Αλλά όχι από εμένα. Το κεφάλι του Μάγου Ιωάννη δεν μεταφέρθηκε στα Μετέωρα για τον ίδιο λόγο - κανένας από τους Ιππότες του Ναού δεν ήθελε να επιστρέψει σε εμάς ... Τους χάσαμε, όπως χάσαμε πολλούς άλλους περισσότερες από μία φορές, που δεν ήθελαν να καταλάβουν και δεχτείτε τα θύματά μας ... Ποιος είναι όπως εσείς - έφυγαν καταδικάζοντας μας.
Ένιωσα ζάλη!.. Ως διψασμένος, ικανοποιώντας την αιώνια πείνα μου για γνώση, απορρόφησα λαίμαργα τη ροή των καταπληκτικών πληροφοριών που έδωσε απλόχερα ο Βορράς... Και ήθελα πολύ περισσότερα!.. Ήθελα να τα μάθω όλα μέχρι τέλους . Ήταν μια ανάσα γλυκού νερού στην καμένη από τον πόνο και την ατυχία έρημο! Και δεν μπορούσα να πιω αρκετά...
Έχω χίλιες ερωτήσεις! Αλλά δεν μένει χρόνος… Τι να κάνω, Σέβερ; ..
- Ρώτα Ισιδώρα!.. Ρώτα, θα προσπαθήσω να σου απαντήσω...
- Πες μου, Σέβερ, γιατί μου φαίνεται ότι σε αυτή την ιστορία συνδέονται δύο ιστορίες ζωής, συνυφασμένες με παρόμοια γεγονότα, και παρουσιάζονται ως η ζωή ενός ανθρώπου; Ή δεν έχω δίκιο;
– Έχεις απόλυτο δίκιο Ισιδώρα. Όπως σας είπα προηγουμένως, οι «ισχυροί αυτού του κόσμου», που δημιούργησαν μια ψεύτικη ιστορία της ανθρωπότητας, «έβαλαν» στην αληθινή ζωή του Χριστού την εξωγήινη ζωή του Εβραίου προφήτη Joshua, ο οποίος έζησε πριν από μιάμιση χιλιάδες χρόνια (από την ιστορία του Βορρά). Και όχι μόνο ο ίδιος, αλλά και η οικογένειά του, οι συγγενείς και οι φίλοι του, οι φίλοι και οι οπαδοί του. Άλλωστε, ήταν η σύζυγος του προφήτη Τζόσουα, η Εβραία Μαρία, που είχε μια αδερφή τη Μάρθα και έναν αδερφό τον Λάζαρο, την αδελφή της μητέρας του Μαρία Γιακόμπε και άλλους που δεν ήταν ποτέ κοντά στον Ράντομιρ και τη Μαγδαλένα. Όπως δεν υπήρχαν άλλοι «απόστολοι» δίπλα τους - ο Παύλος, ο Ματθαίος, ο Πέτρος, ο Λουκάς και οι υπόλοιποι ...
Ήταν η οικογένεια του προφήτη Joshua που μετακόμισε πριν από μιάμιση χιλιάδες χρόνια στην Προβηγκία (που τότε ονομαζόταν Γαλατία (Transalpine Gaul), στην ελληνική πόλη της Μασσαλίας (σημερινή Μασσαλία), αφού η Μασσαλία εκείνη την εποχή ήταν η «πύλη» μεταξύ Ευρώπης και Ασίας, και ήταν ο ευκολότερος τρόπος για όλους τους «διωκόμενους» να αποφύγουν τις διώξεις και την κακοτυχία.

Εισαγωγή Στα τέλη του 2003, η Intel παρουσίασε την έκδοση 8.0 της συλλογής μεταγλωττιστών της. Οι νέοι μεταγλωττιστές έχουν σχεδιαστεί για να βελτιώνουν την απόδοση των εφαρμογών που εκτελούνται σε διακομιστές, επιτραπέζιους υπολογιστές και κινητά συστήματα(φορητοί υπολογιστές, κινητά τηλέφωνα και PDA) με βάση Επεξεργαστές Intel. Είμαστε στην ευχάριστη θέση να σημειώσουμε ότι αυτό το προϊόν δημιουργήθηκε με την ενεργή συμμετοχή εργαζομένων του Κέντρου Ανάπτυξης Λογισμικού Intel Nizhny Novgorod και ειδικών της Intel από το Sarov.

Η νέα σειρά περιλαμβάνει μεταγλωττιστές Intel για C++ και Fortran για Windows και Linux, καθώς και μεταγλωττιστές Intel για C++ για Windows CE .NET. Οι μεταγλωττιστές στοχεύουν συστήματα που βασίζονται στους ακόλουθους επεξεργαστές Intel: Intel Itanium 2, Intel Xeon, Intel Pentium 4, επεξεργαστές Intel Personal Internet Client Architecture για κινητά τηλέφωνα και PDA και επεξεργαστή Intel Pentium M για φορητούς υπολογιστές (συστατικό της τεχνολογίας Intel Centrino για κινητά τηλέφωνα). Η/Υ).

Ο μεταγλωττιστής Intel Visual Fortran για Windows παρέχει τεχνολογίες μεταγλώττισης επόμενης γενιάς για υπολογιστές υψηλής απόδοσης. Συνδυάζει τη λειτουργικότητα της γλώσσας Compaq Visual Fortran (CVF) με τις βελτιώσεις απόδοσης που έγιναν δυνατές από τις τεχνολογίες βελτιστοποίησης μεταγλώττισης και δημιουργίας κώδικα της Intel και απλοποιεί το έργο της μεταφοράς πηγαίος κώδικας, που αναπτύχθηκε με CVF, στο περιβάλλον Intel Visual Fortran. Αυτός ο μεταγλωττιστής είναι ο πρώτος που εφαρμόζει λειτουργίες CVF τόσο για συστήματα Intel 32-bit όσο και για συστήματα που βασίζονται στην οικογένεια επεξεργαστών Intel Itanium που εκτελούνται σε περιβάλλον Windows. Επιπλέον, αυτός ο μεταγλωττιστής σάς επιτρέπει να εφαρμόσετε λειτουργίες γλώσσας CVF σε συστήματα Linux που βασίζονται σε επεξεργαστές Intel 32-bit και στην οικογένεια επεξεργαστών Intel Itanium. Το 2004, σχεδιάζεται να κυκλοφορήσει μια εκτεταμένη έκδοση αυτού του μεταγλωττιστή - του μεταγλωττιστή Intel Visual Fortran Compiler Professional Edition για Windows, ο οποίος θα περιλαμβάνει τη Βιβλιοθήκη IMSL Fortran 5.0 που αναπτύχθηκε από την Visual Numerics, Inc.


"Οι νέοι μεταγλωττιστές υποστηρίζουν επίσης τους επερχόμενους επεξεργαστές της Intel, με την κωδική ονομασία Prescott, οι οποίοι παρέχουν νέες εντολές για τη βελτίωση της απόδοσης γραφικών και βίντεο, καθώς και άλλες βελτιώσεις απόδοσης. Υποστηρίζουν επίσης νέα τεχνολογία Mobile MMX(tm), το οποίο βελτιώνει ομοίως την απόδοση των εφαρμογών γραφικών, ήχου και βίντεο για κινητά τηλέφωνα και PDA, - δήλωσε ο Alexei Odinokov, συνδιευθυντής του Κέντρου Ανάπτυξης Λογισμικού Intel στο Νίζνι Νόβγκοροντ. - Αυτοί οι μεταγλωττιστές παρέχουν στους προγραμματιστές εφαρμογών ένα ενιαίο σύνολο εργαλείων για τη δημιουργία νέων εφαρμογών ασύρματα δίκτυαβασίζεται στην αρχιτεκτονική της Intel. Οι νέοι μεταγλωττιστές της Intel υποστηρίζουν επίσης την τεχνολογία Hyper-Threading της Intel και τις βιομηχανικές προδιαγραφές OpenMP 2.0, οι οποίες καθορίζουν τη χρήση οδηγιών υψηλό επίπεδογια τον έλεγχο της ροής των οδηγιών στις εφαρμογές».

Μεταξύ των νέων εργαλείων που περιλαμβάνονται στους μεταγλωττιστές είναι τα εργαλεία Intel Code Coverage και Intel Test Prioritization. Μαζί, αυτά τα εργαλεία βοηθούν στην επιτάχυνση της ανάπτυξης εφαρμογών και βελτιώνουν την ποιότητα της εφαρμογής βελτιώνοντας τη διαδικασία δοκιμών. λογισμικό.

Το εργαλείο κάλυψης κώδικα, κατά τη δοκιμή μιας εφαρμογής, παρέχει πλήρεις λεπτομέρειες σχετικά με τη λογική χρήση της εφαρμογής και τη θέση των περιοχών που χρησιμοποιούνται στον πηγαίο κώδικα της εφαρμογής. Εάν γίνουν αλλαγές στην εφαρμογή ή εάν αυτή η δοκιμή δεν επιτρέπει τον έλεγχο του τμήματος της εφαρμογής που ενδιαφέρει τον προγραμματιστή, το εργαλείο Test Prioritization σάς επιτρέπει να ελέγξετε τη λειτουργία της επιλεγμένης περιοχής κώδικα προγράμματος.

Οι νέοι μεταγλωττιστές της Intel διατίθενται σε διάφορες διαμορφώσεις που κυμαίνονται από 399 $ έως 1.499 $. Μπορούν να αγοραστούν σήμερα από την Intel Corporation ή από μεταπωλητές σε όλο τον κόσμο, μια λίστα των οποίων βρίσκεται στον ιστότοπο. http://www.intel.com/software/products/reseller.htm#Russia.

Υποστήριξη για επεξεργαστές Prescott

Η υποστήριξη για τον επεξεργαστή Intel Pentium 4 (Prescott) στην όγδοη έκδοση του μεταγλωττιστή είναι η εξής:

1. Υποστήριξη για εντολές SSE3 (ή PNI, Prescott New Instructions). Υπάρχουν τρεις τρόποι για να τονίσετε εδώ:

ΕΝΑ. Ένθετα Assembler (Inline assembly). Για παράδειγμα, ο μεταγλωττιστής θα αναγνωρίσει την ακόλουθη χρήση της εντολής SSE3 _asm(addsubpd xmm0, xmm1). Έτσι, οι χρήστες που ενδιαφέρονται για βελτιστοποίηση χαμηλού επιπέδου μπορούν να έχουν άμεση πρόσβαση στις εντολές του assembler.

σι. Στον μεταγλωττιστή C/C++, νέες εντολές είναι διαθέσιμες από υψηλότερο επίπεδο από ό,τι χρησιμοποιώντας ένθετα assembler. Δηλαδή, μέσω ενσωματωμένων συναρτήσεων (εσωτερικές συναρτήσεις):

Ενσωματωμένες Λειτουργίες

ενσωματωμένη λειτουργίαΔημιουργήθηκε εντολή
_mm_addsub_psΠροσθέτει υποσυστήματα
_mm_hadd_psHaddps
_mm_hsub_psMsubps
_mm_moveldup_psMovsldup
_mm_movehdup_psMovshdup
_mm_addsub_pdΠροσθήκη subpd
_mm_hadd_pdHaddpd
_mm_hsub_pdhsubpd
_mm_loaddup_pdmovddup xmm, m64
_mm_movedup_pdmovddup reg, reg
_mm_lddqu_si128Lddqu

Ο πίνακας δείχνει τις ενσωματωμένες λειτουργίες και τις αντίστοιχες οδηγίες συναρμολόγησης από το σετ SSE3. Η ίδια υποστήριξη υπάρχει για εντολές από τα σύνολα MMX\SSE\SSE2. Αυτό επιτρέπει στον προγραμματιστή να εκτελεί βελτιστοποίηση κώδικα χαμηλού επιπέδου χωρίς να καταφεύγει σε προγραμματισμό γλώσσας συναρμολόγησης: ο ίδιος ο μεταγλωττιστής φροντίζει για την αντιστοίχιση (αντιστοίχιση "e) των ενσωματωμένων λειτουργιών στις αντίστοιχες οδηγίες του επεξεργαστή και τη βέλτιστη χρήση των καταχωρητών. επικεντρωθείτε στη δημιουργία ενός αλγορίθμου που χρησιμοποιεί αποτελεσματικά νέα σύνολα εντολών.

V. Αυτόματη δημιουργία νέων εντολών από τον μεταγλωττιστή. Οι δύο προηγούμενες μέθοδοι περιλαμβάνουν τη χρήση νέων εντολών από τον προγραμματιστή. Αλλά ο μεταγλωττιστής είναι επίσης σε θέση (χρησιμοποιώντας τις κατάλληλες επιλογές - βλέπε ενότητα 3 παρακάτω) να δημιουργεί αυτόματα νέες οδηγίες από το σύνολο SSE3 για τον κώδικα C/C++ και Fortran. Για παράδειγμα, η βελτιστοποιημένη εντολή φόρτωσης μη ευθυγραμμισμένης (lddqu), η οποία σας επιτρέπει να έχετε κέρδος απόδοσης έως και 40% (για παράδειγμα, σε εργασίες κωδικοποίησης βίντεο και ήχου). Άλλες εντολές από το σύνολο SSE3 σάς επιτρέπουν να επιτύχετε σημαντική επιτάχυνση σε εργασίες τρισδιάστατων γραφικών ή υπολογιστικές εργασίες χρησιμοποιώντας μιγαδικούς αριθμούς. Για παράδειγμα, το γράφημα στην ενότητα 3.1 παρακάτω δείχνει ότι για την εφαρμογή 168.wupwise από τη σουίτα SPEC CPU2000 FP, η επιτάχυνση που ελήφθη από την αυτόματη δημιουργία εντολών SSE3 ήταν ~25%. Η απόδοση αυτής της εφαρμογής εξαρτάται σε μεγάλο βαθμό από την ταχύτητα της αριθμητικής μιγαδικών αριθμών.

2. Χρησιμοποιώντας τα μικροαρχιτεκτονικά πλεονεκτήματα του επεξεργαστή Prescott. Κατά τη δημιουργία κώδικα, ο μεταγλωττιστής λαμβάνει υπόψη τις μικροαρχιτεκτονικές αλλαγές στον νέο επεξεργαστή. Για παράδειγμα, ορισμένες λειτουργίες (όπως μετατοπίσεις ακεραίων, πολλαπλασιασμοί ακεραίων ή μετατροπές αριθμών μεταξύ διαφορετικών μορφών κινητής υποδιαστολής στο SSE2) είναι πιο γρήγορες στον νέο επεξεργαστή σε σύγκριση με προηγούμενες εκδόσεις (ας πούμε, μια μετατόπιση ακεραίων απαιτεί τώρα έναν κύκλο επεξεργαστή έναντι τεσσάρων προηγούμενη έκδοση).Επεξεργαστής Intel Pentium 4). Η πιο εντατική χρήση τέτοιων εντολών σας επιτρέπει να έχετε σημαντική επιτάχυνση των εφαρμογών.
Ένα άλλο παράδειγμα μικροαρχιτεκτονικών αλλαγών είναι ο βελτιωμένος μηχανισμός προώθησης αποθήκευσης (ταχεία φόρτωση δεδομένων που είχαν αποθηκευτεί προηγουμένως στη μνήμη). Η πραγματική αποθήκευση δεν λαμβάνει χώρα καν στη μνήμη cache, αλλά σε κάποιο ενδιάμεσο buffer αποθήκευσης, το οποίο στη συνέχεια επιτρέπει πολύ γρήγορη πρόσβαση στα δεδομένα. Ένα τέτοιο χαρακτηριστικό της αρχιτεκτονικής καθιστά δυνατή, για παράδειγμα, την πραγματοποίηση πιο επιθετικής αυτόματης διανυσματοποίησης του κώδικα προγράμματος.
Ο μεταγλωττιστής λαμβάνει επίσης υπόψη την αυξημένη ποσότητα μνήμης cache στο πρώτο και το δεύτερο επίπεδο.

3. Βελτιωμένη υποστήριξη για τεχνολογία Hyper-Threading. Αυτό το στοιχείο μπορεί κάλλιστα να σχετίζεται με το προηγούμενο - μικροαρχιτεκτονικές αλλαγές και τη χρήση τους στον μεταγλωττιστή. Για παράδειγμα, μια βιβλιοθήκη χρόνου εκτέλεσης που υποστηρίζει τις βιομηχανικές προδιαγραφές OpenMP έχει βελτιστοποιηθεί ώστε να εκτελείται στον νέο επεξεργαστή.

Εκτέλεση

Η χρήση μεταγλωττιστών είναι ένας εύκολος και αποτελεσματικός τρόπος για να αξιοποιήσετε τις αρχιτεκτονικές επεξεργαστών της Intel. Παρακάτω, δύο τρόποι χρήσης μεταγλωττιστών επισημαίνονται υπό όρους (πολύ): α) η εκ νέου μεταγλώττιση προγραμμάτων με πιθανή αλλαγήρυθμίσεις μεταγλωττιστή, β) εκ νέου μεταγλώττιση με αλλαγή τόσο στις ρυθμίσεις του μεταγλωττιστή όσο και στο κείμενο προέλευσης, καθώς και με χρήση διαγνωστικών μεταγλωττιστή για συνεχείς βελτιστοποιήσεις και την πιθανή χρήση άλλων εργαλεία λογισμικού(για παράδειγμα, profilers).


1.1 Βελτιστοποίηση προγραμμάτων με εκ νέου μεταγλώττιση και αλλαγή ρυθμίσεων μεταγλωττιστή


Συχνά, το πρώτο βήμα για τη μετάβαση σε έναν νέο μεταγλωττιστή βελτιστοποίησης είναι η χρήση του με τις προεπιλεγμένες ρυθμίσεις. Το επόμενο λογικό βήμα είναι να χρησιμοποιήσετε επιλογές για πιο επιθετική βελτιστοποίηση. Τα σχήματα 1, 2, 3 και 4 δείχνουν το αποτέλεσμα της μετάβασης στην έκδοση 8.0 μεταγλωττιστή Intel σε σύγκριση με τη χρήση άλλων κορυφαίων προϊόντων του κλάδου (-O2 - προεπιλεγμένες ρυθμίσεις μεταγλωττιστή, βάση - ρυθμίσεις σε μέγιστη απόδοση). Η σύγκριση γίνεται σε αρχιτεκτονικές Intel 32-bit και 64-bit. Ως δοκιμαστικό σετ χρησιμοποιούνται εφαρμογές από το SPEC CPU2000.


Εικόνα 1




Σχήμα 2




Εικόνα 3




Εικόνα 4


Μερικές από τις επιλογές παρατίθενται παρακάτω (εφεξής, οι επιλογές είναι για την οικογένεια λειτουργικών συστημάτων Windows, για την οικογένεια λειτουργικών συστημάτων Linux, υπάρχουν επιλογές με το ίδιο αποτέλεσμα, αλλά το όνομα μπορεί να διαφέρει. για παράδειγμα, -Od ή QxK για Windows έχουν παρόμοιο αποτέλεσμα με -O0 ή -xK για Linux αντίστοιχα, περισσότερα λεπτομερείς πληροφορίεςμπορείτε να βρείτε στο εγχειρίδιο του μεταγλωττιστή) που υποστηρίζεται από τον μεταγλωττιστή της Intel.


Έλεγχος επιπέδων βελτιστοποίησης: Επιλογές -Od (χωρίς βελτιστοποιήσεις, χρησιμοποιείται για προγράμματα εντοπισμού σφαλμάτων), -O1 (μέγιστη ταχύτητα ελαχιστοποιώντας το μέγεθος κώδικα), -O2 (βελτιστοποίηση για ταχύτητα εκτέλεσης κώδικα, χρησιμοποιείται από προεπιλογή), -O3 (επιτρέπει τις πιο επιθετικές βελτιστοποιήσεις για την εκτέλεση κώδικα ταχύτητα, σε ορισμένες περιπτώσεις μπορεί να οδηγήσει στο αντίθετο αποτέλεσμα, δηλαδή σε επιβράδυνση· πρέπει να σημειωθεί ότι στο IA-64 η χρήση του -O3 οδηγεί σε επιτάχυνση στις περισσότερες περιπτώσεις, ενώ η θετική επίδραση στο IA-32 είναι λιγότερο έντονη ). Παραδείγματα βελτιστοποιήσεων που ενεργοποιούνται από το -O3 είναι η ανταλλαγή βρόχων, η σύντηξη βρόχου, η κατανομή βρόχου (βελτιστοποίηση σύντηξης αντίστροφου βρόχου), η προκαταρκτική λήψη δεδομένων από λογισμικό. Ο λόγος για τον οποίο η βραδύτητα είναι δυνατή όταν χρησιμοποιείται -O3 μπορεί να είναι ότι ο μεταγλωττιστής χρησιμοποίησε μια ευρετική προσέγγιση για να επιλέξει επιθετική βελτιστοποίηση για συγκεκριμένη περίπτωση, χωρίς να υπάρχουν επαρκείς πληροφορίες για το πρόγραμμα (για παράδειγμα, δημιουργήθηκαν οδηγίες προφόρτωσης για τα δεδομένα που χρησιμοποιούνται στον βρόχο, πιστεύοντας ότι ο βρόχος εκτελείται πολλές φορές, ενώ στην πραγματικότητα έχει μόνο λίγες επαναλήψεις). Η βελτιστοποίηση διαδικαστικού προφίλ, καθώς και μια ποικιλία "συμβουλών" προγραμματιστή (βλ. Ενότητα 3.2) μπορούν να βοηθήσουν σε αυτήν την κατάσταση.

Διαδικαστική βελτιστοποίηση: -Qip (εντός ενός μόνο αρχείου) και -Qipo (εντός πολλών ή όλων των αρχείων έργου). Περιλαμβάνει βελτιστοποιήσεις όπως, για παράδειγμα, ενσωματωμένη αντικατάσταση κώδικα που χρησιμοποιείται συχνά (μειώνοντας το κόστος κλήσης μιας συνάρτησης/διαδικασίας). Αντιπροσωπεύει πληροφορίες σε άλλα στάδια βελτιστοποίησης - για παράδειγμα, πληροφορίες σχετικά με το άνω όριο του βρόχου (για παράδειγμα, εάν είναι μια σταθερά χρόνου μεταγλώττισης που ορίζεται σε ένα αρχείο, αλλά χρησιμοποιείται σε πολλά) ή πληροφορίες σχετικά με την ευθυγράμμιση δεδομένων στη μνήμη (πολλά MMX Οι εντολές \SSE\SSE2\SSE3 λειτουργούν πιο γρήγορα εάν οι τελεστές είναι ευθυγραμμισμένοι στη μνήμη σε όριο 8 ή 16 byte). Η ανάλυση των διαδικασιών εκχώρησης μνήμης (που υλοποιείται/κλείται σε ένα από τα αρχεία έργου) μεταβιβάζεται σε εκείνες τις συναρτήσεις/διαδικασίες όπου χρησιμοποιείται αυτή η μνήμη (αυτό μπορεί να βοηθήσει τον μεταγλωττιστή να εγκαταλείψει τη συντηρητική υπόθεση ότι τα δεδομένα δεν είναι σωστά ευθυγραμμισμένα στη μνήμη. και η υπόθεση θα πρέπει να είναι συντηρητική όταν δεν υπάρχουν πρόσθετες πληροφορίες). Η αποσαφήνιση, η ανάλυση αλιοποίησης δεδομένων μπορεί να χρησιμεύσει ως ένα άλλο παράδειγμα: ελλείψει πρόσθετων πληροφοριών και αδυναμίας απόδειξης της απουσίας διασταυρώσεων, ο μεταγλωττιστής βασίζεται στη συντηρητική υπόθεση ότι υπάρχουν διασταυρώσεις. Μια τέτοια απόφαση μπορεί να επηρεάσει αρνητικά την ποιότητα τέτοιων βελτιστοποιήσεων όπως, για παράδειγμα, η αυτόματη διανυσματοποίηση στο IA-32 ή η διοχέτευση λογισμικού (σωλήνωση λογισμικού ή SWP) στο IA-64. Η διαδιαδικαστική βελτιστοποίηση μπορεί να βοηθήσει στην ανάλυση της παρουσίας διασταυρώσεων μνήμης.

Βελτιστοποίηση προφίλ: Περιλαμβάνει τρία στάδια. 1) δημιουργία κώδικα με όργανα χρησιμοποιώντας την επιλογή -Qprof_gen. 2) ο κώδικας που προκύπτει εκτελείται σε αντιπροσωπευτικά δεδομένα, ενώ εκτελείται, συλλέγονται πληροφορίες σχετικά με διάφορα χαρακτηριστικά εκτέλεσης κώδικα (για παράδειγμα, πιθανότητες μετάβασης ή μια τυπική τιμή για τον αριθμό των επαναλήψεων βρόχου). 3) Εκ νέου μεταγλώττιση με την επιλογή -Qprof_use, η οποία διασφαλίζει ότι ο μεταγλωττιστής χρησιμοποιεί τις πληροφορίες που συλλέχθηκαν στο προηγούμενο βήμα. Έτσι, ο μεταγλωττιστής έχει τη δυνατότητα να χρησιμοποιεί όχι μόνο στατικές εκτιμήσεις σημαντικών χαρακτηριστικών του προγράμματος, αλλά και δεδομένα που λαμβάνονται κατά τη διάρκεια μιας πραγματικής εκτέλεσης του προγράμματος. Αυτό μπορεί να βοηθήσει με την επακόλουθη επιλογή ορισμένων βελτιστοποιήσεων (για παράδειγμα, μια πιο αποτελεσματική διάταξη στη μνήμη διαφόρων κλάδων του προγράμματος, με βάση πληροφορίες σχετικά με το ποιοι κλάδοι εκτελέστηκαν σε ποια συχνότητα ή εφαρμογή μιας βελτιστοποίησης σε έναν βρόχο με βάση πληροφορίες σχετικά με ο τυπικός αριθμός επαναλήψεων σε αυτό) . Η βελτιστοποίηση προφίλ είναι ιδιαίτερα χρήσιμη όταν είναι δυνατό να επιλέξετε ένα μικρό αλλά αντιπροσωπευτικό σύνολο δεδομένων (για το βήμα #2) που απεικονίζει καλά τις πιο τυπικές περιπτώσεις μελλοντικής χρήσης του προγράμματος. Σε ορισμένες θεματικές περιοχές, η επιλογή ενός τέτοιου αντιπροσωπευτικού συνόλου είναι αρκετά δυνατή. Για παράδειγμα, η βελτιστοποίηση προφίλ χρησιμοποιείται από προγραμματιστές DBMS.

Οι βελτιστοποιήσεις που αναφέρονται παραπάνω είναι γενικού τύπου, δηλ. ο παραγόμενος κώδικας θα λειτουργεί σε όλους τους διαφορετικούς επεξεργαστές της οικογένειας (για παράδειγμα, στην περίπτωση αρχιτεκτονικής 32 bit, σε όλους τους παρακάτω επεξεργαστές: Intel Pentium-III, Pentium 4, συμπεριλαμβανομένου του πυρήνα Prescott, Intel Pentium M). Υπάρχουν επίσης βελτιστοποιήσεις για συγκεκριμένο επεξεργαστή.

Βελτιστοποιήσεις ειδικά για τον επεξεργαστή: -QxK (Pentium-III; χρήση εντολών SSE, χαρακτηριστικά μικροαρχιτεκτονικής), -QxW και -QxN (Pentium 4; χρήση εντολών SSE και SSE2, χαρακτηριστικά μικροαρχιτεκτονικής), -QxB (Pentium M; χρήση εντολών SSE και SSE2, microarchitecture specifics) ), QxP (Prescott; χρήση εντολών SSE, SSE2 και SSE3, χαρακτηριστικά μικροαρχιτεκτονικής). Σε αυτήν την περίπτωση, ο κώδικας που δημιουργείται με αυτές τις επιλογές ενδέχεται να μην λειτουργεί σε άλλους εκπροσώπους της οικογένειας επεξεργαστών (για παράδειγμα, ο κωδικός -QxW μπορεί να οδηγήσει στην εκτέλεση μιας μη έγκυρης εντολής εάν εκτελεστεί σε ένα σύστημα που βασίζεται σε Intel Pentium-III επεξεργαστής). Ή να μην λειτουργεί με τη μέγιστη απόδοση (για παράδειγμα, κωδικός -QxB σε επεξεργαστή Pentium 4 λόγω διαφορών στη μικροαρχιτεκτονική). Με αυτές τις επιλογές, είναι επίσης δυνατό να χρησιμοποιηθούν βιβλιοθήκες χρόνου εκτέλεσης βελτιστοποιημένες για έναν συγκεκριμένο επεξεργαστή χρησιμοποιώντας το σύνολο εντολών του. Για να ελεγχθεί ότι ο κώδικας εκτελείται πραγματικά στον επεξεργαστή-στόχο, εφαρμόζεται ένας μηχανισμός αποστολής (cpu-dispatch): έλεγχος του επεξεργαστή κατά την εκτέλεση του προγράμματος. Σε διάφορες καταστάσεις, αυτός ο μηχανισμός μπορεί είτε να ενεργοποιηθεί είτε όχι. Η αποστολή χρησιμοποιείται πάντα εάν χρησιμοποιείται η παραλλαγή της επιλογής -Qax(KWNP). Σε αυτήν την περίπτωση, δημιουργούνται δύο εκδόσεις του κώδικα: βελτιστοποιημένη για συγκεκριμένο επεξεργαστή και "γενική" (γενική), η επιλογή γίνεται κατά την εκτέλεση του προγράμματος. Έτσι, αυξάνοντας το μέγεθος του κώδικα, είναι δυνατό να επιτευχθεί εκτέλεση προγράμματος σε όλους τους επεξεργαστές της γραμμής και βέλτιστη εκτέλεση στον επεξεργαστή στόχο. Μια άλλη επιλογή είναι να χρησιμοποιήσετε τη βελτιστοποίηση κώδικα για τον προηγούμενο εκπρόσωπο της γραμμής και να χρησιμοποιήσετε αυτόν τον κώδικα σε αυτόν και σε επόμενους επεξεργαστές. Για παράδειγμα, ο κώδικας -QxN μπορεί να τρέξει σε Pentium 4 με πυρήνες Northwood και Prescott. Δεν υπάρχει αύξηση στο μέγεθος του κώδικα. Με αυτήν την προσέγγιση, μπορείτε να έχετε καλή, αλλά όχι βέλτιστη απόδοση σε ένα σύστημα με επεξεργαστή Prescott (επειδή δεν χρησιμοποιείται SSE3 και δεν λαμβάνονται υπόψη οι διαφορές μικροαρχιτεκτονικής) με βέλτιστη απόδοση στο Northwood. Παρόμοιες επιλογές υπάρχουν και για επεξεργαστές αρχιτεκτονικής IA-64. Επί αυτή τη στιγμήυπάρχουν δύο από αυτά: -G1 (Itanium) και -G2 (Itanium 2, προεπιλεγμένη επιλογή).

Το παρακάτω γράφημα (Εικόνα 5) δείχνει την επιτάχυνση (με βάση ένα - χωρίς επιτάχυνση) από τη χρήση ορισμένων από τις βελτιστοποιήσεις που αναφέρονται παραπάνω (δηλαδή -O3 -Qipo -Qprof_use -Qx(N,P)) σε έναν επεξεργαστή Prescott σε σύγκριση με τις προεπιλεγμένες ρυθμίσεις (-Ο2). Η χρήση -QxP βοηθά σε ορισμένες περιπτώσεις να επιτύχετε επιτάχυνση σε σύγκριση με -QxN. Η μεγαλύτερη επιτάχυνση επιτυγχάνεται στην εφαρμογή 168.wupwise που αναφέρθηκε ήδη στην προηγούμενη ενότητα (λόγω της εντατικής βελτιστοποίησης σύνθετης αριθμητικής με χρήση εντολών SSE3).


Εικόνα 5


Το σχήμα 6 παρακάτω δείχνει την αναλογία (σε φορές) της ταχύτητας του κώδικα με βέλτιστες ρυθμίσειςσε σύγκριση με τον εντελώς μη βελτιστοποιημένο κώδικα (-Od) στους επεξεργαστές Pentium 4 και Itanium 2. Μπορεί να φανεί ότι το Itanium 2 εξαρτάται πολύ περισσότερο από την ποιότητα της βελτιστοποίησης. Αυτό είναι ιδιαίτερα έντονο για τους υπολογισμούς κινητής υποδιαστολής (FP), όπου ο λόγος είναι περίπου 36 φορές. Οι υπολογισμοί κινητής υποδιαστολής είναι δυνατό σημείοΑρχιτεκτονικές IA-64, αλλά πρέπει να δίνεται προσοχή στη χρήση των πιο αποτελεσματικών ρυθμίσεων μεταγλωττιστή. Το προκύπτον κέρδος στην παραγωγικότητα πληρώνει την εργασία που δαπανάται για την εύρεση τους.


Εικόνα 6. Επιτάχυνση κατά τη χρήση των καλύτερων επιλογών βελτιστοποίησης SPEC CPU200


Οι μεταγλωττιστές της Intel υποστηρίζουν τις βιομηχανικές προδιαγραφές OpenMP για τη δημιουργία εφαρμογών πολλαπλών νημάτων. Υποστηρίζεται η ρητή (επιλογή -Qopenmp) και η αυτόματη (-Qparallel) παραλληλοποίηση. Στην περίπτωση της ρητής λειτουργίας, ο προγραμματιστής είναι υπεύθυνος για τη σωστή και αποτελεσματική χρήση του προτύπου OpenMP. Στην περίπτωση της αυτόματης παραλληλοποίησης, ο μεταγλωττιστής έχει ένα πρόσθετο βάρος που σχετίζεται με την ανάλυση του κώδικα του προγράμματος. Για το λόγο αυτό, προς το παρόν, η αυτόματη παραλληλοποίηση λειτουργεί αποτελεσματικά μόνο σε αρκετά απλούς κώδικες.

Το γράφημα στο Σχήμα 7 δείχνει την επιτάχυνση από τη χρήση σαφούς παραλληλισμού σε ένα σύστημα δειγμάτων μηχανικής (προπαραγωγής) που βασίζεται σε επεξεργαστή Intel Pentium 4 (Prescott) με υποστήριξη τεχνολογίας Hyper-Threading: 2,8 GHz, 2 GB RAM, 8K L1-Cache, 512K L2-Cache . Το SPEC OMPM2001 χρησιμοποιείται ως δοκιμαστική σουίτα. Αυτό το σετ εστιάζει σε μικρά και μεσαία συστήματα SMP, η κατανάλωση μνήμης είναι έως και δύο gigabyte. Οι εφαρμογές μεταγλωττίστηκαν χρησιμοποιώντας Intel 8.0 C/C++ και Fortran με δύο σετ επιλογών: -Qopenmp -Qipo -O3 -QxN και -Qopenmp -Qipo -O3 -QxP, με καθεμία από τις οποίες οι εφαρμογές ξεκίνησαν με το Hyper-Threading ενεργοποιημένο και απενεργοποιημένο . Οι τιμές επιτάχυνσης στο γράφημα κανονικοποιούνται στην απόδοση της έκδοσης με ένα νήμα με απενεργοποιημένο το Hyper-Threading.


Εικόνα 7: Εφαρμογές από τη σουίτα SPEC OMPM2001 σε επεξεργαστή Prescott


Μπορεί να φανεί ότι σε 9 από τις 11 περιπτώσεις, η χρήση ρητής παραλληλοποίησης χρησιμοποιώντας OpenMP δίνει ώθηση στην απόδοση όταν είναι ενεργοποιημένη η τεχνολογία Hyper-Threading. Μία εφαρμογή (312.swim) παρουσιάζει επιβράδυνση. Είναι γνωστό ότι αυτή η εφαρμογή χαρακτηρίζεται από υψηλό βαθμό εξάρτησης εύρος ζώνηςμνήμη. Όπως και με το SPEC CPU2000, το wupwise επωφελείται πολύ από τις βελτιστοποιήσεις Prescott (-QxP).


1.2 Βελτιστοποίηση προγραμμάτων με αλλαγές στον πηγαίο κώδικα και χρήση διαγνωστικών μεταγλωττιστή


Στις προηγούμενες ενότητες, εξετάσαμε την επίδραση του μεταγλωττιστή (και των ρυθμίσεών του) στην ταχύτητα εκτέλεσης του κώδικα. Ταυτόχρονα, οι μεταγλωττιστές της Intel παρέχουν περισσότερες ευκαιρίες για βελτιστοποίηση κώδικα παρά απλώς αλλαγή ρυθμίσεων. Συγκεκριμένα, οι μεταγλωττιστές επιτρέπουν στον προγραμματιστή να κάνει «υπαινιγμούς» στον κώδικα του προγράμματος, που επιτρέπουν τη δημιουργία πιο αποτελεσματικού κώδικα από άποψη απόδοσης. Παρακάτω είναι μερικά παραδείγματα για τη γλώσσα C/C++ (υπάρχουν παρόμοια εργαλεία για τη γλώσσα Fortran, που διαφέρουν μόνο στη σύνταξη).

Το #pragma ivdep (όπου ivdep σημαίνει παράβλεψη διανυσματικών εξαρτήσεων) χρησιμοποιείται πριν από τους βρόχους του προγράμματος για να πει στον μεταγλωττιστή ότι δεν υπάρχουν εξαρτήσεις δεδομένων μέσα. Αυτή η υπόδειξη λειτουργεί όταν ο μεταγλωττιστής (βάσει της ανάλυσης) υποθέτει συντηρητικά ότι τέτοιες εξαρτήσεις μπορεί να υπάρχουν (εάν ο μεταγλωττιστής μπορεί να αποδείξει ότι η εξάρτηση υπάρχει ως αποτέλεσμα της ανάλυσης, τότε η "υπόδειξη" δεν έχει αποτέλεσμα), ενώ ο συντάκτης κώδικα γνωρίζει ότι τέτοιες εξαρτήσεις δεν μπορούν να προκύψουν. Με αυτήν την υπόδειξη, ο μεταγλωττιστής μπορεί να δημιουργήσει πιο αποτελεσματικό κώδικα: αυτόματη διανυσματοποίηση για IA-32 (χρησιμοποιώντας διανυσματικές οδηγίες από τα σύνολα MMX\SSE\SSE2\SSE3 για βρόχους προγραμμάτων C/C++ και Fortran. μπορείτε να μάθετε περισσότερα για αυτήν την τεχνική, για παράδειγμα, επόμενο άρθρο στο Intel Technology Journal), διοχέτευση λογισμικού (SWP) για IA-64.

Το #pragma vector χρησιμοποιείται πάντα για να αναγκάσει τον μεταγλωττιστή να αλλάξει την απόφαση σχετικά με την αναποτελεσματικότητα της διανυσματοποίησης βρόχου (τόσο αυτόματο για το IA-32 όσο και το SWP για το IA-64), με βάση μια ανάλυση των ποσοτικών και ποιοτικών χαρακτηριστικών της εργασίας σε κάθε επανάληψη.

Το #pragma novector κάνει πάντα το αντίθετο από το #pragma vector.

Το #pragma vector aligned χρησιμοποιείται για να πει στον μεταγλωττιστή ότι τα δεδομένα που χρησιμοποιούνται στον βρόχο είναι ευθυγραμμισμένα σε ένα όριο 16 byte. Αυτό σας επιτρέπει να δημιουργήσετε πιο αποτελεσματικό και/ή πιο συμπαγή (λόγω της έλλειψης ελέγχων χρόνου εκτέλεσης) κώδικα.

Το #pragma vector unaligned κάνει το αντίθετο από το #pragma aligned. Είναι δύσκολο να μιλήσουμε για κέρδη απόδοσης σε αυτήν την περίπτωση, αλλά μπορείτε να βασιστείτε σε έναν πιο συμπαγή κώδικα.

Το σημείο διανομής #pragma χρησιμοποιείται μέσα στον βρόχο του προγράμματος, έτσι ώστε ο μεταγλωττιστής να μπορεί να χωρίσει τον βρόχο διανομής σε αυτό το σημείο σε πολλούς μικρότερους. Για παράδειγμα, μια τέτοια "υπόδειξη" μπορεί να χρησιμοποιηθεί όταν ο μεταγλωττιστής αποτυγχάνει να διανυσματοποιήσει αυτόματα τον βρόχο πηγής (για παράδειγμα, λόγω εξάρτησης δεδομένων που δεν μπορεί να αγνοηθεί ακόμη και με το #pragma ivdep), ενώ κάθε (ή μέρος) του νέου Οι σχηματισμένοι κύκλοι μπορούν να διανυσματοποιηθούν αποτελεσματικά.

Το #pragma loop count (N) χρησιμοποιείται για να πει στον μεταγλωττιστή ότι η πιο πιθανή τιμή για τον αριθμό των επαναλήψεων του βρόχου θα είναι N. Αυτές οι πληροφορίες βοηθούν να αποφασίσετε για την πιο αποτελεσματική βελτιστοποίηση για αυτόν τον βρόχο (για παράδειγμα, εάν θα ξετυλιχτεί , είτε να κάνετε SWP είτε να κάνετε αυτόματη διανυσματοποίηση, είτε να χρησιμοποιήσετε εντολές προφόρτωσης δεδομένων λογισμικού, ...)

Το "hint" _assume_aligned(p, base) χρησιμοποιείται για να πει στον μεταγλωττιστή ότι η περιοχή μνήμης που σχετίζεται με τον δείκτη p είναι ευθυγραμμισμένη σε μια βάση = όριο 2^n byte.

Αυτό απέχει πολύ από πλήρης λίσταδιάφορες «συμβουλές» προς τον μεταγλωττιστή, οι οποίες μπορούν να επηρεάσουν σημαντικά την αποτελεσματικότητα του παραγόμενου κώδικα. Μπορεί να προκύψει το ερώτημα πώς να προσδιορίσετε ότι ο μεταγλωττιστής χρειάζεται μια υπόδειξη.

Αρχικά, μπορείτε να χρησιμοποιήσετε τα διαγνωστικά μεταγλωττιστή με τη μορφή αναφορών που παρέχει στον προγραμματιστή. Για παράδειγμα, χρησιμοποιώντας την επιλογή -Qvec_reportN (όπου το N ποικίλλει από 0 έως 3 και αντιπροσωπεύει το επίπεδο λεπτομέρειας) μπορείτε να λάβετε μια αναφορά αυτόματης διανυσματικής διαμόρφωσης. Ο προγραμματιστής θα έχει πρόσβαση σε πληροφορίες σχετικά με το ποιοι βρόχοι έχουν διανυσματοποιηθεί και ποιοι όχι. Διαφορετικά, ο μεταγλωττιστής αναφέρει τους λόγους για τους οποίους απέτυχε η διανυσματοποίηση. Ας υποθέσουμε ότι η αιτία ήταν μια συντηρητικά υποτιθέμενη εξάρτηση από τα δεδομένα. Σε αυτήν την περίπτωση, εάν ο προγραμματιστής είναι σίγουρος ότι η εξάρτηση δεν μπορεί να συμβεί, τότε μπορεί να χρησιμοποιηθεί το #pragma ivdep. Ο Compiler παρέχει παρόμοιες (σε σύγκριση με το Qvec_reportN για IA-32) δυνατότητες στο IA-64 για τον έλεγχο της παρουσίας και της αποτελεσματικότητας του SWP. Γενικά, οι μεταγλωττιστές της Intel παρέχουν άφθονες ευκαιρίες για τη διάγνωση βελτιστοποιήσεων.

Δεύτερον, άλλα προϊόντα λογισμικού (όπως το Intel VTune profiler) μπορούν να χρησιμοποιηθούν για την εύρεση σημείων συμφόρησης απόδοσης στον κώδικα. Τα αποτελέσματα της ανάλυσης μπορούν να βοηθήσουν τον προγραμματιστή να κάνει τις απαραίτητες αλλαγές.

Μπορείτε επίσης να χρησιμοποιήσετε τη λίστα κώδικα assembler που δημιουργείται από τον μεταγλωττιστή για ανάλυση.


Εικόνα 8


Το σχήμα 8 παραπάνω δείχνει τη διαδικασία βήμα προς βήμα βελτιστοποίησης μιας εφαρμογής χρησιμοποιώντας έναν μεταγλωττιστή (και άλλα προϊόντα λογισμικού) Intel σε γλώσσα Fortran για αρχιτεκτονική IA-64. Ως παράδειγμα, θεωρείται ένα μη αδιαβατικό περιφερειακό σχήμα πρόβλεψης για 48 ώρες του Roshydrometcenter (μπορείτε να διαβάσετε σχετικά, για παράδειγμα, σε αυτό το άρθρο. Το άρθρο μιλά για τον χρόνο υπολογισμού των περίπου 25 λεπτών, αλλά έχουν σημειωθεί σημαντικές αλλαγές Από τότε που γράφτηκε. Η απόδοση κώδικα λαμβάνεται ως σημείο εκκίνησης σε ένα σύστημα Cray-YMP Ο μη τροποποιημένος κώδικας με προεπιλεγμένες επιλογές μεταγλωττιστή (-O2) έδειξε κέρδος απόδοσης 20% σε ένα σύστημα 4 κατευθύνσεων που βασίζεται σε ένα Intel Itanium 2 900 MHz επεξεργαστής Η εφαρμογή πιο επιθετικής βελτιστοποίησης (-O3) οδήγησε σε ~2,5x επιτάχυνση χωρίς αλλαγή του κώδικα, κυρίως λόγω του SWP και της ανάλυσης προφόρτωσης δεδομένων με χρήση διαγνωστικών μεταγλωττιστή και το προφίλ Intel VTune αποκάλυψε ορισμένα σημεία συμφόρησης Για παράδειγμα, ο μεταγλωττιστής δεν διοχέτευσε μέσω προγραμματισμού αρκετές επιδόσεις- κρίσιμοι βρόχοι, αναφέροντας στην αναφορά ότι προτείνει εξάρτηση δεδομένων. Μικρές αλλαγές στον κώδικα (οδηγία ivdep) βοήθησαν στην επίτευξη του αποτελέσματος ενεργητική μετάδοση. Χρησιμοποιώντας το πρόγραμμα προφίλ VTune, διαπιστώθηκε (και η αναφορά του μεταγλωττιστή το επιβεβαίωσε) ότι ο μεταγλωττιστής δεν άλλαξε τη σειρά των ένθετων βρόχων (εναλλαγή βρόχου) για πιο αποτελεσματική χρήση της κρυφής μνήμης. Ο λόγος ήταν και πάλι οι συντηρητικές υποθέσεις για την εξάρτηση από τα δεδομένα. Έχουν γίνει αλλαγές στον πηγαίο κώδικα του προγράμματος. Ως αποτέλεσμα, καταφέραμε να πετύχουμε 4πλάσια επιτάχυνση σε σχέση με την αρχική έκδοση. Χρησιμοποιώντας ρητή παραλληλοποίηση με οδηγίες OpenMP και μετά μετάβαση σε σύστημα με περισσότερα από υψηλή συχνότηταεπέτρεψε τη μείωση του χρόνου υπολογισμού σε λιγότερο από 8 λεπτά, γεγονός που έδωσε πάνω από 16 φορές μεγαλύτερη ταχύτητα σε σύγκριση με την αρχική έκδοση.

Intel Visual Fortran

Το Intel Visual Fortran 8.0 χρησιμοποιεί το front-end (μέρος του μεταγλωττιστή που είναι υπεύθυνο για τη μετατροπή του προγράμματος από κείμενο στη γλώσσα προγραμματισμού στην εσωτερική αναπαράσταση του μεταγλωττιστή, η οποία είναι σε μεγάλο βαθμό ανεξάρτητη είτε από τη γλώσσα προγραμματισμού είτε από τη μηχανή-στόχο), μεταγλωττιστή CVF τεχνολογίες και στοιχεία του μεταγλωττιστή Intel, υπεύθυνα για ένα σύνολο βελτιστοποιήσεων και δημιουργίας κώδικα.


Εικόνα 9




Εικόνα 10


Τα Σχήματα 9 και 10 δείχνουν γραφήματα σύγκρισης Απόδοση Intel Visual Fortran 8.0 με την προηγούμενη έκδοση του Intel Fortran 7.1 και με άλλους διάσημους μεταγλωττιστές από αυτήν τη γλώσσα που εκτελούνται υπό το λειτουργικό σύστημα Οικογένειες Windowsκαι Linux. Για σύγκριση, χρησιμοποιήθηκαν δοκιμές, τα κείμενα πηγής των οποίων, που πληρούν τα πρότυπα F77 και F90, είναι διαθέσιμα στη διεύθυνση http://www.polyhedron.com/. Στον ίδιο ιστότοπο, είναι διαθέσιμες πιο λεπτομερείς πληροφορίες σχετικά με τη σύγκριση της απόδοσης του μεταγλωττιστή (Σύγκριση μεταγλωττιστή Win32 -> Fortran (77, 90) Συγκρίσεις χρόνου εκτέλεσης και συγκρίσεις μεταγλωττιστών Linux -> Σημεία αναφοράς χρόνου εκτέλεσης Fortran (77, 90): περισσότεροι διαφορετικοί μεταγλωττιστές είναι φαίνεται και ο γεωμετρικός μέσος όρος δίνεται σε συνδυασμό με τα επιμέρους αποτελέσματα για κάθε δοκιμή.

Στο προηγούμενο τεύχος του περιοδικού, συζητήσαμε προϊόντα της οικογένειας Intel VTune Performance Analyzer - εργαλεία ανάλυσης απόδοσης που είναι επάξια δημοφιλή στους προγραμματιστές εφαρμογών και σας επιτρέπουν να εντοπίσετε στον κώδικα ομαδικές εφαρμογές, που καταναλώνει πάρα πολλούς πόρους επεξεργαστή, γεγονός που δίνει στους προγραμματιστές την ευκαιρία να εντοπίσουν και να εξαλείψουν πιθανά σημεία συμφόρησης που σχετίζονται με τέτοια τμήματα κώδικα, επιταχύνοντας έτσι τη διαδικασία ανάπτυξης εφαρμογών. Σημειώστε, ωστόσο, ότι η απόδοση των εφαρμογών εξαρτάται σε μεγάλο βαθμό από το πόσο αποτελεσματικοί είναι οι μεταγλωττιστές που χρησιμοποιούνται στην ανάπτυξή τους και ποιες δυνατότητες υλικού χρησιμοποιούν κατά τη δημιουργία κώδικα μηχανής.

Οι πιο πρόσφατοι μεταγλωττιστές Intel C++ και Intel Fortran για Windows και Linux παρέχουν έως και 40% κέρδη στην απόδοση εφαρμογών για συστήματα που βασίζονται σε επεξεργαστές Intel Itanium 2, Intel Xeon και Intel Pentium 4 σε σχέση με υπάρχοντες μεταγλωττιστές από άλλους προμηθευτές, χρησιμοποιώντας αυτές τις δυνατότητες επεξεργαστές, όπως η τεχνολογία Hyper-Threading.

Οι διαφορές που σχετίζονται με τη βελτιστοποίηση κώδικα από αυτήν την οικογένεια μεταγλωττιστών περιλαμβάνουν τη χρήση μιας στοίβας για την εκτέλεση λειτουργιών κινητής υποδιαστολής, τη διαδιαδικαστική βελτιστοποίηση (Interprocedural Optimization, IPO), τη βελτιστοποίηση σύμφωνα με το προφίλ της εφαρμογής (Profile Guided Optimization, PGO), την προφόρτωση δεδομένων σε την προσωρινή μνήμη (Προανάκτηση δεδομένων), η οποία αποφεύγει την καθυστέρηση που σχετίζεται με την πρόσβαση στη μνήμη, υποστήριξη για χαρακτηριστικά χαρακτηριστικά των επεξεργαστών Intel (για παράδειγμα, επεκτάσεις για επεξεργασία ροής δεδομένων Intel Streaming SIMD Extensions 2, ειδικά για το Intel Pentium 4), αυτόματη παραλληλοποίηση της εκτέλεσης κώδικα , δημιουργία εφαρμογών, που τρέχουν σε πολλαπλές ΔΙΑΦΟΡΕΤΙΚΟΙ ΤΥΠΟΙεπεξεργαστές κατά τη βελτιστοποίηση για ένα από αυτά, μέσα "πρόβλεψης" του επόμενου κώδικα (πρόβλεψη κλάδου), εκτεταμένη υποστήριξη για εργασία με νήματα εκτέλεσης.

Σημειώστε ότι οι μεταγλωττιστές της Intel χρησιμοποιούνται σε γνωστές εταιρείες όπως Alias/Wavefront, Oracle, Fujitsu Siemens, ABAQUS, Silicon Graphics, IBM. Βάσει ανεξάρτητων δοκιμών από έναν αριθμό εταιρειών, η απόδοση των μεταγλωττιστών Intel ξεπερνά σημαντικά τους μεταγλωττιστές άλλων κατασκευαστών (βλ., για παράδειγμα, http://intel.com/software/products/compilers/techtopics/compiler_gnu_perf.pdf).

Παρακάτω θα δούμε μερικά από τα χαρακτηριστικά πιο πρόσφατες εκδόσειςΜεταγλωττιστές Intel για επιτραπέζιους υπολογιστές και διακομιστή λειτουργικά συστήματα.

Μεταγλωττιστές για την πλατφόρμα Microsoft Windows

Intel C++ Compiler 7.1 για Windows

Το Intel C++ Compiler 7.1 είναι ένας μεταγλωττιστής που κυκλοφόρησε νωρίτερα φέτος και σας επιτρέπει να το επιτύχετε υψηλός βαθμόςβελτιστοποιήσεις κώδικα για τους επεξεργαστές Intel Itanium, Intel Itanium 2, Intel Pentium 4 και Intel Xeon, καθώς και για τον επεξεργαστή Intel Pentium M που χρησιμοποιεί τεχνολογία Intel Centrino και έχει σχεδιαστεί για χρήση σε κινητές συσκευές.

Ο καθορισμένος μεταγλωττιστής είναι πλήρως συμβατός με τα εργαλεία ανάπτυξης Microsoft Visual C++ 6.0 και Microsoft Visual Studio .NET: Μπορεί να ενσωματωθεί σε κατάλληλα περιβάλλοντα ανάπτυξης.

Αυτός ο μεταγλωττιστής υποστηρίζει τα πρότυπα ANSI και ISO C/C++.

Intel Fortran Compiler 7.1 για Windows

Το Intel Fortran Compiler 7.1 για Windows, που κυκλοφόρησε επίσης νωρίτερα φέτος, σας επιτρέπει να δημιουργήσετε βελτιστοποιημένο κώδικα για επεξεργαστές Intel Itanium, Intel Itanium 2, Intel Pentium 4 και Intel Xeon, Intel Pentium M.

Αυτός ο μεταγλωττιστής είναι πλήρως συμβατός με τα εργαλεία ανάπτυξης Microsoft Visual C++ 6.0 και Microsoft Visual Studio .NET, δηλαδή μπορεί να ενσωματωθεί στα αντίστοιχα περιβάλλοντα ανάπτυξης. Επιπλέον, αυτός ο μεταγλωττιστής σάς επιτρέπει να αναπτύξετε εφαρμογές 64-bit για λειτουργικά συστήματα που εκτελούνται σε επεξεργαστές Itanium / Itanium 2, με βοήθεια από τη Microsoft Visual Studio σε επεξεργαστή Pentium 32 bit που χρησιμοποιεί τον μεταγλωττιστή Intel Fortran 64 bit. Κατά τον εντοπισμό σφαλμάτων κώδικα, αυτός ο μεταγλωττιστής σάς επιτρέπει να χρησιμοποιείτε το πρόγραμμα εντοπισμού σφαλμάτων για την πλατφόρμα Microsoft .NET.

Εάν έχετε εγκατεστημένο το Compaq Visual Fortran 6.6, μπορείτε να χρησιμοποιήσετε το Intel Fortran Compiler 7.1 αντί για τον αρχικό μεταγλωττιστή επειδή αυτοί οι μεταγλωττιστές είναι συμβατοί σε επίπεδο πηγαίου κώδικα.

Το Intel Fortran Compiler 7.1 για Windows είναι πλήρως συμβατό με το πρότυπο ISO Fortran 95 και υποστηρίζει τη δημιουργία και τον εντοπισμό σφαλμάτων δίγλωσσων εφαρμογών C και Fortran.

Μεταγλωττιστές για την πλατφόρμα Linux

Intel C++ Compiler 7.1 για Linux

Ένας άλλος μεταγλωττιστής που κυκλοφόρησε στις αρχές του έτους, ο Intel C++ Compiler 7.1 για Linux, σας επιτρέπει να επιτύχετε υψηλό βαθμό βελτιστοποίησης κώδικα για επεξεργαστές Intel Itanium, Intel Itanium 2, Intel Pentium 4, Intel Pentium M. Αυτός ο μεταγλωττιστής είναι πλήρως συμβατό με τον μεταγλωττιστή GNU C σε ενότητες πηγαίου κώδικα και αντικειμένου επιπέδου, επιτρέποντας τη μετεγκατάσταση εφαρμογών που έχουν δημιουργηθεί με GNU C χωρίς επιπλέον κόστος. λειτουργικά συστήματα SCO, πρώιμες εκδόσεις του Sun Solaris κ.λπ.), που σημαίνει πλήρη συμβατότητα με ο μεταγλωττιστής gcc 3.2 σε δυαδικό επίπεδο. Τέλος, με το Intel C++ Compiler 7.1 για Linux, μπορείτε ακόμη και να μεταγλωττίσετε εκ νέου τον πυρήνα του Linux με μερικές μικρές αλλαγές στον πηγαίο κώδικα του.

Intel Fortran Compiler 7.1 για Linux

Ο μεταγλωττιστής Intel Fortran Compiler 7.1 για Linux σάς επιτρέπει να δημιουργείτε βελτιστοποιημένο κώδικα για επεξεργαστές Intel Itanium, Intel Itanium 2, Intel Pentium 4, Intel Pentium M. Αυτός ο μεταγλωττιστής είναι πλήρως συμβατός με τον μεταγλωττιστή Compaq Visual Fortran 6.6 σε επίπεδο πηγαίου κώδικα, επιτρέποντας μπορείτε να μεταγλωττίσετε εκ νέου εφαρμογές με αυτό που δημιουργήθηκαν με το Compaq Visual Fortran, βελτιώνοντας έτσι την απόδοσή τους.

Επιπλέον, ο καθορισμένος μεταγλωττιστής είναι συμβατός με βοηθητικά προγράμματα που χρησιμοποιούνται από προγραμματιστές, όπως το πρόγραμμα επεξεργασίας emacs, το πρόγραμμα εντοπισμού σφαλμάτων gdb και το βοηθητικό πρόγραμμα δημιουργίας εφαρμογής make.

Όπως και η έκδοση Windows αυτού του μεταγλωττιστή, το Intel Fortran Compiler 7.1 για Linux είναι πλήρως συμβατό με το πρότυπο ISO Fortran 95 και υποστηρίζει τη δημιουργία και τον εντοπισμό σφαλμάτων εφαρμογών που περιέχουν κώδικα σε δύο γλώσσες C και Fortran.

Πρέπει να τονιστεί ότι σημαντική συνεισφορά στη δημιουργία των καταγεγραμμένων μεταγλωττιστών Intel είχαν ειδικοί Ρωσικό Κέντρο Intel για ανάπτυξη λογισμικού στο Nizhny Novgorod. Περισσότερες πληροφορίες σχετικά με τους μεταγλωττιστές της Intel μπορείτε να βρείτε στον ιστότοπο της Intel στη διεύθυνση: www.intel.com/software/products/.

Το δεύτερο μέρος αυτού του άρθρου θα αφιερωθεί στους μεταγλωττιστές της Intel που δημιουργούν εφαρμογές για φορητές συσκευές.

Παραδείγματα πραγματικών hacks: Intel C++ 7.0 Compiler — Αρχείο WASM.RU

…ο μεταγλωττιστής Intel C++ 7.0 κατέβηκε αργά το βράδυ, γύρω στις 5:00 το πρωί. Ήθελα να κοιμηθώ απίστευτα, αλλά η περιέργεια: αν η προστασία ήταν ενισχυμένη ή όχι, έσπασε επίσης. Αποφασίζοντας ότι μέχρι να ασχοληθώ με την προστασία, δεν θα με πάρει ο ύπνος, έχω ανοίξει νέα κονσόλα, και επανεγκαθιστώντας τις μεταβλητές συστήματος TEMP και TMP στον κατάλογο C:\TEMP, πληκτρολογήστε βιαστικά το όνομα του προγράμματος εγκατάστασης W_CC_P_7.0.073.exe με απρεπώς μεγάλο μήκος γραμμή εντολών(Η ανάγκη ρύθμισης των μεταβλητών TEMP και TMP οφείλεται στο γεγονός ότι στα Windows 2000 δείχνουν από προεπιλογή έναν πολύ βαθιά ένθετο κατάλογο και το πρόγραμμα εγκατάστασης Intel C ++ - και όχι μόνο αυτό - δεν υποστηρίζει τόσο τεράστιες διαδρομές) .

Αμέσως έγινε σαφές ότι η πολιτική προστασίας είχε αναθεωρηθεί ριζικά και τώρα η παρουσία άδειας ελέγχθηκε ήδη στο στάδιο της εγκατάστασης του προγράμματος (στην έκδοση 5.x, η εγκατάσταση πραγματοποιήθηκε χωρίς προβλήματα). Εντάξει, δίνουμε την εντολή dir και κοιτάμε το περιεχόμενο αυτού που πρέπει να πολεμήσουμε τώρα:

    Περιεχόμενα του φακέλου C:\TMP\IntelC++Compiler70

    17.03.2003 05:10

    html

    17.03.2003 05:11

    x86

    17.03.2003 05:11

    Itanium

    17.03.2003 05:11

    σημειώσεις

    06/05/2002 10:35 45 056 AutoRun.exe

    07/10/2001 12:56 27 autorun.inf

    29/10/2002 11:25 π.μ. 2.831 ccompindex.htm

    24/10/2002 08:12 126 976 ChkLic.dll

    18/10/2002 10:37 552 960 chklic.exe

    17/10/2002 04:29 PM 28.663 CLicense.rtf

    17/10/2002 16:35 386 credist.txt

    16.10.2002 17:02 34 136 Crelnotes.htm

    19/03/2002 02:28 PM 4.635 PLSuite.htm

    21.02.2002 12:39 2 478 register.htm

    02.10.2002 14:51 40 960 Setup.exe

    02.10.2002 10:40 151 Setup.ini

    10.07.2001 12:56 184 setup.mwg

    19 αρχεία 2.519.238 byte

    6 φάκελοι 886 571 008 byte δωρεάν

Αχα! Το πρόγραμμα εγκατάστασης setup.exe χρειάζεται μόνο σαράντα κιλομπάιτ. Πολύ καλά! Δύσκολα μπορείς να κρύψεις σοβαρή προστασία σε έναν τέτοιο τόμο, και ακόμα κι αν ναι, αυτό το μικροσκοπικό αρχείο δεν κοστίζει τίποτα να αναλυθεί στο σύνολό του - μέχρι το τελευταίο byte της λίστας αποσυναρμολόγησης. Ωστόσο, δεν είναι γεγονός ότι ο κωδικός ασφαλείας βρίσκεται ακριβώς στο setup.exe, μπορεί να βρίσκεται σε άλλο μέρος, για παράδειγμα ... ChkLic.dll / ChkLic.exe, τα οποία μαζί καταλαμβάνουν κάτι λιγότερο από επτακόσια kilobyte . Περιμένετε, τι είναι το ChkLic; Είναι συντομογραφία για Έλεγχος άδειας; Χμ, τα παιδιά της Intel έχουν προφανώς σοβαρά προβλήματα με την αίσθηση του χιούμορ. Θα ήταν καλύτερα να αποκαλούσαν αυτό το αρχείο "Hack Me" ειλικρινά! Λοιπόν, αν κρίνουμε από τον όγκο, το ChkLic είναι το ίδιο FLEX lm και το έχουμε ήδη συναντήσει (βλ. "Intel C++ 5.0 Compiler") και περίπου φανταστείτε πώς να το σπάσουμε.

Δίνουμε την εντολή "dumpbin / EXPORTS ChkLic.dll" για να εξετάσουμε τις εξαγόμενες λειτουργίες και ... κρατήστε σφιχτά το Klava για να μην πέσετε από την καρέκλα:

    Απόρριψη του αρχείου ChkLic.dll

  1. Η ενότητα περιέχει τις ακόλουθες εξαγωγές για το ChkLic.dll

    0 χαρακτηριστικά

    3DB438B4 σφραγίδα ημερομηνίας ώρας Δευτ. 21 Οκτωβρίου 21:26:12 2002

  2. 1 αριθμός λειτουργιών

    1 αριθμός ονομάτων

    τακτική υπόδειξη Όνομα RVA

    1 0 000010A0_CheckValidLicense

Ανάθεμα! Η προστασία εξάγει μόνο μία λειτουργία με το υπέροχο όνομα CheckValidLicense. "Σημαντικό" - επειδή ο σκοπός της συνάρτησης γίνεται σαφής από το όνομά της και καθίσταται δυνατό να αποφευχθεί η επίπονη ανάλυση του κώδικα αποσυναρμολόγησης. Λοιπόν, κέρδισαν ξανά κάθε ενδιαφέρον ... θα ήταν καλύτερα να το εξάγουν σε διαταγή ή κάτι τέτοιο, ή τουλάχιστον να το βάφτιζαν με κάποιο τρομακτικό όνομα όπως το DES Decrypt.

...ονειρεύομαι! Εντάξει, πίσω στα πρόβατά μας. Ας σκεφτούμε λογικά: εάν όλος ο κωδικός ασφαλείας βρίσκεται απευθείας στο ChkLic.dll (και, αν κρίνουμε από την "αρθρωτή" φύση της ασφάλειας, αυτό είναι αλήθεια), τότε όλη η "προστασία" καταλήγει στην κλήση του CheckValidLicense από το Setup.exe και ελέγχοντας το αποτέλεσμα που επιστράφηκε από αυτό. Επομένως, για να "χακάρετε" αρκεί απλώς να επιδιορθώσετε το ChkLic.dll, αναγκάζοντας τη συνάρτηση ChekValidLicense να επιστρέφει πάντα ... παρεμπιπτόντως, τι πρέπει να επιστρέψει; Πιο συγκεκριμένα: ποια ακριβώς είναι η επιστρεφόμενη τιμή που αντιστοιχεί σε έναν επιτυχημένο έλεγχο άδειας; Όχι, μην βιαστείτε να αποσυναρμολογήσετε το setup.exe για να το μάθετε, γιατί δεν υπάρχουν τόσες πολλές πιθανές επιλογές: είτε FALSE είτε TRUE. Στοιχηματίζετε στο TRUE; Λοιπόν, κατά μία έννοια, αυτό είναι λογικό, αλλά από την άλλη πλευρά: γιατί στην πραγματικότητα αποφασίσαμε ότι η συνάρτηση CheckValidLicense επιστρέφει ακριβώς τη σημαία επιτυχίας της λειτουργίας και όχι τον κωδικό σφάλματος; Σε τελική ανάλυση, πρέπει με κάποιο τρόπο να παρακινήσει τους λόγους για την άρνηση εγκατάστασης του μεταγλωττιστή: το αρχείο με την άδεια δεν βρέθηκε, το αρχείο είναι κατεστραμμένο, η άδεια χρήσης έχει λήξει και ούτω καθεξής; Εντάξει, ας προσπαθήσουμε να επιστρέψουμε ένα μηδέν, και αν αυτό δεν λειτουργήσει, θα επιστρέψουμε ένα.

Εντάξει, κουμπώστε, πάμε! Εκκινούμε το HIEW, ανοίγουμε το αρχείο ChkLic.dll (αν δεν ανοίξει, θυμηθείτε τα gophers τρεις φορές, αντιγράψτε προσωρινά στη ρίζα ή σε οποιονδήποτε άλλο κατάλογο που δεν περιέχει ειδικούς χαρακτήρες στο όνομά του που δεν αρέσει στο hiew "y" Έπειτα, γυρίζοντας ξανά στον πίνακα εξαγωγής που λαμβάνεται με χρήση dumpbin, προσδιορίζουμε τη διεύθυνση της συνάρτησης CheckValidLicense (στην περίπτωση αυτή, 010A0h) και μέσω του "10A0" πηγαίνουμε στην αρχή του. Τώρα, τον κόβουμε ζωντανά, αντικαθιστώντας πάνω από τον παλιό κωδικό "XOR EAX, EAX / RETN 4. Γιατί ακριβώς "REN 4", και όχι μόνο "RET"; Ναι, επειδή η συνάρτηση υποστηρίζει τη σύμβαση stdcall, την οποία μπορείτε να μάθετε κοιτάζοντας τον επίλογό της στο HIEW " e (απλώς μετακινηθείτε προς τα κάτω στην οθόνη αποσυναρμολόγησης μέχρι να συναντήσετε το RET).

Έλεγχος... Λειτουργεί!!! Παρά την απουσία άδειας, ο εγκαταστάτης ξεκινά την εγκατάσταση χωρίς να κάνει πολλές ερωτήσεις! Άρα η άμυνα έχει πέσει. Ω, δεν μπορούμε να πιστέψουμε ότι όλα είναι τόσο απλά και για να μην καθόμαστε, κοιτάζοντας άδεια την οθόνη ενώ περιμένουμε να ολοκληρωθεί η διαδικασία εγκατάστασης του προγράμματος, ρυθμίσαμε τον αγαπημένο μας αποσυναρμολογητή IDA στο setup.exe. Το πρώτο πράγμα που τραβάει την προσοχή σας είναι η απουσία CheckValidLicense στη λίστα των εισαγόμενων συναρτήσεων. Ίσως εκκινεί με κάποιο τρόπο το αρχείο ChkLic.exe; Ας προσπαθήσουμε να βρούμε τον κατάλληλο σύνδεσμο μεταξύ των συμβολοσειρών που αναγνωρίζονται αυτόματα: "~View aNames", "ChkLic"... ναι, η συμβολοσειρά "Chklic.exe" δεν είναι καθόλου εδώ, αλλά βρίσκεται το "Chklic.dll". Ναι, βλέπω, αυτό σημαίνει ότι η βιβλιοθήκη ChkLic φορτώνεται με ρητή σύνδεση μέσω του LoadLibrary. Και ακολουθώντας τη διασταύρωση το επιβεβαιώνει:

    Κείμενο:0040175D push offset aChklic_dll ; lpLibFileName

    Κείμενο:00401762 κλήση ds:LoadLibraryA

    Κείμενο:00401762 ; φορτώστε το ChkLic.dll ^^^^^^^^^^^^^^^^^^

    Κείμενο:00401762 ;

    Κείμενο:00401768 mov esi,eax

    Κείμενο:0040176A push offset a_checkvalidlic ; lpProcName

    Κείμενο:0040176F push esi ; hModule

    Κείμενο:00401770 κλήση ds:GetProcAddress

    Κείμενο:00401770 ; λάβετε τη διεύθυνση της συνάρτησης CheckValidLicense

    Κείμενο:00401770 ;

    Κείμενο:00401776 cmp esi, ebx

    Κείμενο:00401778 jz loc_40192E

    Κείμενο:00401778 ; εάν δεν υπάρχει τέτοια βιβλιοθήκη, τότε βγείτε από το πρόγραμμα εγκατάστασης

    Κείμενο:00401778 ;

    Κείμενο:0040177E cmp eax, ebx

    Κείμενο:00401780 jz loc_40192E

    Κείμενο:00401780 ; εάν δεν υπάρχει τέτοια λειτουργία στη βιβλιοθήκη, τότε βγείτε από την εγκατάσταση

    Κείμενο:00401780 ;

    Κείμενο:00401786 push ebx

    Κείμενο:00401787 κλήση eax

    Κείμενο:00401787 ; καλέστε τη συνάρτηση CheckValidLicense

    Κείμενο:00401787 ;

    Κείμενο:00401789 test eax, eax

    Κείμενο:0040178B jnz loc_4019A3

Κείμενο:0040178 ; εάν η συνάρτηση δεν είναι μηδενική, τότε βγείτε από το πρόγραμμα εγκατάστασης

Απίστευτα, αυτή η τρομερά πρωτόγονη άμυνα είναι χτισμένη ακριβώς έτσι! Επιπλέον, το αρχείο ChkLic.exe μισού μέτρου δεν χρειάζεται καθόλου! Και γιατί άξιζε να το σύρετε από το Διαδίκτυο; Παρεμπιπτόντως, εάν αποφασίσετε να αποθηκεύσετε τη διανομή του μεταγλωττιστή (προσοχή: δεν είπα "διανομή"!), τότε για να εξοικονομήσετε χώρο στο δίσκο, μπορείτε να διαγράψετε το ChkLic. ChkLic.dll, το οποίο εξάγει τη συνάρτηση stdcall CheckValidLicence της φόρμας: int CheckValidLicence(int some_flag) (επιστροφή 0;)

Έτσι, ενώ συζητούσαμε όλα αυτά, το πρόγραμμα εγκατάστασης ολοκλήρωσε την εγκατάσταση του μεταγλωττιστή και ολοκλήρωσε με επιτυχία την εργασία του. Είτε είναι ενδιαφέρον εάν ο μεταγλωττιστής θα ξεκινήσει ή όλα τα πιο ενδιαφέροντα μόλις ξεκινούν; Κατεβαίνουμε πυρετωδώς τη διακλαδισμένη ιεραρχία των ένθετων φακέλων, βρίσκουμε το icl.exe, το οποίο, όπως ήταν αναμενόμενο, βρίσκεται στον κατάλογο bin, κάνουμε κλικ και ... Ο μεταγλωττιστής φυσικά δεν ξεκινά, αναφερόμενος στο γεγονός ότι "icl: error: δεν μπόρεσε να κάνει checkout άδεια FLEX lm» χωρίς την οποία δεν μπορεί να συνεχίσει την εργασία του.

Αποδεικνύεται ότι η Intel εφάρμοσε προστασία πολλαπλών επιπέδων και το πρώτο επίπεδο αποδείχθηκε ότι ήταν μια σκληρή άμυνα ενάντια στους ανόητους. Καλά! Αποδεχόμαστε αυτήν την πρόκληση και, με βάση την προηγούμενη εμπειρία μας, αναζητούμε αυτόματα το αρχείο LMGR*.DLL στον κατάλογο του μεταγλωττιστή. Αχρηστος! Αυτή τη φορά, δεν υπάρχει τέτοιο αρχείο εδώ, αλλά αποδεικνύεται ότι το icl.exe έχει κερδίσει πολύ βάρος, ξεπερνώντας το σημάδι των εξακόσιων kilobyte ... Σταματήστε! Αλλά οι προγραμματιστές του μεταγλωττιστή συνέδεσαν αυτό ακριβώς το FLEX lm με μια στατική σύνδεση; Εξετάζουμε: στην Intel C++ 5.0, το άθροισμα των μεγεθών των lmgr327.dll και icl.exe ήταν 598 KB και τώρα μόνο το icl.exe παίρνει 684 KB. Μετά την προσαρμογή για τη φυσική γεροντική «παχυσαρκία», οι αριθμοί συγκλίνουν πολύ καλά. Λοιπόν, τελικά, FLEX lm! Ωχ Ώχ! Αλλά τώρα, χωρίς τις συμβολικές ονομασίες των λειτουργιών, θα είναι πολύ πιο δύσκολο να σπάσει η προστασία ... Ωστόσο, ας μην πανικοβάλλουμε εκ των προτέρων! Ας σκεφτούμε μόνο ήρεμα! Είναι απίθανο η ομάδα ανάπτυξης να ξαναέγραψε πλήρως όλο τον κώδικα που αλληλεπιδρά με αυτήν την προστασία "φάκελου". Πιθανότατα, η «βελτίωσή» του με την απλή αλλαγή του τύπου διάταξης τελείωσε. Και αν ναι, τότε οι πιθανότητες να χακάρετε το πρόγραμμα είναι ακόμα μεγάλες!

Έχοντας υπόψη ότι η τελευταία φορά που εισήχθη ο κωδικός ασφαλείας κύριες λειτουργίες, αφού καθορίσαμε τη διεύθυνσή του, ορίσαμε απλώς ένα σημείο διακοπής και, αφού περιμέναμε να εμφανιστεί το πρόγραμμα εντοπισμού σφαλμάτων, ανιχνεύουμε ανόητα τον κώδικα, κοιτάζοντας εναλλακτικά είτε στον εντοπισμό σφαλμάτων είτε στο παράθυρο εξόδου του προγράμματος: εμφανίστηκε ένα καταχρηστικό μήνυμα εκεί; Ταυτόχρονα, σημειώνουμε όλα τα άλματα υπό όρους που συναντάμε σε ένα ξεχωριστό κομμάτι χαρτί (ή το αφήνουμε στην άκρη στη μνήμη μας, αν το επιθυμείτε), χωρίς να ξεχνάμε να υποδείξουμε εάν κάθε άλμα υπό όρους εκτελέστηκε ή όχι. .. Να σταματήσει! Κάτι κουβεντιάσαμε, αλλά το υβριστικό μήνυμα έχει ήδη εμφανιστεί! Εντάξει καλά! Ας δούμε ποια μετάβαση υπό όρους αντιστοιχούσε σε αυτό. Τα αρχεία μας δείχνουν ότι ο τελευταίος κλάδος που συναντήθηκε ήταν ο κλάδος υπό όρους JNZ, που βρίσκεται στη διεύθυνση 0401075h και "αντιδρά" στο αποτέλεσμα που επιστράφηκε από το sub_404C0E:

  • Κείμενο:0040107F loc_40107F: ; ΚΩΔΙΚΟΣ XREF: _main+75^j

    Κείμενο:0040107F mov eax, offset aFfrps ; "FFrps"

    Κείμενο:00401084 mov edx, 21h

    Κείμενο:00401089 κλήση sub_404C0E

    Κείμενο:0040108E test eax, eax

    Κείμενο:00401090 jnz short loc_40109A

    Προφανώς, το sub_404C0E είναι η ίδια προστατευτική διαδικασία που ελέγχει την άδεια για την παρουσία της. Πώς να την ξεγελάσεις; Λοιπόν, υπάρχουν πολλές επιλογές... Αρχικά, μπορείτε να αναλύσετε προσεκτικά και σχολαστικά τα περιεχόμενα του sub_404C0E για να μάθετε: τι ακριβώς και πώς ακριβώς ελέγχει. Δεύτερον, μπορείτε απλά να αντικαταστήσετε το JNZ ​​short loc_40107F με JZ short loc_40107F ή ακόμα και NOP, NOP. Τρίτον, η εντολή για τον έλεγχο του αποτελέσματος επιστροφής TEST EAX, EAX μπορεί να μετατραπεί σε εντολή μηδενικής ρύθμισης: XOR EAX, EAX. Τέταρτον, το ίδιο το sub_404C0E μπορεί να επιδιορθωθεί έτσι ώστε να επιστρέφει πάντα το μηδέν. Δεν ξέρω για εσάς, αλλά μου άρεσε περισσότερο η μέθοδος νούμερο τρία. Αλλάζουμε δύο byte και ξεκινάμε τον μεταγλωττιστή. Εάν δεν υπάρχουν άλλοι έλεγχοι της «άδειας» του στην προστασία, τότε το πρόγραμμα θα λειτουργήσει και, κατά συνέπεια, το αντίστροφο. (Όπως θυμόμαστε, υπήρχαν δύο τέτοιοι έλεγχοι στην πέμπτη έκδοση). Είναι καταπληκτικό, αλλά ο μεταγλωττιστής πλέον δεν βρίζει και δουλεύει!!! Πράγματι, όπως ήταν αναμενόμενο, οι προγραμματιστές του δεν ενίσχυσαν καθόλου την προστασία, αλλά, αντίθετα, την αποδυνάμωσαν κιόλας! Κρις Κάσπερσκι



  • Φόρτωση...
    Μπλουζα