Προγραμματισμός

Γνώση Υπολογιστών >> Προγραμματισμός >  >> Προγραμματισμός C / C++

Πώς μπορώ να βελτιστοποιήσω τον κωδικό μου για τους υπολογισμούς Fast Math χρησιμοποιώντας τον μεταγλωττιστή GCC;

Η βελτιστοποίηση του κώδικα για τους υπολογισμούς Fast Math με το GCC περιλαμβάνει διάφορες στρατηγικές, στοχεύοντας σε διαφορετικές πτυχές της διαδικασίας συλλογής και τον ίδιο τον κώδικα σας. Ακολουθεί μια κατανομή αποτελεσματικών τεχνικών:

1. Σημαίες μεταγλωττιστή:

Αυτές είναι οι πιο επιθετικές βελτιστοποιήσεις. Τους προσθέτετε στη γραμμή εντολών σύνταξης (π.χ., `g ++ -O3 -FFAST -MATH ...`).

* `-o`,` -o2`, `-o3`,` -ofast`: Αυτές οι σημαίες ελέγχουν το επίπεδο βελτιστοποίησης. Το `-o` είναι μια βασική βελτιστοποίηση, το` -o2` είναι μια καλή ισορροπία ταχύτητας και χρόνου συλλογής, το `-O3` είναι επιθετική βελτιστοποίηση και το` -Ofast` επιτρέπει ακόμη πιο επιθετικές βελτιστοποιήσεις, ενδεχομένως παραβιάζοντας το IEEE 754 πρότυπα για την αριθμητική πλωτή σημεία (βλ. Παρακάτω). Ξεκινήστε με `-O2` ή` -O3` εκτός αν έχετε συγκεκριμένους λόγους να μην το κάνετε.

* `-ffast-math`: Αυτό είναι κρίσιμο για τα γρήγορα μαθηματικά. Επιτρέπει αρκετές άλλες βελτιστοποιήσεις που μπορούν να επιταχύνουν σημαντικά τους υπολογισμούς, αλλά μπορεί να θέσουν σε κίνδυνο την αυστηρή ακρίβεια που απαιτείται από το IEEE 754:

* Αναδιάταξη λειτουργιών: Το GCC μπορεί να αναδιατάξει τους υπολογισμούς για τη βελτίωση της αποτελεσματικότητας, ακόμη και αν αλλάξει ελαφρώς το αποτέλεσμα λόγω περιορισμών ακριβείας κυμαινόμενου σημείου.

* Χρήση ταχύτερων αλλά λιγότερο ακριβών μαθηματικών λειτουργιών: Μπορεί να αντικαταστήσει τις τυποποιημένες λειτουργίες μαθηματικών (όπως το `sin ',' cos ',' exp ') με ταχύτερες προσεγγίσεις.

* Οι εργασίες υποθέσεων είναι συσχετιστικές και διανεμητικές: Αυτό επιτρέπει περαιτέρω αναδιάταξη και απλούστευση.

* Χαλαρωτικό αυστηροί κανόνες ψευδώνυμου: Αυτό μπορεί να βοηθήσει τον μεταγλωττιστή να κάνει καλύτερες βελτιστοποιήσεις σε διαφορετικούς τύπους δεδομένων.

* `-march =native`: Αυτή η σημαία λέει στον μεταγλωττιστή να δημιουργήσει κώδικα ειδικά βελτιστοποιημένο για την αρχιτεκτονική CPU. Αξιοποιεί συγκεκριμένες οδηγίες και χαρακτηριστικά του επεξεργαστή σας, με αποτέλεσμα σημαντικές βελτιώσεις ταχύτητας. Να γνωρίζετε ότι ο κώδικας που συντάχθηκε με αυτή τη σημαία μπορεί να μην είναι φορητός σε άλλες αρχιτεκτονικές.

* `-msse`,` -msse2`, `-msse3`,` -mssse3`, `-msse4`,` -mavx`, `-mavx2`, κλπ. Αυτές οι σημαίες επιτρέπουν τη στήριξη για συγκεκριμένες συνθέσεις οδηγιών SIMD (Single Tressions, πολλαπλές δεδομένων). Οι οδηγίες SIMD επιτρέπουν την παράλληλη επεξεργασία πολλαπλών στοιχείων δεδομένων, επιταχύνοντας δραματικά πολλές μαθηματικές λειτουργίες. Χρησιμοποιήστε τις σημαίες που αντιστοιχούν στις δυνατότητες της CPU σας.

2. Βελτιστοποιήσεις σε επίπεδο κώδικα:

Ακόμη και με επιθετικές σημαίες μεταγλωττιστή, ο καλά γραπτός κώδικας είναι απαραίτητος για τη βέλτιστη απόδοση.

* Χρησιμοποιήστε κατάλληλους τύπους δεδομένων: Επιλέξτε τον μικρότερο τύπο δεδομένων που μπορεί να αντιπροσωπεύει τα δεδομένα σας χωρίς απώλεια ακρίβειας. Για παράδειγμα, χρησιμοποιήστε το `float` αντί για` double` εάν η ακρίβεια μιας ακρίβειας είναι επαρκής.

* διάνυσμα: Καταστρέψτε τους βρόχους και τα δεδομένα σας για να επιτρέψετε στον μεταγλωττιστή να τα διανύσει εύκολα. Αυτό σημαίνει επεξεργασία πολλαπλών στοιχείων δεδομένων ταυτόχρονα χρησιμοποιώντας οδηγίες SIMD. Ο αυτόματος φορέας του GCC είναι αρκετά καλός, αλλά ίσως χρειαστεί να το βοηθήσετε χρησιμοποιώντας ευθυγραμμισμένες κατανομές μνήμης και εξασφαλίζοντας ότι οι επαναλήψεις του βρόχου είναι ανεξάρτητες.

* Μαθηματικές ταυτότητες και αλγόριθμοι: Χρησιμοποιήστε αποτελεσματικές μαθηματικές ταυτότητες και αλγόριθμους. Για παράδειγμα, η χρήση `exp2 (x)` αντί για `exp (x)` μπορεί να είναι ταχύτερη επειδή η πρώτη είναι βελτιστοποιημένη ειδικά για εξουσίες 2. Εξετάστε εξειδικευμένες βιβλιοθήκες για τις εργασίες Matrix (όπως eigen ή blas).

* ξετυλίγματα βρόχου: Οι βρόχοι του χειροκίνητα (επαναλαμβάνοντας το σώμα του βρόχου πολλές φορές) για να μειώσουν τα γενικά έξοδα, αλλά να έχετε επίγνωση της πίεσης του καταχωρητή. Ο μεταγλωττιστής μπορεί να εκτελέσει ήδη αυτή τη βελτιστοποίηση, οπότε δοκιμάστε πριν και μετά.

* Μοντέλα πρόσβασης μνήμης: Οργανώστε δεδομένα στη μνήμη για να ελαχιστοποιήσετε τις χείρες της προσωρινής μνήμης. Πρόσβαση σε δεδομένα διαδοχικά όποτε είναι δυνατόν.

* Λειτουργία inlining: Για μικρές, συχνά ονομασμένες λειτουργίες, εξετάστε τη χρήση της λέξης -κλειδιού `inline` για να μειώσετε τα γενικά έξοδα κλήσης λειτουργίας. Ο μεταγλωττιστής μπορεί να αποφασίσει να μην inline ούτως ή άλλως, με βάση τη δική του ανάλυση βελτιστοποίησης.

3. Βιβλιοθήκες:

* Βελτιστοποιημένες βιβλιοθήκες μαθηματικών: Χρησιμοποιήστε βιβλιοθήκες όπως το eigen (για γραμμική άλγεβρα), τα blas (βασικά γραμμικά υποπρογράμματα άλγεβρας) και το lapack (γραμμικό πακέτο άλγεβρας). Αυτά είναι εξαιρετικά βελτιστοποιημένα για διάφορες αρχιτεκτονικές και συχνά ξεπερνούν το χειρόγραφο κώδικα.

4. Προφίλ:

Αφού εφαρμόσετε βελτιστοποιήσεις, χρησιμοποιήστε ένα profiler (όπως το `gprof` ή το perf) για να προσδιορίσετε τα σημεία συμφόρησης απόδοσης. Αυτό σας βοηθά να εστιάσετε τις προσπάθειές σας στα μέρη του κώδικα σας που είναι πιο κρίσιμα.

Σημαντική σημείωση για το `-ffast-math`:

Ενώ το `-FFAST-MATH` προσφέρει σημαντικά κέρδη απόδοσης, μπορεί να οδηγήσει σε ανακρίβειες. Εάν οι υπολογισμοί σας απαιτούν αυστηρή τήρηση των προτύπων IEEE 754 (π.χ. σε επιστημονικές υπολογιστικές ή οικονομικές εφαρμογές), αποφύγετε τη χρήση αυτής της σημαίας ή επαληθεύστε προσεκτικά τα αποτελέσματα έναντι μιας μη βελτιστοποιημένης έκδοσης.

Παράδειγμα εντολή συλλογής:

`` `bash

G ++ -O3 -FFAST -MATH -MARCH =Native -mavx2 my_math_program.cpp -o my_math_program

`` `

Θυμηθείτε να προσαρμόσετε τις σημαίες στη συγκεκριμένη CPU και τις απαιτήσεις ακρίβειας της εφαρμογής σας. Πάντα προφίλ και σημείο αναφοράς για να διασφαλίσετε ότι οι βελτιστοποιήσεις σας βελτιώνουν πραγματικά την απόδοση.

Πνευματικά δικαιώματα © Γνώση Υπολογιστών Όλα τα δικαιώματα κατοχυρωμένα