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

Τα εγγενή SIMD δεν είναι τόσο τρομακτικά, αλλά πρέπει να τα χρησιμοποιήσουμε;

Είναι ο προγραμματισμός χαμηλού επιπέδου αμαρτία ή αρετή; Εξαρτάται.

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

Εάν δεν ξεκινήσατε τον προγραμματισμό την περασμένη εβδομάδα, υποψιάζομαι ότι γνωρίζετε ότι δεν λειτουργεί έτσι ο κόσμος. Η κορυφαία απόδοση έρχεται μόνο με προσπάθεια. Εξ ου και η ερώτησή μου: πόσο χαμηλά πρέπει να πάμε;

Ορισμένες λειτουργίες φορέα

Η λειτουργία «διάνυσμα» είναι μια μαθηματική λειτουργία που κάνει περισσότερες από μία πράξεις. Μια διανυσματική προσθήκη μπορεί να προσθέσει οκτώ ζεύγη αριθμών αντί της κανονικής προσθήκης, η οποία προσθέτει μόνο ένα ζεύγος αριθμών. Εξετάστε το ενδεχόμενο να ζητήσετε από τον υπολογιστή να προσθέσει δύο αριθμούς μαζί. Μπορούμε να το κάνουμε με μια κανονική εντολή προσθήκης. Εξετάστε το ενδεχόμενο να ζητήσετε από τον υπολογιστή να προσθέσει οκτώ ζεύγη αριθμών μεταξύ τους (υπολογισμός C1 = A1 + B1, C2 = A2 + B2,… C8 = A8 + B8). Μπορούμε να το κάνουμε με ένα διάνυσμα προσθέστε οδηγίες.

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

 SIMD: παραλληλισμός για διανύσματα

Οι επιστήμονες υπολογιστών έχουν ένα φανταχτερό όνομα για οδηγίες φορέα: SIMD ή "Single Instruction Multiple Data". Εάν σκεφτόμαστε μια κανονική προσθήκη εντολής ως SISD (Single Instruction Single Data) όπου μονόκλινο σημαίνει ένα ενιαίο ζεύγος εισόδων δεδομένων, τότε μια διανυσματική προσθήκη είναι μια SIMD όπου πολλαπλούς θα μπορούσε να σημαίνει οκτώ ζεύγη εισόδων δεδομένων.

Μου αρέσει να αποκαλώ το SIMD «ο άλλος παραλληλισμός υλικού», καθώς ο «παραλληλισμός» στους υπολογιστές θεωρείται τόσο συχνά ότι προέρχεται από πολλαπλούς πυρήνες. Οι μετρήσεις πυρήνων έχουν αυξηθεί σταθερά. Οι βασικές μετρήσεις τεσσάρων είναι κοινές, 20 ή περισσότερες είναι κοινές στους επεξεργαστές για διακομιστές και ο βασικός πυρήνας της Intel σήμερα είναι 72 πυρήνες σε έναν επεξεργαστή Intel® Xeon Phi ™.

Τα μεγέθη των διανυσματικών οδηγιών έχουν επίσης αυξηθεί. Οι πρώιμες οδηγίες φορέα, όπως το SSE, πραγματοποίησαν έως και τέσσερις λειτουργίες κάθε φορά. Το κορυφαίο διανυσματικό πλάτος της Intel σήμερα, στο AVX-512, εκτελεί έως και 16 λειτουργίες κάθε φορά.

 Πόσο χαμηλά πρέπει να πάμε;

Με τόσο μεγάλη απόδοση που διακυβεύεται, πόση δουλειά πρέπει να κάνουμε για να εκμεταλλευτούμε αυτήν την παράσταση;

Η απάντηση είναι πολύ και για αυτό: Τέσσερις πυρήνες μπορούν να μας επιταχύνουν 4X το πολύ. Το AVX (το μισό μέγεθος του AVX-512, αλλά πολύ πιο συνηθισμένο) μπορεί να μας επιταχύνει έως και 8X το πολύ. Σε συνδυασμό, μπορούν να φτάσουν έως και 32Χ. Κάνοντας και τα δύο έχει πολύ νόημα.

Αυτή είναι η απλή λίστα μου για το πώς να προσπαθήσω να εκμεταλλευτώ τις διανυσματικές οδηγίες (με τη σειρά που πρέπει να προσπαθήσουμε να τις εφαρμόσουμε):

 1.     Κατ 'αρχάς, καλέστε μια βιβλιοθήκη που κάνει τη δουλειά (η απόλυτη σιωπηρή διανυσματοποίηση). Ένα παράδειγμα μιας τέτοιας βιβλιοθήκης είναι η Βιβλιοθήκη Intel® Math Kernel (Intel® MKL). Όλη η δουλειά για τη χρήση διανυσματικών οδηγιών έγινε από κάποιον άλλο. Οι περιορισμοί είναι προφανείς: Πρέπει να βρούμε μια βιβλιοθήκη που να κάνει ό, τι χρειαζόμαστε.

2.     Δεύτερον, χρησιμοποιήστε σιωπηρή διανυσματοποίηση. Μείνετε αφηρημένοι και γράψτε τον εαυτό σας χρησιμοποιώντας πρότυπα ή μεταγλωττιστές για βοήθεια. Πολλοί μεταγλωττιστές έχουν διακόπτες και επιλογές διανύσματος. Οι μεταγλωττιστές είναι πιθανότατα ο πιο φορητός και σταθερός τρόπος να πάτε. Υπήρξαν πολλά πρότυπα για διανυσματοποίηση, αλλά κανένα δεν έχει δει αρκετή χρήση με την πάροδο του χρόνου για να είναι σαφής νικητής (μια πρόσφατη καταχώριση είναι τα πρότυπα διάταξης δεδομένων Intel® SIMD [Intel® SDLT]).

3.     Τρίτον, χρησιμοποιήστε ρητή διανυσματικοποίηση. Αυτό έχει γίνει πολύ δημοφιλές τα τελευταία χρόνια και προσπαθεί να λύσει το πρόβλημα της παραμονής αφηρημένο, αλλά αναγκάζοντας τον μεταγλωττιστή να χρησιμοποιεί διανυσματικές οδηγίες όταν δεν θα τις χρησιμοποιούσε διαφορετικά. Η υποστήριξη για SIMD στο OpenMP είναι το βασικό παράδειγμα εδώ, όπου τα αιτήματα διανύσματος για τον μεταγλωττιστή δίνονται πολύ ρητά. Οι μη τυπικές επεκτάσεις υπάρχουν σε πολλούς μεταγλωττιστές, συχνά με τη μορφή επιλογών ή "pragmas". Εάν ακολουθήσετε αυτήν τη διαδρομή, το OpenMP είναι ο τρόπος που πρέπει να ακολουθήσετε εάν βρίσκεστε σε C, C ++ ή Fortran.

4.     Τέλος, χαμηλώστε και βρώμικα. Χρησιμοποιήστε την εγγενή SIMD. Είναι σαν γλώσσα συναρμολόγησης, αλλά είναι γραμμένο στο πρόγραμμα C / C ++. Η εγγενής SIMD μοιάζει πραγματικά με μια κλήση λειτουργίας, αλλά γενικά παράγει μια μεμονωμένη εντολή (μια οδηγία λειτουργίας φορέα, επίσης γνωστή ως εντολή SIMD).

Οι εγγενείς SIMD δεν είναι κακές. Ωστόσο, είναι η τελευταία λύση. Οι τρεις πρώτες επιλογές είναι πάντα πιο διατηρήσιμες για το μέλλον όταν λειτουργούν. Ωστόσο, όταν τα πρώτα τρία δεν ανταποκρίνονται στις ανάγκες μας, σίγουρα θα πρέπει να δοκιμάσουμε τη χρήση εγγενών SIMD.

Εάν θέλετε να ξεκινήσετε τη χρήση εγγενών SIMD, θα έχετε ένα σοβαρό πόδι εάν είστε συνηθισμένοι στη συναρμολόγηση γλωσσικού προγραμματισμού. Κυρίως αυτό συμβαίνει επειδή θα έχετε ευκολότερο χρόνο να διαβάσετε την τεκμηρίωση που εξηγεί τις λειτουργίες, συμπεριλαμβανομένου του εξαιρετικού διαδικτυακού «Intrinsics Guide» της Intel. Εάν είστε εντελώς νέοι σε αυτό, έτρεξα ένα πρόσφατο ιστολόγιο ("SSE: μυαλό το κενό!") Που έχει ένα απαλό χέρι στην εισαγωγή των εγγενών. Μου αρέσει επίσης το "Crunching Numbers with AVX and AVX2".

Εάν μια βιβλιοθήκη ή μεταγλωττιστής μπορεί να κάνει ό, τι χρειάζεστε, η εγγενής SIMD δεν είναι η καλύτερη επιλογή. Ωστόσο, έχουν τη θέση τους και δεν είναι δύσκολο να χρησιμοποιηθούν μόλις τα συνηθίσετε. Δοκίμασέ τους. Τα οφέλη απόδοσης μπορεί να είναι εκπληκτικά. Έχω δει τα εγγενή SIMD που χρησιμοποιούνται από έξυπνους προγραμματιστές για κώδικα που δεν είναι πιθανό να παράγει μεταγλωττιστής.

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

Κάντε κλικ εδώ για να κατεβάσετε τη δωρεάν δοκιμή 30 ημερών του Intel Parallel Studio XE