Οι υπολογισμοί ενεργοποιούνται GPU

Η τεχνολογία CUDA (Compute Unified Device Architecture) είναι μια αρχιτεκτονική λογισμικού και υλικού που επιτρέπει τον υπολογισμό με χρήση GPU της NVIDIA που υποστηρίζουν την τεχνολογία GPGPU (αυθαίρετος υπολογισμός σε κάρτες βίντεο). Η αρχιτεκτονική CUDA εμφανίστηκε για πρώτη φορά στην αγορά με την κυκλοφορία του chip NVIDIA όγδοης γενιάς - G80 και υπάρχει σε όλες τις επόμενες σειρές τσιπ γραφικών που χρησιμοποιούνται στις οικογένειες επιταχυντών GeForce, ION, Quadro και Tesla.

Το CUDA SDK επιτρέπει στους προγραμματιστές να εφαρμόζουν, σε μια ειδική απλοποιημένη διάλεκτο της γλώσσας προγραμματισμού C, αλγόριθμους που μπορούν να εκτελεστούν σε GPU της NVIDIA και να περιλαμβάνουν ειδικές λειτουργίες στο κείμενο του προγράμματος C. Το CUDA δίνει στον προγραμματιστή την ευκαιρία, κατά την κρίση του, να οργανώσει την πρόσβαση στο σύνολο εντολών του επιταχυντή γραφικών και να διαχειριστεί τη μνήμη του, να οργανώσει σύνθετους παράλληλους υπολογιστές σε αυτό.

Ιστορία

Το 2003, η Intel και η AMD ήταν σε μια κοινή κούρσα για τα περισσότερα ισχυρός επεξεργαστής. Με τα χρόνια, οι ταχύτητες του ρολογιού έχουν αυξηθεί σημαντικά ως αποτέλεσμα αυτού του αγώνα, ειδικά μετά την κυκλοφορία του Intel Pentium 4.

Μετά την αύξηση των συχνοτήτων ρολογιού (μεταξύ 2001 και 2003, η συχνότητα ρολογιού Pentium 4 διπλασιάστηκε από 1,5 σε 3 GHz) και οι χρήστες έπρεπε να αρκούνται στα δέκατα των gigahertz, τα οποία οι κατασκευαστές έφεραν στην αγορά (από το 2003 έως το 2005, ρολόι οι συχνότητες αυξήθηκαν 3 στα 3,8 GHz).

Αρχιτεκτονικές βελτιστοποιημένες για υψηλές ταχύτητες ρολογιού, όπως το Prescott, άρχισαν επίσης να αντιμετωπίζουν δυσκολίες, και όχι μόνο στην παραγωγή. Οι κατασκευαστές chip αντιμετώπισαν προκλήσεις για να ξεπεράσουν τους νόμους της φυσικής. Ορισμένοι αναλυτές προέβλεψαν μάλιστα ότι ο νόμος του Μουρ θα έπαυε να ισχύει. Αυτό όμως δεν συνέβη. Η αρχική έννοια του νόμου συχνά παρερμηνεύεται, αλλά αναφέρεται στον αριθμό των τρανζίστορ στην επιφάνεια ενός πυρήνα πυριτίου. Για πολύ καιρόμια αύξηση στον αριθμό των τρανζίστορ στην CPU συνοδεύτηκε από αντίστοιχη αύξηση στην απόδοση - η οποία οδήγησε σε παραμόρφωση του νοήματος. Στη συνέχεια όμως η κατάσταση έγινε πιο περίπλοκη. Οι σχεδιαστές της αρχιτεκτονικής της CPU προσέγγισαν τον νόμο της μείωσης του κέρδους: ο αριθμός των τρανζίστορ που έπρεπε να προστεθούν για την επιθυμητή αύξηση της απόδοσης γινόταν όλο και περισσότερος, οδηγώντας σε αδιέξοδο.

Ο λόγος για τον οποίο οι κατασκευαστές GPU δεν αντιμετώπισαν αυτό το πρόβλημα είναι πολύ απλός: οι CPU έχουν σχεδιαστεί για να έχουν την καλύτερη απόδοση σε μια ροή εντολών που επεξεργάζονται διαφορετικά δεδομένα (ακέραιους και αριθμούς κινητής υποδιαστολής), εκτελούν τυχαία πρόσβαση στη μνήμη κ.λπ. δ. Μέχρι τώρα, οι προγραμματιστές προσπαθούσαν να παρέχουν μεγαλύτερο παραλληλισμό εντολών - δηλαδή να εκτελούν όσο το δυνατόν περισσότερες εντολές παράλληλα. Έτσι, για παράδειγμα, εμφανίστηκε η υπερκλιμακωτή εκτέλεση με το Pentium, όταν υπό ορισμένες συνθήκες ήταν δυνατή η εκτέλεση δύο εντολών ανά ρολόι. Το Pentium Pro έλαβε ακατάλληλη εκτέλεση εντολών, γεγονός που κατέστησε δυνατή τη βελτιστοποίηση της απόδοσης των υπολογιστικών μονάδων. Το πρόβλημα είναι ότι η παράλληλη εκτέλεση μιας διαδοχικής ροής εντολών έχει προφανείς περιορισμούς, επομένως η τυφλή αύξηση του αριθμού των υπολογιστικών μονάδων δεν δίνει κέρδος, αφού τις περισσότερες φορές θα εξακολουθούν να είναι αδρανείς.

Η λειτουργία της GPU είναι σχετικά απλή. Αποτελείται από τη λήψη μιας ομάδας πολυγώνων στη μία πλευρά και τη δημιουργία μιας ομάδας εικονοστοιχείων από την άλλη. Τα πολύγωνα και τα εικονοστοιχεία είναι ανεξάρτητα μεταξύ τους, επομένως μπορούν να υποβληθούν σε παράλληλη επεξεργασία. Έτσι, στη GPU, είναι δυνατό να διατεθεί ένα μεγάλο μέρος του κρυστάλλου για υπολογιστικές μονάδες, οι οποίες, σε αντίθεση με την CPU, θα χρησιμοποιηθούν στην πραγματικότητα.

Η GPU διαφέρει από την CPU όχι μόνο σε αυτό. Η πρόσβαση στη μνήμη στη GPU είναι πολύ συνδεδεμένη - εάν γίνει ανάγνωση ενός texel, τότε μετά από μερικούς κύκλους, θα διαβαστεί το διπλανό texel. όταν γράφεται ένα pixel, το γειτονικό θα γραφτεί μετά από μερικούς κύκλους. Οργανώνοντας έξυπνα τη μνήμη, μπορείτε να έχετε απόδοση κοντά στο θεωρητικό εύρος ζώνης. Αυτό σημαίνει ότι η GPU, σε αντίθεση με την CPU, δεν απαιτεί τεράστια κρυφή μνήμη, αφού ο ρόλος της είναι να επιταχύνει τις λειτουργίες δημιουργίας υφής. Το μόνο που χρειάζεται είναι μερικά kilobyte που περιέχουν μερικά texel που χρησιμοποιούνται σε διγραμμικά και τριγραμμικά φίλτρα.

Πρώτοι υπολογισμοί στη GPU

Οι πρώτες απόπειρες σε μια τέτοια εφαρμογή περιορίστηκαν στη χρήση ορισμένων χαρακτηριστικών υλικού, όπως η ραστεροποίηση και η αποθήκευση σε προσωρινή μνήμη. Αλλά τον τρέχοντα αιώνα, με την εμφάνιση των shaders, άρχισαν να επιταχύνουν τον υπολογισμό των πινάκων. Το 2003, μια ξεχωριστή ενότητα εκχωρήθηκε στο SIGGRAPH για υπολογιστές GPU και ονομάστηκε GPGPU (General-Purpose computation on GPU) - universal GPU computing).

Ο πιο γνωστός BrookGPU είναι ο μεταγλωττιστής γλώσσας προγραμματισμού ροής Brook, σχεδιασμένος να εκτελεί μη γραφικούς υπολογισμούς στη GPU. Πριν από την εμφάνισή του, οι προγραμματιστές που χρησιμοποιούν τις δυνατότητες των τσιπ βίντεο για υπολογισμούς επέλεξαν ένα από τα δύο κοινά API: Direct3D ή OpenGL. Αυτό περιόρισε σοβαρά τη χρήση της GPU, επειδή τα τρισδιάστατα γραφικά χρησιμοποιούν shaders και υφές για τις οποίες δεν απαιτείται να γνωρίζουν οι παράλληλοι προγραμματιστές, χρησιμοποιούν νήματα και πυρήνες. Ο Μπρουκ μπόρεσε να τους βοηθήσει να κάνουν το έργο τους πιο εύκολο. Αυτές οι επεκτάσεις ροής στη γλώσσα C, που αναπτύχθηκαν στο Πανεπιστήμιο του Στάνφορντ, έκρυψαν το 3D API από τους προγραμματιστές και παρουσίασαν το τσιπ βίντεο ως παράλληλο συνεπεξεργαστή. Ο μεταγλωττιστής ανέλυσε ένα αρχείο .br με κώδικα και επεκτάσεις C++, δημιουργώντας κώδικα συνδεδεμένο με μια βιβλιοθήκη με δυνατότητα DirectX, OpenGL ή x86.

Η εμφάνιση του Brook κέντρισε το ενδιαφέρον της NVIDIA και της ATI και άνοιξε περαιτέρω έναν εντελώς νέο τομέα της - παράλληλους υπολογιστές που βασίζονται σε τσιπ βίντεο.

Επιπλέον, ορισμένοι ερευνητές από το έργο Brook μετακόμισαν στην ομάδα ανάπτυξης της NVIDIA για να εισαγάγουν μια στρατηγική παράλληλου υπολογισμού υλικού-λογισμικού, ανοίγοντας ένα νέο μερίδιο αγοράς. Και το κύριο πλεονέκτημα αυτής της πρωτοβουλίας NVIDIA ήταν ότι οι προγραμματιστές γνωρίζουν τέλεια όλες τις δυνατότητες των GPU τους με την παραμικρή λεπτομέρεια και δεν χρειάζεται να χρησιμοποιήσετε το API γραφικών και μπορείτε να εργαστείτε με το υλικό απευθείας χρησιμοποιώντας το πρόγραμμα οδήγησης. Το αποτέλεσμα των προσπαθειών αυτής της ομάδας είναι η NVIDIA CUDA.

Τομείς εφαρμογής παράλληλων υπολογισμών στη GPU

Όταν οι υπολογιστές μεταφέρονται στη GPU, σε πολλές εργασίες η επιτάχυνση επιτυγχάνεται κατά 5-30 φορές σε σύγκριση με τους γρήγορους επεξεργαστές γενικής χρήσης. Οι μεγαλύτεροι αριθμοί (της τάξης των 100x επιτάχυνση και ακόμη περισσότερο!) επιτυγχάνονται σε κώδικα που δεν είναι πολύ κατάλληλος για υπολογισμούς χρησιμοποιώντας μπλοκ SSE, αλλά είναι αρκετά βολικός για την GPU.

Αυτά είναι μόνο μερικά παραδείγματα επιταχύνσεων του συνθετικού κώδικα στη GPU έναντι του διανυσματικού κώδικα SSE στη CPU (σύμφωνα με τη NVIDIA):

Μικροσκόπιο φθορισμού: 12x.

Μοριακή δυναμική (μη δεσμευμένη δύναμη υπολογ.): 8-16x;

Ηλεκτροστατική (άμεση και πολυεπίπεδη άθροιση Coulomb): 40-120x και 7x.

Ο πίνακας που δείχνει η NVIDIA σε όλες τις παρουσιάσεις, ο οποίος δείχνει την ταχύτητα των GPU σε σχέση με τους CPU.

Κατάλογος σημαντικών εφαρμογών στις οποίες χρησιμοποιείται υπολογισμός GPU: ανάλυση και επεξεργασία εικόνας και σήματος, φυσική προσομοίωση, υπολογιστικά μαθηματικά, υπολογιστική βιολογία, οικονομικοί υπολογισμοί, βάσεις δεδομένων, δυναμική αερίων και υγρών, κρυπτογραφία, προσαρμοστική ακτινοθεραπεία, αστρονομία, επεξεργασία ήχου, βιοπληροφορική , βιολογικές προσομοιώσεις, όραση υπολογιστή, εξόρυξη δεδομένων, ψηφιακός κινηματογράφος και τηλεόραση, ηλεκτρομαγνητικές προσομοιώσεις, συστήματα γεωγραφικών πληροφοριών, στρατιωτικές εφαρμογές, σχεδιασμός εξόρυξης, μοριακή δυναμική, απεικόνιση μαγνητικού συντονισμού (MRI), νευρωνικά δίκτυα, ωκεανογραφική έρευνα, φυσική σωματιδίων, προσομοίωση αναδίπλωσης πρωτεϊνών, κβαντική χημεία, ανίχνευση ακτίνων, απεικόνιση, ραντάρ, προσομοίωση δεξαμενής, τεχνητή νοημοσύνη, δορυφορική ανάλυση δεδομένων, σεισμική εξερεύνηση, χειρουργική επέμβαση, υπερηχογράφημα, τηλεδιάσκεψη.

Οφέλη και περιορισμοί του CUDA

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

Για τη μεταφορά υπολογισμών στη GPU στο πλαίσιο ενός τέτοιου μοντέλου, απαιτείται μια ειδική προσέγγιση. Ακόμη και η προσθήκη στοιχείο προς στοιχείο δύο διανυσμάτων θα απαιτήσει τη σχεδίαση του σχήματος στην οθόνη ή σε μια προσωρινή μνήμη εκτός οθόνης. Το σχήμα είναι ραστεροποιημένο, το χρώμα κάθε pixel υπολογίζεται σύμφωνα με ένα δεδομένο πρόγραμμα (pixel shader). Το πρόγραμμα διαβάζει τα δεδομένα εισόδου από τις υφές για κάθε pixel, τα αθροίζει και τα γράφει στο buffer εξόδου. Και όλες αυτές οι πολυάριθμες λειτουργίες χρειάζονται για αυτό που είναι γραμμένο σε έναν μόνο τελεστή σε μια συμβατική γλώσσα προγραμματισμού!

Επομένως, η χρήση του GPGPU για υπολογιστές γενικού σκοπού έχει έναν περιορισμό υπό τη μορφή υπερβολικής πολυπλοκότητας για να μάθουν οι προγραμματιστές. Και υπάρχουν αρκετοί άλλοι περιορισμοί, επειδή ένας σκιαστής εικονοστοιχείων είναι απλώς ένας τύπος για την εξάρτηση του τελικού χρώματος ενός εικονοστοιχείου από τις συντεταγμένες του και η γλώσσα σκίασης εικονοστοιχείων είναι μια γλώσσα για τη σύνταξη αυτών των τύπων με σύνταξη τύπου C. Οι πρώτες μέθοδοι GPGPU είναι ένα έξυπνο κόλπο για να αξιοποιήσετε τη δύναμη της GPU, αλλά χωρίς καμία ευκολία. Τα δεδομένα εκεί αντιπροσωπεύονται από εικόνες (υφές) και ο αλγόριθμος αντιπροσωπεύεται από μια διαδικασία ραστεροποίησης. Θα πρέπει να σημειωθεί και ένα πολύ συγκεκριμένο μοντέλο μνήμης και εκτέλεσης.

Η αρχιτεκτονική υλικού και λογισμικού της NVIDIA για υπολογισμούς σε GPU από τη NVIDIA διαφέρει από τα προηγούμενα μοντέλα GPGPU στο ότι επιτρέπει τη σύνταξη προγραμμάτων για GPU σε πραγματικό C με τυπική σύνταξη, δείκτες και την ανάγκη για ελάχιστες επεκτάσεις για πρόσβαση στους υπολογιστικούς πόρους των τσιπ βίντεο. Το CUDA δεν εξαρτάται από τα API γραφικών και έχει ορισμένες δυνατότητες που έχουν σχεδιαστεί ειδικά για υπολογιστές γενικού σκοπού.

Πλεονεκτήματα του CUDA έναντι της παραδοσιακής προσέγγισης στον υπολογισμό GPGPU

Το CUDA παρέχει πρόσβαση σε 16 KB κοινόχρηστης μνήμης ανά πολυεπεξεργαστή, η οποία μπορεί να χρησιμοποιηθεί για την οργάνωση μιας κρυφής μνήμης με μεγαλύτερο εύρος ζώνης από τις ανακτήσεις υφής.

Πιο αποτελεσματική μεταφορά δεδομένων μεταξύ συστήματος και μνήμης βίντεο.

Δεν χρειάζονται API γραφικών με πλεονασμό και επιβάρυνση.

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

Υποστήριξη υλικού για λειτουργίες ακεραίων και bit.

Κύριοι περιορισμοί του CUDA:

Έλλειψη υποστήριξης αναδρομής για εκτελέσιμες συναρτήσεις.

Το ελάχιστο πλάτος του μπλοκ είναι 32 νήματα.

Κλειστή αρχιτεκτονική CUDA που ανήκει στην NVIDIA.

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

Τα κύρια πλεονεκτήματα του CUDA έναντι των προηγούμενων μεθόδων GPGPU πηγάζουν από το γεγονός ότι αυτή η αρχιτεκτονική έχει σχεδιαστεί για να αποτελεσματική χρήσημη γραφικός υπολογισμός στη GPU και χρησιμοποιεί τη γλώσσα προγραμματισμού C, χωρίς να απαιτείται η μεταφορά αλγορίθμων σε μια μορφή κατάλληλη για την έννοια του αγωγού γραφικών. Προσφορές CUDA νέος τρόποςΥπολογισμός GPU που δεν χρησιμοποιεί API γραφικών και προσφέρει τυχαία πρόσβαση στη μνήμη (σκέδαση ή συλλογή). Μια τέτοια αρχιτεκτονική είναι απαλλαγμένη από τα μειονεκτήματα της GPGPU και χρησιμοποιεί όλες τις μονάδες εκτέλεσης και επίσης επεκτείνει τις δυνατότητες μέσω μαθηματικών ακεραίων και πράξεων μετατόπισης bit.

Το CUDA ανοίγει ορισμένες δυνατότητες υλικού που δεν είναι διαθέσιμες από τα API γραφικών, όπως η κοινόχρηστη μνήμη. Πρόκειται για μια μικρή ποσότητα μνήμης (16 kilobyte ανά πολυεπεξεργαστή) στην οποία έχουν πρόσβαση μπλοκ νημάτων. Σας επιτρέπει να αποθηκεύετε προσωρινά τα δεδομένα που έχετε πιο συχνά πρόσβαση και μπορεί να παρέχει περισσότερα υψηλή ταχύτητα, σε σύγκριση με τη χρήση ανακτήσεων υφής για αυτήν την εργασία. Αυτό, με τη σειρά του, μειώνει την ευαισθησία διεκπεραίωσης των παράλληλων αλγορίθμων σε πολλές εφαρμογές. Για παράδειγμα, είναι χρήσιμο για γραμμική άλγεβρα, γρήγορο μετασχηματισμό Fourier και φίλτρα επεξεργασίας εικόνας.

Πιο βολικό σε CUDA και πρόσβαση στη μνήμη. Κωδικός προγράμματοςστο API γραφικών, εξάγει δεδομένα με τη μορφή 32 τιμών κινητής υποδιαστολής μονής ακρίβειας (τιμές RGBA ταυτόχρονα σε οκτώ στόχους απόδοσης) σε προκαθορισμένες περιοχές και το CUDA υποστηρίζει εγγραφή scatter - απεριόριστο αριθμό εγγραφών σε οποιαδήποτε διεύθυνση . Τέτοια πλεονεκτήματα καθιστούν δυνατή την εκτέλεση ορισμένων αλγορίθμων στη GPU που δεν μπορούν να υλοποιηθούν αποτελεσματικά χρησιμοποιώντας μεθόδους GPGPU που βασίζονται στο API γραφικών.

Επίσης, τα γραφικά API αποθηκεύουν απαραίτητα δεδομένα σε textures, κάτι που απαιτεί προηγούμενη συσκευασία μεγάλων πινάκων σε textures, γεγονός που περιπλέκει τον αλγόριθμο και επιβάλλει τη χρήση ειδικών διευθύνσεων. Και το CUDA σάς επιτρέπει να διαβάζετε δεδομένα σε οποιαδήποτε διεύθυνση. Ένα άλλο πλεονέκτημα του CUDA είναι η βελτιστοποιημένη επικοινωνία μεταξύ CPU και GPU. Και για προγραμματιστές που θέλουν να έχουν πρόσβαση στο χαμηλό επίπεδο (για παράδειγμα, όταν γράφουν άλλη γλώσσα προγραμματισμού), το CUDA προσφέρει τη δυνατότητα προγραμματισμού γλώσσας assembly χαμηλού επιπέδου.

Μειονεκτήματα του CUDA

Ένα από τα λίγα μειονεκτήματα του CUDA είναι η κακή φορητότητά του. Αυτή η αρχιτεκτονική λειτουργεί μόνο στα τσιπ βίντεο αυτής της εταιρείας, και όχι σε όλα, αλλά ξεκινώντας από τις σειρές GeForce 8 και 9 και τα αντίστοιχα Quadro, ION και Tesla. Η NVIDIA δίνει έναν αριθμό 90 εκατομμυρίων τσιπ βίντεο συμβατά με CUDA.

Εναλλακτικές λύσεις για το CUDA

Πλαίσιο για τη γραφή προγράμματα υπολογιστήσυνδέονται με παράλληλους υπολογιστές σε διάφορους γραφικούς και κεντρικούς επεξεργαστές. Το πλαίσιο OpenCL περιλαμβάνει μια γλώσσα προγραμματισμού που βασίζεται στο πρότυπο C99 και μια διεπαφή προγραμματισμού εφαρμογών (API). Το OpenCL παρέχει παραλληλισμό σε επίπεδο εντολών και σε επίπεδο δεδομένων και είναι μια υλοποίηση της τεχνικής GPGPU. Το OpenCL είναι ένα εντελώς ανοιχτό πρότυπο και δεν υπάρχουν χρεώσεις άδειας χρήσης για τη χρήση του.

Ο στόχος του OpenCL είναι να συμπληρώσει τα OpenGL και OpenAL, τα οποία είναι ανοιχτά βιομηχανικά πρότυπα για τρισδιάστατα γραφικά και ήχο υπολογιστή, εκμεταλλευόμενοι τη δύναμη της GPU. Το OpenCL αναπτύσσεται και συντηρείται από τον Όμιλο Khronos, μια μη κερδοσκοπική κοινοπραξία που περιλαμβάνει πολλές μεγάλες εταιρείες όπως η Apple, η AMD, η Intel, η nVidia, η Sun Microsystems, η Sony Computer Entertainment και άλλες.

CAL/IL (Υπολογισμός επιπέδου αφαίρεσης/ενδιάμεση γλώσσα)

Η τεχνολογία ATI Stream είναι ένα σύνολο υλικού και τεχνολογίες λογισμικού, που σας επιτρέπουν να χρησιμοποιείτε GPU της AMD, σε συνδυασμό με την CPU, για να επιταχύνετε πολλές εφαρμογές (όχι μόνο γραφικά).

Οι περιοχές εφαρμογής του ATI Stream είναι εφαρμογές που απαιτούν υπολογιστικούς πόρους, όπως π.χ η οικονομική ανάλυσηή επεξεργασία σεισμικών δεδομένων. Η χρήση ενός επεξεργαστή ροής κατέστησε δυνατή την αύξηση της ταχύτητας ορισμένων οικονομικών υπολογισμών κατά 55 φορές σε σύγκριση με την επίλυση του ίδιου προβλήματος χρησιμοποιώντας μόνο ΕΠΕΞΕΡΓΑΣΤΗΣ.

Η NVIDIA δεν θεωρεί την τεχνολογία ATI Stream πολύ ισχυρό ανταγωνιστή. Το CUDA και το Stream είναι δύο διαφορετικές τεχνολογίες που βρίσκονται σε διαφορετικά επίπεδα ανάπτυξης. Ο προγραμματισμός για προϊόντα ATI είναι πολύ πιο δύσκολος - η γλώσσα τους μοιάζει περισσότερο με assembler. Η CUDA C, από την άλλη πλευρά, είναι μια γλώσσα πολύ υψηλότερου επιπέδου. Το γράψιμο σε αυτό είναι πιο βολικό και ευκολότερο. Για μεγάλες εταιρείες ανάπτυξης, αυτό είναι πολύ σημαντικό. Αν μιλάμε για απόδοση, μπορούμε να δούμε ότι η μέγιστη τιμή του στα προϊόντα ATI είναι υψηλότερη από ό,τι στις λύσεις NVIDIA. Αλλά και πάλι, όλα εξαρτώνται από το πώς να αποκτήσετε αυτή τη δύναμη.

DirectX11 (DirectCompute)

Μια διεπαφή προγραμματισμού εφαρμογών που αποτελεί μέρος του DirectX, ενός συνόλου API της Microsoft που έχει σχεδιαστεί για να εκτελείται σε υπολογιστές συμβατούς με IBM PC που εκτελούνται λειτουργικά συστήματαΟικογένεια Microsoft Windows. Το DirectCompute έχει σχεδιαστεί για να εκτελεί υπολογισμούς γενικού σκοπού σε GPU, αποτελώντας μια υλοποίηση της ιδέας GPGPU. Το DirectCompute δημοσιεύτηκε αρχικά ως μέρος του DirectX 11, αλλά αργότερα έγινε διαθέσιμο και για DirectX 10 και DirectX 10.1.

Το NVDIA CUDA στο ρωσικό επιστημονικό περιβάλλον.

Από τον Δεκέμβριο του 2009, μοντέλο προγραμματισμούΤο CUDA διδάσκεται σε 269 πανεπιστήμια σε όλο τον κόσμο. Στη Ρωσία, μαθήματα κατάρτισης για το CUDA διδάσκονται στα κρατικά πανεπιστήμια της Μόσχας, της Αγίας Πετρούπολης, του Καζάν, του Νοβοσιμπίρσκ και του Περμ, στο Διεθνές Πανεπιστήμιο της Φύσης της Κοινωνίας και του Ανθρώπου "Dubna", στο Κοινό Ινστιτούτο Πυρηνικής Έρευνας, στο Ινστιτούτο Ηλεκτρονικών της Μόσχας Τεχνολογία, Ivanovo State Power Engineering University, BSTU. V. G. Shukhova, MSTU im. Bauman, RKhTU im. Mendeleev, το Ρωσικό Ερευνητικό Κέντρο «Ινστιτούτο Kurchatov», το Διαπεριφερειακό Κέντρο Υπερυπολογιστών της Ρωσικής Ακαδημίας Επιστημών, το Τεχνολογικό Ινστιτούτο Taganrog (TTI SFedU).

Χαρακτηριστικά AMD/ATI Radeon Architecture

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

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

Λοιπόν, τι επιτρέπει στην GPU να διεκδικήσει τον δικό της τομέα στον τομέα των προγραμμάτων γενικής χρήσης; Η μικροαρχιτεκτονική της GPU είναι κατασκευασμένη πολύ διαφορετικά από τις συμβατικές CPU και έχει ορισμένα πλεονεκτήματα από την αρχή. Οι εργασίες γραφικών περιλαμβάνουν ανεξάρτητη παράλληλη επεξεργασία δεδομένων και η GPU είναι εγγενώς πολλαπλών νημάτων. Αλλά αυτός ο παραλληλισμός είναι μόνο χαρά γι' αυτόν. Η μικροαρχιτεκτονική έχει σχεδιαστεί για να εκμεταλλεύεται τον μεγάλο αριθμό νημάτων που πρέπει να εκτελεστούν.

Η GPU αποτελείται από πολλές δεκάδες (30 για Nvidia GT200, 20 για Evergreen, 16 για Fermi) πυρήνες επεξεργαστών, οι οποίοι ονομάζονται Streaming Multiprocessor στην ορολογία της Nvidia και SIMD Engine στην ορολογία ATI. Στο πλαίσιο αυτού του άρθρου, θα τους ονομάσουμε μικροεπεξεργαστές, επειδή εκτελούν αρκετές εκατοντάδες νήματα προγραμμάτων και μπορούν να κάνουν σχεδόν ό,τι μπορεί μια κανονική CPU, αλλά και πάλι όχι τα πάντα.

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

Κάθε μίνι επεξεργαστής έχει τοπική μνήμη, 16 KB για το GT200, 32 KB για το Evergreen και 64 KB για το Fermi (ουσιαστικά μια προγραμματιζόμενη κρυφή μνήμη L1). Έχει παρόμοιο χρόνο πρόσβασης με τη μνήμη cache L1 μιας συμβατικής CPU και εκτελεί παρόμοιες λειτουργίες παροχής δεδομένων σε λειτουργικές μονάδες όσο το δυνατόν γρηγορότερα. Στην αρχιτεκτονική Fermi, ένα τμήμα της τοπικής μνήμης μπορεί να διαμορφωθεί ως κανονική κρυφή μνήμη. Στη GPU, η τοπική μνήμη χρησιμοποιείται για γρήγορη ανταλλαγή δεδομένων μεταξύ των νημάτων που εκτελούνται. Ένα από τα συνηθισμένα σχήματα ενός προγράμματος GPU είναι το εξής: πρώτα, δεδομένα από την καθολική μνήμη της GPU φορτώνονται στην τοπική μνήμη. Αυτή είναι απλώς μια συνηθισμένη μνήμη βίντεο που βρίσκεται (όπως μνήμη συστήματος) ξεχωριστά από τον "δικό του" επεξεργαστή - στην περίπτωση βίντεο, συγκολλάται από πολλά μικροκυκλώματα στον textolite της κάρτας βίντεο. Στη συνέχεια, αρκετές εκατοντάδες νήματα λειτουργούν με αυτά τα δεδομένα στην τοπική μνήμη και γράφουν το αποτέλεσμα στην καθολική μνήμη, μετά την οποία μεταφέρεται στην CPU. Είναι ευθύνη του προγραμματιστή να γράψει οδηγίες για τη φόρτωση και την εκφόρτωση δεδομένων από την τοπική μνήμη. Στην ουσία πρόκειται για την κατάτμηση δεδομένων [συγκεκριμένης εργασίας] για παράλληλη επεξεργασία. Η GPU υποστηρίζει επίσης οδηγίες ατομικής εγγραφής/ανάγνωσης στη μνήμη, αλλά είναι αναποτελεσματικές και συνήθως απαιτούνται στο τελικό στάδιο για την «κόλληση» των αποτελεσμάτων των υπολογισμών όλων των μικροεπεξεργαστών.

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

Και ένα ακόμη σημαντικό χαρακτηριστικό της GPU: η "soft" vectorization. Κάθε μίνι επεξεργαστής έχει μεγάλο αριθμό υπολογιστικών μονάδων (8 για το GT200, 16 για το Radeon και 32 για το Fermi), αλλά μπορούν να εκτελέσουν μόνο την ίδια εντολή, με την ίδια διεύθυνση προγράμματος. Οι τελεστές σε αυτή την περίπτωση μπορεί να είναι διαφορετικοί, διαφορετικά νήματα έχουν τα δικά τους. Για παράδειγμα, η οδηγία προσθέστε τα περιεχόμενα δύο μητρώων: εκτελείται ταυτόχρονα από όλες τις υπολογιστικές συσκευές, αλλά λαμβάνονται διαφορετικοί καταχωρητές. Υποτίθεται ότι όλα τα νήματα του προγράμματος GPU, που εκτελούν παράλληλη επεξεργασία δεδομένων, κινούνται γενικά σε μια παράλληλη πορεία μέσω του κώδικα προγράμματος. Έτσι, όλες οι υπολογιστικές μονάδες φορτώνονται ομοιόμορφα. Και αν τα νήματα, λόγω διακλαδώσεων στο πρόγραμμα, έχουν αποκλίνει στη διαδρομή εκτέλεσης του κώδικα, τότε συμβαίνει η λεγόμενη σειριοποίηση. Τότε δεν χρησιμοποιούνται όλες οι υπολογιστικές ενότητες, αφού τα νήματα υποβάλλουν διαφορετικές εντολές για εκτέλεση και το μπλοκ υπολογιστικών μονάδων μπορεί να εκτελέσει, όπως έχουμε ήδη πει, μόνο μια εντολή με μία διεύθυνση. Και, φυσικά, η απόδοση ταυτόχρονα πέφτει σε σχέση με το μέγιστο.

Το πλεονέκτημα είναι ότι η διανυσματοποίηση είναι εντελώς αυτόματη, δεν προγραμματίζει χρησιμοποιώντας SSE, MMX κ.λπ. Και η ίδια η GPU χειρίζεται τις αποκλίσεις. Θεωρητικά, είναι δυνατό να γραφτούν προγράμματα για τη GPU χωρίς να σκεφτόμαστε τη διανυσματική φύση των λειτουργικών μονάδων, αλλά η ταχύτητα ενός τέτοιου προγράμματος δεν θα είναι πολύ υψηλή. Το μειονέκτημα είναι το μεγάλο πλάτος του διανύσματος. Είναι περισσότερο από τον ονομαστικό αριθμό λειτουργικών μονάδων και είναι 32 για τις Nvidia GPU και 64 για το Radeon. Τα νήματα επεξεργάζονται σε μπλοκ του κατάλληλου μεγέθους. Η Nvidia ονομάζει αυτό το μπλοκ νημάτων τον όρο warp, AMD - wave front, που είναι το ίδιο πράγμα. Έτσι, σε 16 υπολογιστικές συσκευές, ένα "μέτωπο κύματος" μήκους 64 νημάτων επεξεργάζεται σε τέσσερις κύκλους (υποθέτοντας το συνηθισμένο μήκος εντολής). Ο συγγραφέας προτιμά τον όρο στημόνι σε αυτή την περίπτωση, λόγω της συσχέτισης με τον ναυτικό όρο στημόνι, που δηλώνει ένα σχοινί δεμένο από στριμμένα σχοινιά. Έτσι τα νήματα «στρίβονται» και σχηματίζουν μια αναπόσπαστη δέσμη. Ωστόσο, το «μέτωπο του κύματος» μπορεί επίσης να συσχετιστεί με τη θάλασσα: οι οδηγίες φτάνουν στους ενεργοποιητές με τον ίδιο τρόπο που τα κύματα κυλά στην ακτή το ένα μετά το άλλο.

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

Αν και κάθε miniprocessor (Streaming MultiProcessor ή SIMD Engine) εκτελεί εντολές που ανήκουν σε μόνο ένα warp (μια δέσμη νημάτων) ανά πάσα στιγμή, έχει αρκετές δεκάδες ενεργά warps στο εκτελέσιμο pool. Μετά την εκτέλεση των εντολών ενός στημονιού, ο μίνι επεξεργαστής δεν εκτελεί την επόμενη διαδοχική εντολή των νημάτων αυτού του στημόνι, αλλά τις οδηγίες κάποιου άλλου στο στημόνι. Αυτό το στημόνι μπορεί να βρίσκεται σε εντελώς διαφορετική θέση στο πρόγραμμα, αυτό δεν θα επηρεάσει την ταχύτητα, αφού μόνο μέσα στο στημόνι οι οδηγίες όλων των νημάτων πρέπει να είναι ίδιες για εκτέλεση σε πλήρη ταχύτητα.

Σε αυτήν την περίπτωση, καθένας από τους 20 κινητήρες SIMD έχει τέσσερα ενεργά μέτωπα κυμάτων, το καθένα με 64 νήματα. Κάθε νήμα υποδεικνύεται με μια σύντομη γραμμή. Σύνολο: 64×4×20=5120 νήματα

Έτσι, δεδομένου ότι κάθε στημόνι ή μέτωπο κύματος αποτελείται από 32-64 νήματα, ο μίνι επεξεργαστής έχει αρκετές εκατοντάδες ενεργά νήματα που εκτελούνται σχεδόν ταυτόχρονα. Παρακάτω θα δούμε τι αρχιτεκτονικά οφέλη υπόσχεται ένας τόσο μεγάλος αριθμός παράλληλων νημάτων, αλλά πρώτα θα εξετάσουμε ποιους περιορισμούς έχουν οι μικροεπεξεργαστές που αποτελούν τις GPU.

Το κύριο πράγμα είναι ότι η GPU δεν έχει στοίβα όπου θα μπορούσαν να αποθηκευτούν οι παράμετροι συνάρτησης και οι τοπικές μεταβλητές. Λόγω του μεγάλου αριθμού νημάτων για τη στοίβα, απλά δεν υπάρχει χώρος στο τσιπ. Πράγματι, δεδομένου ότι η GPU εκτελεί ταυτόχρονα περίπου 10.000 νήματα, με ένα μέγεθος στοίβας ενός νήματος 100 KB, το συνολικό ποσό θα είναι 1 GB, το οποίο είναι ίσο με την τυπική ποσότητα όλης της μνήμης βίντεο. Επιπλέον, δεν υπάρχει τρόπος να τοποθετήσετε μια στοίβα σημαντικού μεγέθους στον ίδιο τον πυρήνα της GPU. Για παράδειγμα, αν βάλετε 1000 byte στοίβας ανά νήμα, τότε μόνο ένας μικροεπεξεργαστής θα απαιτήσει 1 MB μνήμης, που είναι σχεδόν πενταπλάσιο της συνολικής τοπικής μνήμης του μικροεπεξεργαστή και της μνήμης που διατίθεται για την αποθήκευση καταχωρητών.

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

Ο Fermi εισήγαγε για πρώτη φορά τη δυνατότητα χρήσης εικονικών συναρτήσεων, αλλά και πάλι, η χρήση τους περιορίζεται από την έλλειψη μεγάλης, γρήγορης κρυφής μνήμης για κάθε νήμα. Τα 1536 νήματα αντιστοιχούν σε 48 KB ή 16 KB L1, δηλαδή, οι εικονικές λειτουργίες στο πρόγραμμα μπορούν να χρησιμοποιηθούν σχετικά σπάνια, διαφορετικά η στοίβα θα χρησιμοποιεί επίσης αργή παγκόσμια μνήμη, η οποία θα επιβραδύνει την εκτέλεση και, πιθανότατα, δεν θα αποφέρει οφέλη σε σύγκριση στην έκδοση της CPU.

Έτσι, η GPU παρουσιάζεται ως ένας υπολογιστικός συνεπεξεργαστής, στον οποίο φορτώνονται δεδομένα, επεξεργάζονται με κάποιο αλγόριθμο και παράγεται ένα αποτέλεσμα.

Οφέλη της Αρχιτεκτονικής

Αλλά θεωρεί την GPU πολύ γρήγορη. Και σε αυτό τον βοηθά η υψηλή πολυνωσιακή του. Ένας μεγάλος αριθμός ενεργών νημάτων καθιστά δυνατή τη μερική απόκρυψη του μεγάλου λανθάνοντος χρόνου της χωριστά τοποθετημένης καθολικής μνήμης βίντεο, που είναι περίπου 500 κύκλοι. Ισοπεδώνεται ιδιαίτερα καλά για κώδικα υψηλής πυκνότητας. αριθμητικές πράξεις. Έτσι, δεν απαιτείται ιεραρχία κρυφής μνήμης L1-L2-L3 που είναι ακριβή για τρανζίστορ. Αντίθετα, πολλές υπολογιστικές μονάδες μπορούν να τοποθετηθούν σε ένα τσιπ, παρέχοντας εξαιρετική αριθμητική απόδοση. Εν τω μεταξύ, οι οδηγίες ενός νήματος ή στημόνι εκτελούνται, τα άλλα εκατοντάδες νήματα περιμένουν ήσυχα τα δεδομένα τους.

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

Αλλά εκτός από τον λανθάνοντα χρόνο της καθολικής μνήμης, υπάρχουν πολύ περισσότεροι λανθάνοντες χρόνοι στην υπολογιστική συσκευή που πρέπει να κρυφτούν. Αυτή είναι η καθυστέρηση της μεταφοράς δεδομένων μέσα στο τσιπ από τις υπολογιστικές συσκευές στην κρυφή μνήμη πρώτου επιπέδου, δηλαδή στην τοπική μνήμη της GPU, και στους καταχωρητές, καθώς και στην κρυφή μνήμη εντολών. Το αρχείο καταχωρητή, καθώς και η τοπική μνήμη, βρίσκονται χωριστά από τις λειτουργικές μονάδες και η ταχύτητα πρόσβασης σε αυτές είναι περίπου δώδεκα κύκλοι. Και πάλι, ένας μεγάλος αριθμός νημάτων, ενεργά στημονιά, μπορούν να κρύψουν αποτελεσματικά αυτόν τον λανθάνοντα χρόνο. Επιπλέον, το συνολικό εύρος ζώνης (εύρος ζώνης) πρόσβασης στην τοπική μνήμη ολόκληρης της GPU, λαμβάνοντας υπόψη τον αριθμό των μικροεπεξεργαστών που την αποτελούν, είναι πολύ μεγαλύτερο από το εύρος ζώνης πρόσβασης στην κρυφή μνήμη πρώτου επιπέδου στις σύγχρονες CPU. Η GPU μπορεί να επεξεργαστεί σημαντικά περισσότερα δεδομένα ανά μονάδα χρόνου.

Μπορούμε αμέσως να πούμε ότι εάν η GPU δεν διαθέτει μεγάλο αριθμό παράλληλων νημάτων, τότε θα έχει σχεδόν μηδενική απόδοση, γιατί θα λειτουργεί με τον ίδιο ρυθμό, σαν να ήταν πλήρως φορτωμένη και θα κάνει πολύ λιγότερη δουλειά. Για παράδειγμα, αφήστε μόνο ένα νήμα να παραμείνει αντί για 10.000: η απόδοση θα μειωθεί κατά περίπου χίλιες φορές, επειδή όχι μόνο δεν θα φορτωθούν όλα τα μπλοκ, αλλά θα επηρεαστούν και όλες οι καθυστερήσεις.

Το πρόβλημα της απόκρυψης καθυστερήσεων είναι επίσης οξύ για τις σύγχρονες CPU υψηλής συχνότητας· χρησιμοποιούνται εξελιγμένες μέθοδοι για την εξάλειψή του - βαθιά διοχέτευση, εκτέλεση εντολών εκτός σειράς (εκτός σειράς). Αυτό απαιτεί πολύπλοκους προγραμματιστές εκτέλεσης εντολών, διάφορα buffer, κ.λπ., τα οποία καταλαμβάνουν χώρο στο τσιπ. Όλα αυτά απαιτούνται για την καλύτερη απόδοση σε λειτουργία μονού νήματος.

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

Η GPU σχεδιάστηκε αρχικά για να εκτελεί βέλτιστα προγράμματα shader για τρίγωνα pixel, τα οποία είναι προφανώς ανεξάρτητα και μπορούν να εκτελεστούν παράλληλα. Και από αυτήν την κατάσταση, εξελίχθηκε προσθέτοντας διάφορες δυνατότητες (τοπική μνήμη και προσπελάσιμη πρόσβαση στη μνήμη βίντεο, καθώς και περιπλέκοντας το σύνολο εντολών) σε μια πολύ ισχυρή υπολογιστική συσκευή, η οποία μπορεί ακόμα να εφαρμοστεί αποτελεσματικά μόνο για αλγόριθμους που επιτρέπουν εξαιρετικά παράλληλη υλοποίηση χρησιμοποιώντας περιορισμένο αριθμό τοπικής μνήμης.

Παράδειγμα

Ένα από τα πιο κλασικά προβλήματα GPU είναι το πρόβλημα του υπολογισμού της αλληλεπίδρασης Ν σωμάτων που δημιουργούν ένα βαρυτικό πεδίο. Αλλά αν, για παράδειγμα, πρέπει να υπολογίσουμε την εξέλιξη του συστήματος Γης-Σελήνης-Ήλιου, τότε η GPU είναι κακός βοηθός για εμάς: υπάρχουν λίγα αντικείμενα. Για κάθε αντικείμενο, είναι απαραίτητο να υπολογιστούν οι αλληλεπιδράσεις με όλα τα άλλα αντικείμενα και υπάρχουν μόνο δύο από αυτά. Στην περίπτωση της κίνησης του ηλιακού συστήματος με όλους τους πλανήτες και τα φεγγάρια τους (περίπου μερικές εκατοντάδες αντικείμενα), η GPU εξακολουθεί να μην είναι πολύ αποτελεσματική. Ωστόσο, ένας επεξεργαστής πολλαπλών πυρήνων, λόγω του υψηλού γενικού κόστους διαχείρισης νημάτων, δεν θα μπορεί επίσης να δείξει όλη του την ισχύ, θα λειτουργεί σε λειτουργία μονού νήματος. Αλλά εάν πρέπει επίσης να υπολογίσετε τις τροχιές των κομητών και των αντικειμένων της ζώνης αστεροειδών, τότε αυτό είναι ήδη μια εργασία για τη GPU, καθώς υπάρχουν αρκετά αντικείμενα για τη δημιουργία του απαιτούμενου αριθμού παράλληλων νημάτων υπολογισμού.

Η GPU θα έχει επίσης καλή απόδοση εάν είναι απαραίτητο να υπολογιστεί η σύγκρουση σφαιρικών σμηνών εκατοντάδων χιλιάδων αστέρων.

Μια άλλη ευκαιρία να χρησιμοποιήσετε την ισχύ της GPU στο πρόβλημα του σώματος N εμφανίζεται όταν πρέπει να υπολογίσετε πολλά μεμονωμένα προβλήματα, αν και με μικρό αριθμό σωμάτων. Για παράδειγμα, εάν θέλετε να υπολογίσετε την εξέλιξη ενός συστήματος για διαφορετικές επιλογές για αρχικές ταχύτητες. Τότε θα είναι δυνατή η αποτελεσματική χρήση της GPU χωρίς προβλήματα.

Λεπτομέρειες μικροαρχιτεκτονικής AMD Radeon

Εξετάσαμε τις βασικές αρχές της οργάνωσης της GPU, είναι κοινές για επιταχυντές βίντεο όλων των κατασκευαστών, αφού αρχικά είχαν ένα στόχο - προγράμματα shader. Ωστόσο, οι κατασκευαστές βρήκαν δυνατό να διαφωνήσουν σχετικά με τις λεπτομέρειες της μικροαρχιτεκτονικής υλοποίησης. Αν και οι CPU διαφορετικών προμηθευτών είναι μερικές φορές πολύ διαφορετικές, ακόμα κι αν είναι συμβατές, όπως Pentium 4 και Athlon ή Core. Η αρχιτεκτονική της Nvidia είναι ήδη ευρέως γνωστή, τώρα θα δούμε το Radeon και θα επισημάνουμε τις κύριες διαφορές στις προσεγγίσεις αυτών των προμηθευτών.

Οι κάρτες γραφικών AMD έχουν λάβει πλήρη υποστήριξη για υπολογιστές γενικού σκοπού από την οικογένεια Evergreen, η οποία πρωτοστάτησε επίσης στην προδιαγραφή DirectX 11. Οι οικογενειακές κάρτες 47xx έχουν ορισμένους σημαντικούς περιορισμούς, οι οποίοι θα συζητηθούν παρακάτω.

Οι διαφορές στο μέγεθος της τοπικής μνήμης (32 KB για το Radeon έναντι 16 KB για το GT200 και 64 KB για το Fermi) δεν είναι γενικά θεμελιώδεις. Καθώς και το μέγεθος μετώπου κύματος των 64 νημάτων για την AMD έναντι 32 νημάτων ανά στημόνι για τη Nvidia. Σχεδόν οποιοδήποτε πρόγραμμα GPU μπορεί εύκολα να ρυθμιστεί εκ νέου και να συντονιστεί σε αυτές τις παραμέτρους. Η απόδοση μπορεί να αλλάξει κατά δεκάδες τοις εκατό, αλλά στην περίπτωση μιας GPU, αυτό δεν είναι τόσο σημαντικό, επειδή ένα πρόγραμμα GPU συνήθως εκτελείται δέκα φορές πιο αργά από το αντίστοιχο για την CPU, ή δέκα φορές πιο γρήγορα ή δεν λειτουργεί καθόλου.

Πιο σημαντική είναι η χρήση AMD Technologies VLIW (Very Long Instruction Word). Η Nvidia χρησιμοποιεί βαθμωτές απλές οδηγίες που λειτουργούν σε βαθμωτούς καταχωρητές. Οι επιταχυντές του εφαρμόζουν απλό κλασικό RISC. Οι κάρτες γραφικών AMD έχουν τον ίδιο αριθμό καταχωρητών με το GT200, αλλά οι καταχωρητές είναι διανυσματικά 128 bit. Κάθε εντολή VLIW λειτουργεί σε πολλούς καταχωρητές 32-bit τεσσάρων συστατικών, κάτι παρόμοιο με το SSE, αλλά οι δυνατότητες του VLIW είναι πολύ ευρύτερες. Αυτό δεν είναι SIMD (Single Instruction Multiple Data) όπως το SSE - εδώ οι οδηγίες για κάθε ζεύγος τελεστών μπορεί να είναι διαφορετικές και ακόμη και εξαρτημένες! Για παράδειγμα, ας ονομαστούν τα στοιχεία του καταχωρητή Α a1, a2, a3, a4. για το μητρώο Β - ομοίως. Μπορεί να υπολογιστεί με μία μόνο εντολή που εκτελείται σε έναν κύκλο, για παράδειγμα, τον αριθμό a1×b1+a2×b2+a3×b3+a4×b4 ή ένα δισδιάστατο διάνυσμα (a1×b1+a2×b2, a3× b3+a4×b4).

Αυτό κατέστη δυνατό λόγω της χαμηλότερης συχνότητας της GPU από την CPU και της έντονης μείωσης των τεχνικών διαδικασιών τα τελευταία χρόνια. Αυτό δεν απαιτεί κανένα προγραμματιστή, σχεδόν τα πάντα εκτελούνται ανά ρολόι.

Με διανυσματικές οδηγίες, η μέγιστη απόδοση μονής ακρίβειας του Radeon είναι πολύ υψηλή, στα teraflops.

Ένας διανυσματικός καταχωρητής μπορεί να αποθηκεύσει έναν αριθμό διπλής ακρίβειας αντί για τέσσερις απλούς αριθμούς ακριβείας. Και μια εντολή VLIW μπορεί είτε να προσθέσει δύο ζεύγη διπλών, είτε να πολλαπλασιάσει δύο αριθμούς ή να πολλαπλασιάσει δύο αριθμούς και να προσθέσει στον τρίτο. Έτσι, η μέγιστη απόδοση στο διπλό είναι περίπου πέντε φορές χαμηλότερη από ό,τι στο float. Για παλαιότερα μοντέλα Radeon, αντιστοιχεί σε Nvidia PerformanceΗ Tesla στη νέα αρχιτεκτονική Fermi και πολύ υψηλότερη απόδοση από τις διπλές κάρτες στην αρχιτεκτονική GT200. Στις καταναλωτικές κάρτες γραφικών Geforce που βασίζονται στο Fermi, η μέγιστη ταχύτητα των διπλών υπολογισμών μειώθηκε κατά τέσσερις φορές.


Σχηματικό διάγραμμα του έργου του Radeon. Μόνο ένας μικροεπεξεργαστής εμφανίζεται από τους 20 που εκτελούνται παράλληλα

Οι κατασκευαστές GPU, σε αντίθεση με τους κατασκευαστές CPU (πρώτα απ 'όλα, τους συμβατούς με x86), δεν δεσμεύονται από ζητήματα συμβατότητας. Το πρόγραμμα GPU μεταγλωττίζεται πρώτα σε κάποιο ενδιάμεσο κώδικα και όταν εκτελείται το πρόγραμμα, το πρόγραμμα οδήγησης μεταγλωττίζει αυτόν τον κώδικα σε οδηγίες μηχανήματος που αφορούν συγκεκριμένα συγκεκριμένο μοντέλο. Όπως περιγράφεται παραπάνω, οι κατασκευαστές GPU το εκμεταλλεύτηκαν αυτό εφευρίσκοντας την βολική ISA (Instruction Set Architecture) για τις GPU τους και αλλάζοντας τις από γενιά σε γενιά. Σε κάθε περίπτωση, αυτό πρόσθεσε κάποιο ποσοστό απόδοσης λόγω της έλλειψης (ως περιττής) του αποκωδικοποιητή. Αλλά η AMD προχώρησε ακόμη παραπέρα, επινοώντας τη δική της μορφή για τη διάταξη των εντολών σε κώδικα μηχανής. Δεν είναι διατεταγμένα διαδοχικά (σύμφωνα με την λίστα του προγράμματος), αλλά σε ενότητες.

Πρώτα έρχεται η ενότητα των εντολών άλματος υπό όρους, οι οποίες έχουν συνδέσμους προς τμήματα συνεχών αριθμητικών εντολών που αντιστοιχούν σε διαφορετικούς κλάδους διακλάδωσης. Ονομάζονται δέσμες VLIW (δέσμες εντολών VLIW). Αυτές οι ενότητες περιέχουν μόνο αριθμητικές οδηγίες με δεδομένα από καταχωρητές ή τοπική μνήμη. Μια τέτοια οργάνωση απλοποιεί τη ροή των οδηγιών και την παράδοσή τους στις μονάδες εκτέλεσης. Αυτό είναι ακόμη πιο χρήσιμο δεδομένου ότι οι εντολές VLIW είναι σχετικά μεγάλες. Υπάρχουν επίσης ενότητες για οδηγίες πρόσβασης στη μνήμη.

Ενότητες Οδηγιών Υποκατάστημα υπό όρους
Ενότητα 0Διακλάδωση 0Σύνδεση με την ενότητα #3 των συνεχών αριθμητικών οδηγιών
Τμήμα 1Διακλάδωση 1Σύνδεσμος στην ενότητα #4
Τομέας 2Διακλάδωση 2Σύνδεσμος στην ενότητα #5
Ενότητες συνεχών αριθμητικών οδηγιών
Ενότητα 3Οδηγία VLIW 0Οδηγία VLIW 1Οδηγίες VLIW 2Οδηγίες VLIW 3
Ενότητα 4Οδηγίες VLIW 4Οδηγίες VLIW 5
Ενότητα 5Οδηγία VLIW 6Οδηγία VLIW 7Οδηγία VLIW 8Οδηγία VLIW 9

Οι GPU και των δύο κατασκευαστών (τόσο της Nvidia όσο και της AMD) διαθέτουν επίσης ενσωματωμένες οδηγίες για τον γρήγορο υπολογισμό βασικών μαθηματικών συναρτήσεων, τετραγωνικής ρίζας, εκθέτη, λογάριθμων, ημιτόνων και συνημίτονων για μεμονωμένους αριθμούς ακριβείας σε πολλούς κύκλους. Υπάρχουν ειδικά μπλοκ υπολογιστών για αυτό. «Προήλθαν» από την ανάγκη εφαρμογής μιας γρήγορης προσέγγισης αυτών των συναρτήσεων σε σκίαστρες γεωμετρίας.

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

Αλλά ένα πιο προφανές χαρακτηριστικό που προδίδει τη γραφική προέλευση της συσκευής είναι τα μπλοκ για την ανάγνωση δισδιάστατων και τρισδιάστατων υφών με υποστήριξη για διγραμμική παρεμβολή. Χρησιμοποιούνται ευρέως σε προγράμματα GPU, καθώς παρέχουν ταχύτερη και ευκολότερη ανάγνωση συστοιχιών δεδομένων μόνο για ανάγνωση. Ενας από τυπικές επιλογέςΗ συμπεριφορά μιας εφαρμογής GPU είναι να διαβάζει πίνακες αρχικών δεδομένων, να τους επεξεργάζεται στους υπολογιστικούς πυρήνες και να γράφει το αποτέλεσμα σε έναν άλλο πίνακα, ο οποίος στη συνέχεια μεταφέρεται πίσω στην CPU. Ένα τέτοιο σχήμα είναι τυπικό και κοινό, επειδή είναι βολικό για την αρχιτεκτονική GPU. Εργασίες που απαιτούν εντατική ανάγνωση και εγγραφή σε μια μεγάλη περιοχή της παγκόσμιας μνήμης, με αποτέλεσμα να περιέχουν εξαρτήσεις δεδομένων, είναι δύσκολο να παραλληλιστούν και να εφαρμοστούν αποτελεσματικά στη GPU. Επίσης, η απόδοσή τους θα εξαρτηθεί σε μεγάλο βαθμό από την καθυστέρηση της παγκόσμιας μνήμης, η οποία είναι πολύ μεγάλη. Αλλά αν η εργασία περιγράφεται από το μοτίβο "ανάγνωση δεδομένων - επεξεργασία - εγγραφή του αποτελέσματος", τότε σχεδόν σίγουρα μπορείτε να πάρετε μεγάλη ώθηση από την εκτέλεσή της στη GPU.

Για δεδομένα υφής στη GPU, υπάρχει μια ξεχωριστή ιεραρχία μικρών κρυφών μνήμων του πρώτου και του δεύτερου επιπέδου. Παρέχει επίσης επιτάχυνση από τη χρήση υφών. Αυτή η ιεραρχία εμφανίστηκε αρχικά στις GPU για να εκμεταλλευτεί την τοποθεσία πρόσβασης σε υφές: προφανώς, μετά την επεξεργασία ενός pixel, ένα γειτονικό pixel (με μεγάλη πιθανότητα) θα απαιτήσει δεδομένα υφής σε κοντινή απόσταση. Αλλά πολλοί αλγόριθμοι για συμβατικούς υπολογιστές έχουν παρόμοια φύση πρόσβασης σε δεδομένα. Έτσι, οι κρυφές μνήμες υφής από γραφικά θα είναι πολύ χρήσιμες.

Αν και το μέγεθος των κρυφών μνήμης L1-L2 στις κάρτες Nvidia και AMD είναι περίπου το ίδιο, κάτι που προφανώς προκαλείται από τις απαιτήσεις για βέλτιστη απόδοση όσον αφορά τα γραφικά του παιχνιδιού, η καθυστέρηση πρόσβασης σε αυτές τις κρυφές μνήμες διαφέρει σημαντικά. Ο λανθάνοντας χρόνος πρόσβασης της Nvidia είναι υψηλότερος και οι κρυφές μνήμες υφής στο Geforce συμβάλλουν κυρίως στη μείωση του φόρτου του διαύλου μνήμης, αντί να επιταχύνουν άμεσα την πρόσβαση στα δεδομένα. Αυτό δεν γίνεται αντιληπτό σε προγράμματα γραφικών, αλλά είναι σημαντικό για προγράμματα γενικής χρήσης. Στο Radeon, η καθυστέρηση της κρυφής μνήμης υφής είναι χαμηλότερη, αλλά η καθυστέρηση της τοπικής μνήμης των μικροεπεξεργαστών είναι υψηλότερη. Ακολουθεί ένα παράδειγμα: για βέλτιστο πολλαπλασιασμό μήτρας σε κάρτες Nvidia, είναι καλύτερο να χρησιμοποιήσετε τοπική μνήμη, φορτώνοντας τη μήτρα εκεί μπλοκ-μπλοκ και για την AMD, είναι καλύτερο να βασιστείτε σε μια κρυφή μνήμη υφής χαμηλής καθυστέρησης, διαβάζοντας στοιχεία μήτρας ως απαιτείται. Αλλά αυτό είναι ήδη μια μάλλον λεπτή βελτιστοποίηση και για έναν αλγόριθμο που έχει ήδη μεταφερθεί ουσιαστικά στη GPU.

Αυτή η διαφορά εμφανίζεται επίσης όταν χρησιμοποιείτε τρισδιάστατες υφές. Ένα από τα πρώτα benchmarks υπολογιστών GPU, που έδειξε ένα σοβαρό πλεονέκτημα για την AMD, απλώς χρησιμοποίησε τρισδιάστατες υφές, καθώς λειτουργούσε με μια τρισδιάστατη συστοιχία δεδομένων. Και η καθυστέρηση πρόσβασης στην υφή στο Radeon είναι σημαντικά ταχύτερη και η θήκη 3D είναι επιπλέον πιο βελτιστοποιημένη σε υλικό.

Για να έχετε τη μέγιστη απόδοση από το υλικό διαφόρων εταιρειών, απαιτείται κάποια ρύθμιση της εφαρμογής για μια συγκεκριμένη κάρτα, αλλά είναι μια τάξη μεγέθους λιγότερο σημαντική από, κατ' αρχήν, η ανάπτυξη ενός αλγορίθμου για την αρχιτεκτονική GPU.

Περιορισμοί της σειράς Radeon 47xx

Σε αυτήν την οικογένεια, η υποστήριξη για υπολογιστές GPU δεν είναι πλήρης. Υπάρχουν τρία σημαντικές στιγμές. Πρώτον, δεν υπάρχει τοπική μνήμη, δηλαδή είναι φυσικά εκεί, αλλά δεν έχει την καθολική πρόσβαση που απαιτείται από το σύγχρονο πρότυπο των προγραμμάτων GPU. Προσομοιώνεται μέσω προγραμματισμού στην παγκόσμια μνήμη, που σημαίνει ότι δεν θα ωφεληθεί από τη χρήση του σε αντίθεση με μια πλήρως εξοπλισμένη GPU. Το δεύτερο σημείο είναι η περιορισμένη υποστήριξη για διάφορες οδηγίες λειτουργίας ατομικής μνήμης και οδηγίες συγχρονισμού. Και το τρίτο σημείο είναι αρκετά μικρό μέγεθοςπροσωρινή μνήμη εντολών: ξεκινώντας από ένα συγκεκριμένο μέγεθος προγράμματος, η ταχύτητα μειώνεται αρκετές φορές. Υπάρχουν και άλλοι μικροί περιορισμοί. Μπορούμε να πούμε ότι μόνο τα προγράμματα που είναι ιδανικά κατάλληλα για την GPU θα λειτουργούν καλά σε αυτήν την κάρτα βίντεο. Αν και μια κάρτα βίντεο μπορεί να δείξει καλά αποτελέσματα σε Gigaflops σε απλά δοκιμαστικά προγράμματα που λειτουργούν μόνο με καταχωρητές, είναι προβληματικό να προγραμματίσετε αποτελεσματικά κάτι πολύπλοκο για αυτήν.

Πλεονεκτήματα και μειονεκτήματα του Evergreen

Αν συγκρίνουμε τα προϊόντα AMD και Nvidia, τότε, όσον αφορά τον υπολογισμό της GPU, η σειρά 5xxx μοιάζει με ένα πολύ ισχυρό GT200. Τόσο ισχυρό που ξεπερνά τον Fermi σε κορυφαία απόδοση κατά περίπου δυόμισι φορές. Ειδικά μετά την κοπή των παραμέτρων των νέων καρτών βίντεο Nvidia, μειώθηκε ο αριθμός των πυρήνων. Αλλά η εμφάνιση της κρυφής μνήμης L2 στο Fermi απλοποιεί την υλοποίηση κάποιων αλγορίθμων στη GPU, επεκτείνοντας έτσι το εύρος της GPU. Είναι ενδιαφέρον ότι για καλά βελτιστοποιημένα για την προηγούμενη γενιά προγράμματα GT200 CUDA, οι αρχιτεκτονικές καινοτομίες του Fermi συχνά δεν έκαναν τίποτα. Επιταχύνθηκαν ανάλογα με την αύξηση του αριθμού των υπολογιστικών μονάδων, δηλαδή λιγότερο από δύο φορές (για μεμονωμένους αριθμούς ακριβείας) ή ακόμη λιγότερο, επειδή το εύρος ζώνης της μνήμης δεν αυξήθηκε (ή για άλλους λόγους).

Και σε εργασίες που ταιριάζουν καλά στην αρχιτεκτονική της GPU και έχουν έντονη διανυσματική φύση (για παράδειγμα, πολλαπλασιασμός πίνακα), το Radeon δείχνει απόδοση σχετικά κοντά στη θεωρητική κορυφή και ξεπερνά τον Fermi. Για να μην αναφέρουμε τους πολυπύρηνους CPU. Ειδικά σε προβλήματα με απλούς αριθμούς ακριβείας.

Αλλά το Radeon έχει μικρότερη επιφάνεια μήτρας, λιγότερη απαγωγή θερμότητας, κατανάλωση ενέργειας, υψηλότερη απόδοση και, κατά συνέπεια, χαμηλότερο κόστος. Και απευθείας στα προβλήματα των τρισδιάστατων γραφικών, το κέρδος Fermi, αν υπάρχει, είναι πολύ μικρότερο από τη διαφορά στην περιοχή του κρυστάλλου. Αυτό οφείλεται σε μεγάλο βαθμό στο γεγονός ότι η υπολογιστική αρχιτεκτονική του Radeon, με 16 υπολογιστικές μονάδες ανά μίνι επεξεργαστή, μέτωπο κύματος 64 νημάτων και διανυσματικές οδηγίες VLIW, είναι τέλεια για την κύρια εργασία της - τον υπολογισμό των shaders γραφικών. Για τη συντριπτική πλειοψηφία απλούς χρήστεςΗ απόδοση και η τιμή του παιχνιδιού αποτελούν προτεραιότητα.

Από την άποψη των επαγγελματικών, επιστημονικών προγραμμάτων, η αρχιτεκτονική Radeon παρέχει την καλύτερη αναλογία τιμής-απόδοσης, απόδοση ανά watt και απόλυτη απόδοση σε εργασίες που καταρχήν ταιριάζουν καλά με την αρχιτεκτονική GPU, επιτρέπουν παραλληλισμό και διανυσματοποίηση.

Για παράδειγμα, σε ένα πλήρως παράλληλο, εύκολα διανυσματικό πρόβλημα επιλογής κλειδιού, το Radeon είναι αρκετές φορές γρηγορότερο από το Geforce και αρκετές δεκάδες φορές ταχύτερο από το CPU.

Αυτό αντιστοιχεί στη γενική ιδέα της AMD Fusion, σύμφωνα με την οποία οι GPU θα πρέπει να συμπληρώνουν την CPU και στο μέλλον να ενσωματώνονται στον ίδιο τον πυρήνα της CPU, όπως ο μαθηματικός συνεπεξεργαστής είχε προηγουμένως μεταφερθεί από ένα ξεχωριστό τσιπ στον πυρήνα του επεξεργαστή (αυτό συνέβη περίπου πριν από είκοσι χρόνια, πριν από την εμφάνιση των πρώτων επεξεργαστών Pentium). Η GPU θα ενσωματωθεί πυρήνα γραφικώνκαι έναν διανυσματικό συνεπεξεργαστή για εργασίες ροής.

Το Radeon χρησιμοποιεί μια δύσκολη τεχνική ανάμειξης εντολών από διαφορετικά μέτωπα κυμάτων όταν εκτελούνται από λειτουργικές μονάδες. Αυτό είναι εύκολο να γίνει αφού οι οδηγίες είναι εντελώς ανεξάρτητες. Η αρχή είναι παρόμοια με τη διοχετευτική εκτέλεση ανεξάρτητων εντολών από τις σύγχρονες CPU. Προφανώς, αυτό καθιστά δυνατή την αποτελεσματική εκτέλεση πολύπλοκων, πολλαπλών byte, διανυσματικών εντολών VLIW. Στη CPU, αυτό απαιτεί έναν εξελιγμένο χρονοπρογραμματιστή για τον εντοπισμό ανεξάρτητων οδηγιών ή τη χρήση της τεχνολογίας Hyper-Threading, η οποία επίσης παρέχει στην CPU γνωστές ανεξάρτητες οδηγίες από διαφορετικά νήματα.

μέτρο 0μπάρα 1μέτρο 2μέτρο 3μπάρα 4μέτρο 5μέτρο 6μέτρο 7Μονάδα VLIW
μέτωπο κύματος 0μέτωπο κύματος 1μέτωπο κύματος 0μέτωπο κύματος 1μέτωπο κύματος 0μέτωπο κύματος 1μέτωπο κύματος 0μέτωπο κύματος 1
instr. 0instr. 0instr. 16instr. 16instr. 32instr. 32instr. 48instr. 48VLIW0
instr. έναςVLIW1
instr. 2VLIW2
instr. 3VLIW3
instr. τέσσεριςVLIW4
instr. 5VLIW5
instr. 6VLIW6
instr. 7VLIW7
instr. οκτώVLIW8
instr. 9VLIW9
instr. δέκαVLIW10
instr. έντεκαVLIW11
instr. 12VLIW12
instr. 13VLIW13
instr. δεκατέσσεραVLIW14
instr. δεκαπέντεVLIW15

128 εντολές δύο μετώπων κυμάτων, καθένα από τα οποία αποτελείται από 64 λειτουργίες, εκτελούνται από 16 μονάδες VLIW σε οκτώ κύκλους. Υπάρχει μια εναλλαγή και κάθε ενότητα έχει στην πραγματικότητα δύο κύκλους για να εκτελέσει μια ολόκληρη εντολή, υπό την προϋπόθεση ότι θα ξεκινήσει να εκτελεί μια νέα παράλληλα στον δεύτερο κύκλο. Αυτό πιθανώς βοηθά στη γρήγορη εκτέλεση μιας εντολής VLIW όπως a1×a2+b1×b2+c1×c2+d1×d2, δηλαδή, στην εκτέλεση οκτώ τέτοιων εντολών σε οκτώ κύκλους. (Τυπικά, αποδεικνύεται, ένα ανά ρολόι.)

Η Nvidia προφανώς δεν έχει αυτήν την τεχνολογία. Και ελλείψει VLIW, η υψηλή απόδοση χρησιμοποιώντας βαθμωτές οδηγίες απαιτεί υψηλή συχνότητα λειτουργίας, η οποία αυξάνει αυτόματα τη διάχυση θερμότητας και δημιουργεί υψηλές απαιτήσεις στη διαδικασία (για να αναγκάσει το κύκλωμα να λειτουργεί σε υψηλότερη συχνότητα).

Το μειονέκτημα του Radeon όσον αφορά τον υπολογισμό της GPU είναι μια μεγάλη αντιπάθεια για διακλάδωση. Οι GPU γενικά δεν ευνοούν τη διακλάδωση λόγω της παραπάνω τεχνολογίας για την εκτέλεση εντολών: αμέσως από μια ομάδα νημάτων με μία διεύθυνση προγράμματος. (Παρεμπιπτόντως, αυτή η τεχνική ονομάζεται SIMT: Single Instruction - Multiple Threads (μία εντολή - πολλά threads), κατ' αναλογία με το SIMD, όπου μια εντολή εκτελεί μια λειτουργία με διαφορετικά δεδομένα.) . Είναι σαφές ότι εάν το πρόγραμμα δεν είναι εντελώς διανυσματικό, τότε όσο μεγαλύτερο είναι το μέγεθος του στημονιού ή του μετώπου κύματος, τόσο χειρότερο, αφού όταν η διαδρομή κατά μήκος του προγράμματος αποκλίνει, σχηματίζονται γειτονικά νήματα περισσότερες ομάδες, το οποίο πρέπει να εκτελεστεί διαδοχικά (σειριακά). Ας υποθέσουμε ότι όλα τα νήματα έχουν διασκορπιστεί, τότε στην περίπτωση ενός μεγέθους στημόνι 32 νημάτων, το πρόγραμμα θα εκτελείται 32 φορές πιο αργά. Και στην περίπτωση του μεγέθους 64, όπως στο Radeon, είναι 64 φορές πιο αργό.

Αυτή είναι μια αισθητή, αλλά όχι η μοναδική εκδήλωση «αντιπάθειας». Στις κάρτες γραφικών Nvidia, κάθε λειτουργική μονάδα, που αλλιώς ονομάζεται πυρήνας CUDA, έχει μια ειδική μονάδα επεξεργασίας κλάδου. Και στις κάρτες γραφικών Radeon για 16 υπολογιστικές μονάδες, υπάρχουν μόνο δύο μονάδες ελέγχου διακλάδωσης (προέρχονται από τον τομέα των αριθμητικών μονάδων). Έτσι, ακόμη και η απλή επεξεργασία μιας εντολής διακλάδωσης υπό όρους, ακόμα κι αν το αποτέλεσμά της είναι το ίδιο για όλα τα νήματα στο μέτωπο κύματος, απαιτεί επιπλέον χρόνο. Και η ταχύτητα πέφτει.

Η AMD κατασκευάζει επίσης CPU. Πιστεύουν ότι για προγράμματα με πολλούς κλάδους, η CPU είναι ακόμα πιο κατάλληλη και η GPU προορίζεται για αμιγώς διανυσματικά προγράμματα.

Έτσι, το Radeon παρέχει λιγότερο αποτελεσματικό προγραμματισμό συνολικά, αλλά καλύτερη αναλογία τιμής-απόδοσης σε πολλές περιπτώσεις. Με άλλα λόγια, υπάρχουν λιγότερα προγράμματα που μπορούν να μεταφερθούν αποτελεσματικά (ευεργετικά) από την CPU στο Radeon από τα προγράμματα που μπορούν να εκτελεστούν αποτελεσματικά στο Fermi. Αλλά από την άλλη πλευρά, αυτά που μπορούν να μεταφερθούν αποτελεσματικά θα λειτουργήσουν πιο αποτελεσματικά στο Radeon με πολλούς τρόπους.

API για υπολογιστές GPU

τους εαυτούς τους τεχνικές προδιαγραφέςΤο Radeon φαίνεται ελκυστικό, ακόμα κι αν δεν είναι απαραίτητο να εξιδανικεύσουμε και να απολυτοποιήσουμε τους υπολογιστές GPU. Αλλά όχι λιγότερο σημαντικό για την απόδοση είναι το λογισμικό που είναι απαραίτητο για την ανάπτυξη και εκτέλεση ενός προγράμματος GPU - μεταγλωττιστές από μια γλώσσα υψηλού επιπέδου και χρόνο εκτέλεσης, δηλαδή ένα πρόγραμμα οδήγησης που αλληλεπιδρά μεταξύ ενός μέρους του προγράμματος που εκτελείται στη CPU και τη GPU εαυτό. Είναι ακόμη πιο σημαντικό από ό,τι στην περίπτωση της CPU: η CPU δεν χρειάζεται πρόγραμμα οδήγησης για τη διαχείριση της μεταφοράς δεδομένων και από την άποψη του μεταγλωττιστή, η GPU είναι πιο λεπτή. Για παράδειγμα, ο μεταγλωττιστής πρέπει να αρκεστεί σε έναν ελάχιστο αριθμό καταχωρητών για να αποθηκεύει τα ενδιάμεσα αποτελέσματα των υπολογισμών και τις προσεκτικά ενσωματωμένες κλήσεις συναρτήσεων, χρησιμοποιώντας πάλι έναν ελάχιστο αριθμό καταχωρητών. Σε τελική ανάλυση, όσο λιγότερες καταχωρήσεις χρησιμοποιεί ένα νήμα, τόσο περισσότερα νήματα μπορείτε να εκτελέσετε και τόσο πιο πλήρης φόρτωση της GPU, αποκρύπτοντας καλύτερα τον χρόνο πρόσβασης στη μνήμη.

Και έτσι η υποστήριξη λογισμικού για τα προϊόντα Radeon εξακολουθεί να υστερεί σε σχέση με την ανάπτυξη υλικού. (Σε αντίθεση με την κατάσταση με τη Nvidia, όπου η κυκλοφορία του υλικού καθυστέρησε και το προϊόν κυκλοφόρησε σε απογυμνωμένη μορφή.) Πιο πρόσφατα, ο μεταγλωττιστής OpenCL της AMD ήταν σε κατάσταση beta, με πολλά ελαττώματα. Πολύ συχνά δημιουργούσε λανθασμένο κώδικα, ή αρνήθηκε να μεταγλωττίσει τον κώδικα από τον σωστό πηγαίο κώδικα, ή το ίδιο έδωσε ένα σφάλμα και κατέρρευσε. Μόλις στα τέλη της άνοιξης ήρθε μια κυκλοφορία με υψηλές επιδόσεις. Δεν είναι επίσης χωρίς σφάλματα, αλλά υπάρχουν σημαντικά λιγότερα από αυτά και, κατά κανόνα, εμφανίζονται στο περιθώριο όταν προσπαθείτε να προγραμματίσετε κάτι στα όρια της ορθότητας. Για παράδειγμα, λειτουργούν με τον τύπο uchar4, ο οποίος καθορίζει μια μεταβλητή τεσσάρων συστατικών 4 byte. Αυτός ο τύπος είναι στις προδιαγραφές OpenCL, αλλά δεν αξίζει να δουλέψετε μαζί του στο Radeon, επειδή οι καταχωρητές είναι 128-bit: τα ίδια τέσσερα στοιχεία, αλλά 32-bit. Και μια τέτοια μεταβλητή uchar4 θα εξακολουθεί να καταλαμβάνει έναν ολόκληρο καταχωρητή, θα απαιτούνται μόνο πρόσθετες λειτουργίες συσκευασίας και πρόσβασης σε μεμονωμένα στοιχεία byte. Ένας μεταγλωττιστής δεν πρέπει να έχει σφάλματα, αλλά δεν υπάρχουν μεταγλωττιστές χωρίς σφάλματα. Ακόμη και ο μεταγλωττιστής Intel μετά από 11 εκδόσεις έχει σφάλματα μεταγλώττισης. Τα σφάλματα που εντοπίστηκαν διορθώνονται στην επόμενη έκδοση, η οποία θα κυκλοφορήσει πιο κοντά στο φθινόπωρο.

Υπάρχουν όμως ακόμα πολλά πράγματα που πρέπει να βελτιωθούν. Για παράδειγμα, μέχρι τώρα, το τυπικό πρόγραμμα οδήγησης GPU για το Radeon δεν υποστηρίζει υπολογιστές GPU με χρήση OpenCL. Ο χρήστης πρέπει να κατεβάσει και να εγκαταστήσει ένα πρόσθετο ειδικό πακέτο.

Αλλά το πιο σημαντικό πράγμα είναι η απουσία βιβλιοθηκών συναρτήσεων. Για πραγματικούς αριθμούς διπλής ακρίβειας, δεν υπάρχει καν ημίτονο, συνημίτονο και εκθέτης. Λοιπόν, αυτό δεν απαιτείται για προσθήκη/πολλαπλασιασμό μήτρας, αλλά αν θέλετε να προγραμματίσετε κάτι πιο περίπλοκο, πρέπει να γράψετε όλες τις συναρτήσεις από την αρχή. Ή περιμένετε για μια νέα έκδοση SDK. Το ACML θα κυκλοφορήσει σύντομα ( AMD Core Math Library) για την οικογένεια Evergreen GPU με υποστήριξη για βασικές λειτουργίες matrix.

Αυτή τη στιγμή, σύμφωνα με τον συγγραφέα του άρθρου, η χρήση του Direct Compute 5.0 API φαίνεται να είναι πραγματική για τον προγραμματισμό καρτών βίντεο Radeon, λαμβάνοντας φυσικά υπόψη τους περιορισμούς: προσανατολισμό στην πλατφόρμα Windows 7 και Windows Vista. Η Microsoft έχει μεγάλη εμπειρία στη δημιουργία μεταγλωττιστών και μπορούμε να περιμένουμε μια πλήρως λειτουργική έκδοση πολύ σύντομα, η Microsoft ενδιαφέρεται άμεσα για αυτό. Αλλά το Direct Compute εστιάζει στις ανάγκες των διαδραστικών εφαρμογών: να υπολογίσει κάτι και να οπτικοποιήσει αμέσως το αποτέλεσμα - για παράδειγμα, τη ροή ενός υγρού πάνω από μια επιφάνεια. Αυτό δεν σημαίνει ότι δεν μπορεί να χρησιμοποιηθεί απλώς για υπολογισμούς, αλλά δεν είναι αυτός ο φυσικός σκοπός του. Για παράδειγμα, η Microsoft δεν σχεδιάζει να προσθέσει λειτουργίες βιβλιοθήκης στο Direct Compute - ακριβώς αυτές που η AMD δεν διαθέτει αυτή τη στιγμή. Δηλαδή, ό,τι μπορεί τώρα να υπολογιστεί αποτελεσματικά στο Radeon - ορισμένα όχι πολύ εξελιγμένα προγράμματα - μπορεί επίσης να εφαρμοστεί στο Direct Compute, το οποίο είναι πολύ πιο απλό από το OpenCL και θα πρέπει να είναι πιο σταθερό. Επιπλέον, είναι εντελώς φορητό και θα τρέχει τόσο σε Nvidia όσο και σε AMD, επομένως θα χρειαστεί να μεταγλωττίσετε το πρόγραμμα μόνο μία φορά, ενώ οι υλοποιήσεις OpenCL SDK της Nvidia και της AMD δεν είναι ακριβώς συμβατές. (Με την έννοια ότι εάν αναπτύξετε ένα πρόγραμμα OpenCL σε ένα σύστημα AMD χρησιμοποιώντας το AMD OpenCL SDK, ενδέχεται να μην εκτελείται τόσο εύκολα στη Nvidia. Ίσως χρειαστεί να μεταγλωττίσετε το ίδιο κείμενο χρησιμοποιώντας το Nvidia SDK. Και το αντίστροφο, φυσικά. )

Στη συνέχεια, υπάρχει πολλή περιττή λειτουργικότητα στο OpenCL, αφού η OpenCL προορίζεται να είναι μια καθολική γλώσσα προγραμματισμού και API για ένα ευρύ φάσμα συστημάτων. Και GPU, και CPU, και Cell. Έτσι, στην περίπτωση που θέλετε απλώς να γράψετε ένα πρόγραμμα για ένα τυπικό σύστημα χρήστη (επεξεργαστής συν κάρτα βίντεο), το OpenCL δεν φαίνεται να είναι, ας το πούμε έτσι, "υψηλά παραγωγικό". Κάθε συνάρτηση έχει δέκα παραμέτρους και οι εννέα από αυτές πρέπει να οριστούν στο 0. Και για να ορίσετε κάθε παράμετρο, πρέπει να καλέσετε μια ειδική συνάρτηση που έχει επίσης παραμέτρους.

Και το πιο σημαντικό τρέχον πλεονέκτημα του Direct Compute είναι ότι ο χρήστης δεν χρειάζεται να εγκαταστήσει ένα ειδικό πακέτο: ό,τι χρειάζεται είναι ήδη στο DirectX 11.

Προβλήματα ανάπτυξης υπολογιστών GPU

Αν πάρουμε τον τομέα των προσωπικών υπολογιστών, τότε η κατάσταση έχει ως εξής: δεν υπάρχουν πολλές εργασίες που απαιτούν μεγάλη υπολογιστική ισχύ και λείπουν σοβαρά από έναν συμβατικό επεξεργαστή διπλού πυρήνα. Ήταν σαν μεγάλα λαίμαργα, αλλά αδέξια τέρατα να είχαν συρθεί από τη θάλασσα στη στεριά, και δεν υπήρχε σχεδόν τίποτα να φάει στη στεριά. Και οι αρχέγονες κατοικίες της επιφάνειας της γης μειώνονται σε μέγεθος, μαθαίνοντας να καταναλώνουν λιγότερο, όπως συμβαίνει πάντα όταν υπάρχει έλλειψη φυσικών πόρων. Αν σήμερα υπήρχε η ίδια ανάγκη για απόδοση όπως πριν από 10-15 χρόνια, ο υπολογισμός GPU θα γινόταν δεκτός με μεγάλη έκρηξη. Και έτσι τα προβλήματα συμβατότητας και η σχετική πολυπλοκότητα του προγραμματισμού GPU έρχονται στο προσκήνιο. Είναι καλύτερο να γράψετε ένα πρόγραμμα που τρέχει σε όλα τα συστήματα παρά ένα πρόγραμμα που είναι γρήγορο αλλά τρέχει μόνο στη GPU.

Οι προοπτικές για τις GPU είναι κάπως καλύτερες όσον αφορά τη χρήση σε επαγγελματικές εφαρμογές και τον τομέα των σταθμών εργασίας, καθώς υπάρχει μεγαλύτερη ζήτηση για απόδοση. Εμφανίζονται πρόσθετα για επεξεργαστές 3D με δυνατότητα GPU: για παράδειγμα, για απόδοση με ανίχνευση ακτίνων - δεν πρέπει να συγχέεται με την κανονική απόδοση GPU! Κάτι εμφανίζεται και για τους επεξεργαστές 2D και παρουσιάσεων, με ταχύτερη δημιουργία πολύπλοκων εφέ. Τα προγράμματα επεξεργασίας βίντεο αποκτούν επίσης σταδιακά υποστήριξη για την GPU. Οι παραπάνω εργασίες, λόγω της παράλληλης φύσης τους, ταιριάζουν καλά στην αρχιτεκτονική της GPU, αλλά τώρα έχει δημιουργηθεί μια πολύ μεγάλη βάση κώδικα, έχει εντοπιστεί σφάλματα, βελτιστοποιηθεί για όλες τις δυνατότητες της CPU, οπότε θα χρειαστεί χρόνος για να εμφανιστούν καλές υλοποιήσεις GPU.

Σε αυτό το τμήμα, εκδηλώνονται επίσης τέτοιες αδυναμίες της GPU, όπως μια περιορισμένη ποσότητα μνήμης βίντεο - περίπου 1 GB για τις συμβατικές GPU. Ένας από τους κύριους παράγοντες που μειώνουν την απόδοση των προγραμμάτων GPU είναι η ανάγκη ανταλλαγής δεδομένων μεταξύ της CPU και της GPU μέσω αργού διαύλου και λόγω του περιορισμένου όγκου μνήμης, πρέπει να μεταφερθούν περισσότερα δεδομένα. Και εδώ, η ιδέα της AMD να συνδυάζει GPU και CPU σε μια μονάδα φαίνεται πολλά υποσχόμενη: μπορείτε να θυσιάσετε το υψηλό εύρος ζώνης της μνήμης γραφικών για εύκολη και απλή πρόσβαση στην κοινόχρηστη μνήμη, επιπλέον, με χαμηλότερο λανθάνοντα χρόνο. Αυτό το υψηλό εύρος ζώνης της τρέχουσας μνήμης βίντεο DDR5 έχει πολύ μεγαλύτερη ζήτηση άμεσα γραφικά προγράμματααπό τα περισσότερα υπολογιστικά προγράμματα GPU. Γενικά, Κοινή μνήμηΗ GPU και η CPU απλώς θα επεκτείνουν σημαντικά το εύρος της GPU, θα καταστήσουν δυνατή τη χρήση των υπολογιστικών της δυνατοτήτων σε μικρές δευτερεύουσες εργασίες προγραμμάτων.

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

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

Ενα από τα πολλά κρυφά χαρακτηριστικά, σε μια πρόσφατη ενημέρωση των Windows 10, είναι η δυνατότητα να ελέγχετε ποιες εφαρμογές χρησιμοποιούν τη μονάδα επεξεργασίας γραφικών (GPU). Εάν έχετε ανοίξει ποτέ τη Διαχείριση εργασιών, πιθανότατα έχετε κοιτάξει τη χρήση της CPU σας για να δείτε ποιες εφαρμογές έχουν τη μεγαλύτερη ένταση CPU. ΣΤΟ πιο πρόσφατες ενημερώσειςπρόσθεσε μια παρόμοια δυνατότητα αλλά για GPU GPU. Βοηθά να κατανοήσετε πόσο εντατικό είναι το λογισμικό και τα παιχνίδια σας στη GPU σας χωρίς να κάνετε λήψη λογισμικού τρίτων. Υπάρχει μια άλλη ενδιαφέρουσα δυνατότητα που βοηθά στη μεταφόρτωση της CPU στη GPU. Συνιστώ να διαβάσετε πώς να επιλέξετε.

Γιατί δεν έχω GPU στη Διαχείριση εργασιών;

Δυστυχώς, δεν θα μπορούν όλες οι κάρτες γραφικών να παρέχουν στα Windows τα στατιστικά στοιχεία που χρειάζονται για την ανάγνωση της GPU. Για να είστε σίγουροι, μπορείτε να χρησιμοποιήσετε γρήγορα το διαγνωστικό εργαλείο DirectX για να δοκιμάσετε αυτήν την τεχνολογία.

  1. Κάντε κλικ " Αρχή«και στην αναζήτηση γράψε dxdiagγια να εκτελέσετε το Εργαλείο διάγνωσης DirectX.
  2. Μετάβαση στην καρτέλα " Οθόνη",ακριβώς στη στήλη οδηγούς"Έπρεπε να είχες Μοντέλο WDDMέκδοση μεγαλύτερη από 2.0 για χρήση των γραφημάτων GPU στη διαχείριση εργασιών.

Ενεργοποίηση γραφήματος GPU στη Διαχείριση εργασιών

Για να δείτε τη χρήση της GPU για κάθε εφαρμογή, πρέπει να ανοίξετε τη Διαχείριση εργασιών.

  • Πατήστε συνδυασμός κουμπιών Ctrl + Shift + Escγια να ανοίξετε τη Διαχείριση εργασιών.
  • Κάντε κλικ κάντε δεξί κλικκάντε κλικ στη διαχείριση εργασιών στο πεδίο κενό " Ονομα"και ελέγξτε από το αναπτυσσόμενο μενού GPU.Μπορείτε επίσης να σημειώσετε Πυρήνας GPUγια να δείτε ποια προγράμματα το χρησιμοποιούν.
  • Τώρα στη διαχείριση εργασιών, το γράφημα της GPU και ο πυρήνας της GPU είναι ορατά στα δεξιά.


Δείτε τη συνολική απόδοση της GPU

Μπορείτε να παρακολουθείτε τη συνολική χρήση της GPU για παρακολούθηση και ανάλυση κάτω από μεγάλα φορτία. Σε αυτήν την περίπτωση, μπορείτε να δείτε όλα όσα χρειάζεστε στο " Εκτέλεση"επιλέγοντας επεξεργαστή γραφικών.


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


Ποτέ δεν υπάρχουν πάρα πολλοί πυρήνες...

Οι σύγχρονες GPU είναι τερατώδη γρήγορα θηρία ικανά να μασήσουν gigabyte δεδομένων. Ωστόσο, ένας άνθρωπος είναι πονηρός και, ανεξάρτητα από το πώς μεγαλώνει υπολογιστική ισχύς, έρχεται με εργασίες όλο και πιο δύσκολες, οπότε έρχεται η στιγμή που πρέπει να δηλώσετε με λύπη ότι χρειάζεται βελτιστοποίηση 🙁

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

Οι λόγοι για τους οποίους οι GPU είναι αποτελεσματικές για την αντιμετώπιση μεγάλων ποσοτήτων δεδομένων που απαιτούν επεξεργασία:

  • έχουν μεγάλες ευκαιρίες για παράλληλη εκτέλεση εργασιών (πολλοί, πολλοί επεξεργαστές)
  • υψηλό εύρος ζώνης μνήμης

Εύρος ζώνης μνήμης- αυτό είναι πόσες πληροφορίες - bit ή gigabyte - μπορούν να μεταφερθούν ανά μονάδα χρόνου, ένα δευτερόλεπτο ή έναν κύκλο επεξεργαστή.

Ένα από τα καθήκοντα της βελτιστοποίησης είναι η χρήση της μέγιστης απόδοσης - για την αύξηση της απόδοσης διακίνηση(ιδανικά, θα πρέπει να είναι ίσο με το εύρος ζώνης μνήμης).

Για να βελτιώσετε τη χρήση εύρους ζώνης:

  • αυξήστε τον όγκο των πληροφοριών - χρησιμοποιήστε πλήρως το εύρος ζώνης (για παράδειγμα, κάθε ροή λειτουργεί με float4)
  • μείωση της καθυστέρησης - η καθυστέρηση μεταξύ των λειτουργιών

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

Πώς να μειώσετε την καθυστέρηση εάν χρησιμοποιείται συγχρονισμός:

  • μειώστε τον αριθμό των νημάτων σε ένα μπλοκ
  • αυξήστε τον αριθμό των ομάδων μπλοκ

Πλήρης χρήση πόρων GPU - Κατοχή GPU

Σε συζητήσεις σχετικά με τη βελτιστοποίηση, ο όρος συχνά αναβοσβήνει - κατοχή gpuή κατάληψη πυρήνα- αντικατοπτρίζει την αποτελεσματικότητα της χρήσης των πόρων-χωρητικοτήτων της κάρτας βίντεο. Ξεχωριστά, σημειώνω ότι ακόμα κι αν χρησιμοποιείτε όλους τους πόρους, αυτό δεν σημαίνει ότι τους χρησιμοποιείτε σωστά.

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

Να σας θυμίσω ότι το στημόνι ( στημόνι στην ορολογία της NVidia, μέτωπο κύματος - στην ορολογία AMD) - ένα σύνολο νημάτων που εκτελούν ταυτόχρονα την ίδια λειτουργία πυρήνα στον επεξεργαστή. Τα νήματα που ενώνονται από τον προγραμματιστή σε μπλοκ χωρίζονται σε παραμορφώσεις από τον χρονοπρογραμματιστή νημάτων (ξεχωριστά για κάθε πολυεπεξεργαστή) - ενώ εκτελείται το ένα στημόνι, το δεύτερο αναμένει να επεξεργαστεί αιτήματα μνήμης κ.λπ. Εάν ορισμένα από τα νήματα στημόνι εξακολουθούν να εκτελούν υπολογισμούς, ενώ άλλα έχουν ήδη κάνει το καλύτερο δυνατό, τότε υπάρχει μια αναποτελεσματική χρήση του υπολογιστικού πόρου - που ευρέως αναφέρεται ως ισχύς αδράνειας.

Κάθε σημείο συγχρονισμού, κάθε κλάδος της λογικής μπορεί να δημιουργήσει μια τέτοια κατάσταση αδράνειας. Η μέγιστη απόκλιση (διακλάδωση της λογικής εκτέλεσης) εξαρτάται από το μέγεθος του στημονιού. Για τις GPU της NVidia, αυτό είναι 32, για την AMD, 64.

Για να μειώσετε το χρόνο διακοπής λειτουργίας πολλών επεξεργαστών κατά την εκτέλεση στρέβλωσης:

  • ελαχιστοποιήστε τα εμπόδια χρόνου αναμονής
  • ελαχιστοποιήστε την απόκλιση της λογικής εκτέλεσης στη συνάρτηση πυρήνα

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

ο πυρήνας εκτοξεύεται με μπλοκ 64×16, τα νήματα χωρίζονται σε στημόνι με τη σειρά X, Y, Z - δηλ. τα πρώτα 64 στοιχεία χωρίζονται σε δύο στημόνι, μετά το δεύτερο και ούτω καθεξής.

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

Πώς να μειώσετε την απόκλιση (θυμηθείτε - η διακλάδωση δεν είναι πάντα η αιτία μιας κρίσιμης απώλειας απόδοσης)

  • όταν τα γειτονικά νήματα έχουν διαφορετικές διαδρομές εκτέλεσης - πολλές συνθήκες και μεταβάσεις σε αυτά - αναζητήστε τρόπους αναδιάρθρωσης
  • αναζητήστε ένα μη ισορροπημένο φορτίο νημάτων και αφαιρέστε το αποφασιστικά (αυτό συμβαίνει όταν όχι μόνο έχουμε προϋποθέσεις, αλλά λόγω αυτών των συνθηκών, το πρώτο νήμα υπολογίζει πάντα κάτι και το πέμπτο δεν εμπίπτει σε αυτήν την κατάσταση και είναι αδρανές)

Πώς να αξιοποιήσετε στο έπακρο τους πόρους της GPU

Οι πόροι GPU, δυστυχώς, έχουν επίσης τους περιορισμούς τους. Και, αυστηρά μιλώντας, πριν από την εκκίνηση της συνάρτησης πυρήνα, είναι λογικό να καθοριστούν τα όρια και να ληφθούν υπόψη αυτά τα όρια κατά τη διανομή του φορτίου. Γιατί είναι σημαντικό?

Οι κάρτες βίντεο έχουν όρια στον συνολικό αριθμό νημάτων που μπορεί να εκτελέσει ένας πολυεπεξεργαστής, τον μέγιστο αριθμό νημάτων σε ένα μπλοκ, τον μέγιστο αριθμό παραμορφώσεων σε έναν επεξεργαστή, περιορισμούς σε διαφορετικούς τύπους μνήμης κ.λπ. Όλες αυτές οι πληροφορίες μπορούν να ζητηθούν τόσο μέσω προγραμματισμού, μέσω του αντίστοιχου API, όσο και προηγουμένως χρησιμοποιώντας βοηθητικά προγράμματα από το SDK. (ενότητες DeviceQuery για συσκευές NVidia, μονάδες CLinfo για κάρτες γραφικών AMD).

Γενική πρακτική:

  • ο αριθμός των μπλοκ νημάτων/ομάδων εργασίας πρέπει να είναι πολλαπλάσιος του αριθμού των επεξεργαστών ροής
  • Το μέγεθος μπλοκ/ομάδας εργασίας πρέπει να είναι πολλαπλάσιο του μεγέθους στημόνι

Ταυτόχρονα, θα πρέπει να ληφθεί υπόψη ότι το απόλυτο ελάχιστο - 3-4 παραμορφώσεις / μετώπες περιστρέφονται ταυτόχρονα σε κάθε επεξεργαστή, οι σοφοί οδηγοί συμβουλεύουν να προχωρήσετε από την εξέταση - τουλάχιστον επτά μετώπες. Ταυτόχρονα - μην ξεχνάτε τους περιορισμούς στο σίδερο!

Το να κρατάς όλες αυτές τις λεπτομέρειες στο μυαλό σου γίνεται γρήγορα βαρετό, επομένως, για τον υπολογισμό της κατοχής gpu, η NVidia πρόσφερε ένα απροσδόκητο εργαλείο - έναν υπολογιστή excel (!) γεμάτο μακροεντολές. Εκεί μπορείτε να εισάγετε πληροφορίες σχετικά με τον μέγιστο αριθμό νημάτων για SM, τον αριθμό των καταχωρητών και το μέγεθος της κοινόχρηστης (κοινόχρηστης) μνήμης που είναι διαθέσιμη στο επεξεργαστή ροής, και τις παραμέτρους εκκίνησης της συνάρτησης που χρησιμοποιούνται - και δίνει ένα ποσοστό της αποτελεσματικότητας της χρήσης πόρων (και σκίζετε τα μαλλιά σας συνειδητοποιώντας ότι δεν έχετε αρκετούς καταχωρητές για να χρησιμοποιήσετε όλους τους πυρήνες).

πληροφορίες χρήσης:
http://docs.nvidia.com/cuda/cuda-c-best-practices-guide/#calculating-occupancy

Λειτουργίες GPU και μνήμης

Οι κάρτες βίντεο είναι βελτιστοποιημένες για λειτουργίες μνήμης 128 bit. Εκείνοι. Στην ιδανική περίπτωση, κάθε χειρισμός μνήμης, ιδανικά, θα πρέπει να αλλάζει 4 τιμές τεσσάρων byte τη φορά. Η κύρια ενόχληση για τον προγραμματιστή είναι ότι οι σύγχρονοι μεταγλωττιστές για τη GPU δεν είναι σε θέση να βελτιστοποιήσουν τέτοια πράγματα. Αυτό πρέπει να γίνει σωστά στον κώδικα συνάρτησης και, κατά μέσο όρο, φέρνει κλάσματα ενός ποσοστού κερδών απόδοσης. Η συχνότητα των αιτημάτων μνήμης έχει πολύ μεγαλύτερο αντίκτυπο στην απόδοση.

Το πρόβλημα είναι το εξής - κάθε αίτημα επιστρέφει ως απόκριση ένα κομμάτι δεδομένων που είναι πολλαπλάσιο των 128 bit. Και κάθε νήμα χρησιμοποιεί μόνο το ένα τέταρτο του (στην περίπτωση μιας κανονικής μεταβλητής τεσσάρων byte). Όταν τα γειτονικά νήματα λειτουργούν ταυτόχρονα με δεδομένα που βρίσκονται διαδοχικά σε κελιά μνήμης, αυτό μειώνει τον συνολικό αριθμό προσβάσεων στη μνήμη. Αυτό το φαινόμενο ονομάζεται συνδυασμένες πράξεις ανάγνωσης και εγγραφής ( ενοποιημένη πρόσβαση - καλό! και να διαβάζουν και να γράφουν) - και με τη σωστή οργάνωση του κώδικα ( γρήγορη πρόσβαση σε συνεχόμενο κομμάτι μνήμης - κακό!) μπορεί να βελτιώσει σημαντικά την απόδοση. Όταν οργανώνετε τον πυρήνα σας - θυμηθείτε - συνεχόμενη πρόσβαση - μέσα στα στοιχεία μιας σειράς μνήμης, η εργασία με τα στοιχεία μιας στήλης δεν είναι πλέον τόσο αποτελεσματική. Θέλετε περισσότερες λεπτομέρειες; Μου άρεσε αυτό το pdf - ή google για " τεχνικές συγχώνευσης μνήμης “.

Η ηγετική θέση στην υποψηφιότητα "bottleneck" καταλαμβάνεται από μια άλλη λειτουργία μνήμης - αντιγράψτε δεδομένα από τη μνήμη κεντρικού υπολογιστή στη GPU . Η αντιγραφή δεν συμβαίνει ούτως ή άλλως, αλλά από μια περιοχή μνήμης που έχει εκχωρηθεί ειδικά από το πρόγραμμα οδήγησης και το σύστημα: όταν υποβάλλεται αίτημα αντιγραφής δεδομένων, το σύστημα πρώτα αντιγράφει αυτά τα δεδομένα εκεί και μόνο στη συνέχεια τα ανεβάζει στη GPU. Η ταχύτητα μεταφοράς δεδομένων περιορίζεται από το εύρος ζώνης Δίαυλος PCI Express xN (όπου N είναι ο αριθμός των γραμμών δεδομένων) μέσω των οποίων οι σύγχρονες κάρτες βίντεο επικοινωνούν με τον κεντρικό υπολογιστή.

Ωστόσο, η επιπλέον αντιγραφή αργής μνήμης στον κεντρικό υπολογιστή είναι μερικές φορές αδικαιολόγητη επιβάρυνση. Η διέξοδος είναι να χρησιμοποιήσετε το λεγόμενο καρφιτσωμένη μνήμη - μια ειδικά επισημασμένη περιοχή μνήμης, έτσι ώστε το λειτουργικό σύστημα να μην μπορεί να εκτελέσει καμία λειτουργία με αυτήν (για παράδειγμα, ξεφόρτωση για εναλλαγή / μετακίνηση κατά την κρίση του κ.λπ.). Η μεταφορά δεδομένων από τον κεντρικό υπολογιστή στην κάρτα βίντεο πραγματοποιείται χωρίς τη συμμετοχή του λειτουργικού συστήματος - ασύγχρονα, μέσω DMA (άμεση πρόσβαση στη μνήμη).

Και τέλος, λίγα περισσότερα για τη μνήμη. Η κοινή μνήμη σε έναν πολυεπεξεργαστή οργανώνεται συνήθως με τη μορφή τραπεζών μνήμης που περιέχουν λέξεις - δεδομένα 32 bit. Ο αριθμός των τραπεζών ποικίλλει παραδοσιακά από τη μια γενιά GPU στην άλλη - 16/32 Εάν κάθε νήμα ζητήσει δεδομένα από μια ξεχωριστή τράπεζα, όλα είναι εντάξει. Διαφορετικά, λαμβάνονται πολλά αιτήματα ανάγνωσης / εγγραφής σε μία τράπεζα και έχουμε - μια σύγκρουση ( Διένεξη τράπεζας κοινής μνήμης). Τέτοιες συγκρουόμενες κλήσεις είναι σειριακές και επομένως εκτελούνται διαδοχικά, όχι παράλληλα. Εάν όλα τα νήματα έχουν πρόσβαση στην ίδια τράπεζα, χρησιμοποιείται μια απάντηση "εκπομπής" ( αναμετάδοση) και δεν υπάρχει σύγκρουση. Υπάρχουν διάφοροι τρόποι για να αντιμετωπίσετε αποτελεσματικά τις διενέξεις πρόσβασης, μου άρεσε περιγραφή των κύριων τεχνικών για την απαλλαγή από συγκρούσεις πρόσβασης σε τράπεζες μνήμης – .

Πώς να κάνετε τις μαθηματικές πράξεις ακόμα πιο γρήγορες; Να θυμάστε ότι:

  • Οι υπολογισμοί διπλής ακρίβειας είναι βαρύ φορτίο λειτουργίας με fp64 >> fp32
  • οι σταθερές της μορφής 3.13 στον κώδικα, από προεπιλογή, ερμηνεύονται ως fp64 εάν δεν προσδιορίσετε ρητά το 3.14f
  • για τη βελτιστοποίηση των μαθηματικών, δεν θα είναι περιττό να συμβουλευτείτε τους οδηγούς - και υπάρχουν σημαίες για τον μεταγλωττιστή
  • Οι πωλητές περιλαμβάνουν δυνατότητες στα SDK τους που εκμεταλλεύονται τις δυνατότητες της συσκευής για να επιτύχουν απόδοση (συχνά σε βάρος της φορητότητας)

Είναι λογικό για τους προγραμματιστές CUDA να δώσουν μεγάλη προσοχή στην ιδέα διαφορετικά ρεύμα,που σας επιτρέπει να εκτελέσετε πολλές βασικές λειτουργίες ταυτόχρονα σε μία συσκευή ή να συνδυάσετε ασύγχρονη αντιγραφή δεδομένων από τον κεντρικό υπολογιστή στη συσκευή κατά την εκτέλεση των λειτουργιών. Το OpenCL δεν παρέχει ακόμη τέτοια λειτουργικότητα 🙁

Σκουπίδια προφίλ:

Το NVifia Visual Profiler είναι ένα ενδιαφέρον βοηθητικό πρόγραμμα που αναλύει τους πυρήνες CUDA και OpenCL.

ΥΓ. Ως πιο μακροσκελής οδηγός βελτιστοποίησης, μπορώ να προτείνω να γκουγκλάρετε όλα τα είδη οδηγός βέλτιστης πρακτικής για OpenCL και CUDA.

  • ,

Μιλώντας για παράλληλους υπολογιστές στη GPU, πρέπει να θυμόμαστε σε ποια εποχή ζούμε, σήμερα είναι η εποχή που όλα στον κόσμο επιταχύνονται τόσο πολύ που χάνουμε την αίσθηση του χρόνου, χωρίς να παρατηρούμε πώς περνάει βιαστικά. Ό,τι κάνουμε συνδέεται με υψηλή ακρίβεια και ταχύτητα επεξεργασίας πληροφοριών, σε τέτοιες συνθήκες χρειαζόμαστε σίγουρα εργαλεία για να επεξεργαστούμε όλες τις πληροφορίες που έχουμε και να τις μετατρέψουμε σε δεδομένα, επιπλέον, μιλώντας για τέτοιες εργασίες, πρέπει να θυμόμαστε ότι αυτές οι εργασίες είναι απαραίτητα όχι μόνο για μεγάλους οργανισμούς ή μεγάλες εταιρείες, αλλά και οι απλοί χρήστες πρέπει τώρα να επιλύσουν τέτοια προβλήματα, οι οποίοι επιλύουν τα ζωτικά τους καθήκοντα που σχετίζονται με τις υψηλές τεχνολογίες στο σπίτι στο προσωπικούς υπολογιστές! Η εμφάνιση του NVIDIA CUDA δεν ήταν έκπληξη, αλλά μάλλον δικαιολογημένη, γιατί, μόλις θα χρειαστεί να επεξεργαστούμε πολύ πιο χρονοβόρες εργασίες σε έναν υπολογιστή από πριν. Η εργασία που προηγουμένως χρειαζόταν πολύ καιρό τώρα θα διαρκέσει λίγα λεπτά, αντίστοιχα, αυτό θα επηρεάσει τη συνολική εικόνα όλου του κόσμου!

Τι είναι το GPU Computing

Υπολογισμός GPU είναι η χρήση της GPU για τον υπολογισμό τεχνικών, επιστημονικών και καθημερινών εργασιών. Ο υπολογισμός στη GPU περιλαμβάνει τη χρήση της CPU και της GPU με μια ετερογενή επιλογή μεταξύ τους, δηλαδή: το διαδοχικό μέρος των προγραμμάτων αναλαμβάνεται από τη CPU, ενώ οι χρονοβόρες υπολογιστικές εργασίες παραμένουν από τη GPU. Λόγω αυτού, οι εργασίες παραλληλίζονται, γεγονός που οδηγεί σε ταχύτερη επεξεργασία των πληροφοριών και μειώνει τον χρόνο που απαιτείται για την ολοκλήρωση της εργασίας, το σύστημα γίνεται πιο παραγωγικό και μπορεί ταυτόχρονα να επεξεργαστεί περισσότερες εργασίες από πριν. Ωστόσο, για να επιτευχθεί μια τέτοια επιτυχία, η υποστήριξη υλικού από μόνη της δεν αρκεί, σε αυτήν την περίπτωση χρειάζεται και υποστήριξη λογισμικού ώστε η εφαρμογή να μεταφέρει τους πιο χρονοβόρους υπολογισμούς στη GPU.

Τι είναι το CUDA

Το CUDA είναι μια τεχνολογία προγραμματισμού αλγορίθμων σε απλοποιημένη γλώσσα C που τρέχει σε επεξεργαστές γραφικών όγδοης γενιάς και παλαιότερους επιταχυντές GeForce, καθώς και στις αντίστοιχες κάρτες Quadro και Tesla της NVIDIA. Το CUDA σάς επιτρέπει να συμπεριλάβετε ειδικές λειτουργίες στο κείμενο ενός προγράμματος C. Αυτές οι συναρτήσεις είναι γραμμένες στην απλοποιημένη γλώσσα προγραμματισμού C και εκτελούνται στη GPU. Η αρχική έκδοση του CUDA SDK κυκλοφόρησε στις 15 Φεβρουαρίου 2007. Για επιτυχή μετάφραση κώδικα σε αυτήν τη γλώσσα, το CUDA SDK περιλαμβάνει τον δικό του μεταγλωττιστή C γραμμή εντολών nvcc από την NVIDIA. Ο μεταγλωττιστής nvcc βασίζεται σε ανοιχτός μεταγλωττιστής Open64 και έχει σχεδιαστεί για να μεταφράζει τον κώδικα κεντρικού υπολογιστή (κύριος, κωδικός ελέγχου) και τον κώδικα συσκευής (κωδικός υλικού) (αρχεία με την επέκταση .cu) σε αρχεία αντικειμένων κατάλληλα για τη δημιουργία του τελικού προγράμματος ή βιβλιοθήκης σε οποιοδήποτε περιβάλλον προγραμματισμού, για παράδειγμα , στο Microsoft Visual studio.

Τεχνολογικές Δυνατότητες

  1. Η τυπική γλώσσα C για την παράλληλη ανάπτυξη εφαρμογών GPU.
  2. Έτοιμες βιβλιοθήκες αριθμητικής ανάλυσης για τον γρήγορο μετασχηματισμό Fourier και το βασικό πακέτο προγραμμάτων γραμμικής άλγεβρας.
  3. Αποκλειστικό πρόγραμμα οδήγησης CUDA για υπολογιστές με γρήγορη μεταφορά δεδομένων μεταξύ GPU και CPU.
  4. Δυνατότητα αλληλεπίδρασης του προγράμματος οδήγησης CUDA με προγράμματα οδήγησης γραφικών OpenGL και DirectX.
  5. Υποστήριξη χειρουργείου Συστήματα Linux 32/64-bit, Windows XP 32/64-bit και MacOS.

Τεχνολογικά Οφέλη

  1. Η διεπαφή προγραμματισμού εφαρμογών CUDA (CUDA API) βασίζεται στην τυπική γλώσσα προγραμματισμού C με ορισμένους περιορισμούς. Αυτό απλοποιεί και εξομαλύνει τη διαδικασία εκμάθησης της αρχιτεκτονικής CUDA.
  2. Η κοινόχρηστη μνήμη 16 KB μεταξύ των νημάτων μπορεί να χρησιμοποιηθεί για μια κρυφή μνήμη οργανωμένη από τον χρήστη με μεγαλύτερο εύρος ζώνης από ό,τι κατά την ανάκτηση από κανονικές υφές.
  3. Πιο αποτελεσματικές συναλλαγές μεταξύ της μνήμης CPU και της μνήμης βίντεο.
  4. Πλήρης υποστήριξη υλικού για λειτουργίες ακέραιου και bitwise.

Ένα παράδειγμα εφαρμογής τεχνολογίας

cRark

Το πιο δύσκολο κομμάτι αυτού του προγράμματος είναι το βάμμα. Το πρόγραμμα διαθέτει διεπαφή κονσόλας, αλλά χάρη στις οδηγίες που συνοδεύουν το ίδιο το πρόγραμμα, μπορεί να χρησιμοποιηθεί. Το παρακάτω είναι σύντομη οδηγίαγια τη ρύθμιση του προγράμματος. Θα δοκιμάσουμε το πρόγραμμα ως προς την απόδοση και θα το συγκρίνουμε με άλλο παρόμοιο πρόγραμμα που δεν χρησιμοποιεί NVIDIA CUDA, στην περίπτωση αυτή είναι το γνωστό πρόγραμμα «Advanced Archive Password Recovery».

Από το ληφθέν αρχείο cRark, χρειαζόμαστε μόνο τρία αρχεία: crark.exe , crark-hp.exe και password.def . Το Сrark.exe είναι ένα πρόγραμμα επεξεργασίας κωδικού πρόσβασης RAR 3.0 χωρίς κρυπτογραφημένα αρχεία μέσα στο αρχείο (δηλαδή ανοίγοντας το αρχείο βλέπουμε τα ονόματα, αλλά δεν μπορούμε να αποσυσκευάσουμε το αρχείο χωρίς κωδικό πρόσβασης).

Το Сrark-hp.exe είναι ένα βοηθητικό πρόγραμμα διάρρηξης κωδικού πρόσβασης RAR 3.0 γραμμής εντολών που κρυπτογραφεί ολόκληρο το αρχείο (δηλαδή όταν ανοίγουμε ένα αρχείο, δεν βλέπουμε ούτε το όνομα ούτε τα ίδια τα αρχεία και δεν μπορούμε να αποσυσκευάσουμε το αρχείο χωρίς κωδικό πρόσβασης).

Το Password.def είναι οποιοδήποτε μετονομασμένο αρχείο κειμένου με πολύ λίγο περιεχόμενο (για παράδειγμα: 1η γραμμή: ## 2η γραμμή: ?* , οπότε ο κωδικός πρόσβασης θα σπάσει χρησιμοποιώντας όλους τους χαρακτήρες). Το Password.def είναι ο επικεφαλής του προγράμματος cRark. Το αρχείο περιέχει τους κανόνες για το άνοιγμα του κωδικού πρόσβασης (ή την περιοχή χαρακτήρων που θα χρησιμοποιήσει το crark.exe στην εργασία του). Περισσότερες λεπτομέρειες σχετικά με τις επιλογές για την επιλογή αυτών των χαρακτήρων γράφονται στο αρχείο κειμένου που λαμβάνεται ανοίγοντας το ληφθέν από τον ιστότοπο από τον συγγραφέα του προγράμματος cRark: russian.def.

Εκπαίδευση

Πρέπει να πω αμέσως ότι το πρόγραμμα λειτουργεί μόνο εάν η κάρτα γραφικών σας βασίζεται σε GPU με υποστήριξη για το επίπεδο επιτάχυνσης CUDA 1.1. Επομένως, μια σειρά από κάρτες γραφικών που βασίζονται στο τσιπ G80, όπως η GeForce 8800 GTX, δεν συζητείται, καθώς διαθέτουν υποστήριξη υλικού για επιτάχυνση CUDA 1.0. Χρησιμοποιώντας το CUDA, το πρόγραμμα επιλέγει μόνο κωδικούς πρόσβασης για αρχεία RAR των εκδόσεων 3.0+. Πρέπει να εγκατασταθεί όλο το λογισμικό που σχετίζεται με το CUDA, και συγκεκριμένα:

  • Προγράμματα οδήγησης NVIDIA που υποστηρίζουν CUDA από το 169.21
  • NVIDIA CUDA SDK, ξεκινώντας από την έκδοση 1.1
  • NVIDIA CUDA Toolkit, ξεκινώντας από την έκδοση 1.1

Δημιουργούμε οποιονδήποτε φάκελο οπουδήποτε (για παράδειγμα, στη μονάδα δίσκου C:) και τον ονομάζουμε οποιοδήποτε όνομα, για παράδειγμα, "3.2". Βάζουμε τα αρχεία εκεί: crark.exe , crark-hp.exe και password.def και ένα αρχείο RAR που προστατεύεται με κωδικό / κρυπτογραφημένο.

Στη συνέχεια, θα πρέπει να ξεκινήσετε την κονσόλα της γραμμής εντολών των Windows και να μεταβείτε στον φάκελο που δημιουργήθηκε σε αυτήν. Στα Windows Vista και 7, θα πρέπει να καλέσετε το μενού "Έναρξη" και να εισαγάγετε "cmd.exe" στο πεδίο αναζήτησης, στα Windows XP, από το μενού "Έναρξη", θα πρέπει πρώτα να καλέσετε το παράθυρο διαλόγου "Εκτέλεση" και να εισαγάγετε "cmd .exe" σε αυτό. Αφού ανοίξετε την κονσόλα, πληκτρολογήστε μια εντολή όπως: cd C:\folder\ , cd C:\3.2 σε αυτήν την περίπτωση.

Προσλήψεις σε επεξεργαστής κειμένουδύο γραμμές (μπορείτε επίσης να αποθηκεύσετε το κείμενο ως αρχείο .bat στο φάκελο με το cRark) για να μαντέψετε τον κωδικό πρόσβασης ενός αρχείου RAR που προστατεύεται με κωδικό πρόσβασης με μη κρυπτογραφημένα αρχεία:

ηχώ απενεργοποιημένη?
cmd /K crark (όνομα αρχείου).rar

για να μαντέψετε τον κωδικό πρόσβασης ενός αρχείου RAR που προστατεύεται με κωδικό πρόσβασης και κρυπτογραφείται:

ηχώ απενεργοποιημένη?
cmd /K crark-hp (όνομα αρχείου).rar

Αντιγράψτε 2 γραμμές αρχείο κειμένουστην κονσόλα και πατήστε Enter (ή εκτελέστε το αρχείο .bat).

Αποτελέσματα

Η διαδικασία αποκρυπτογράφησης φαίνεται στο σχήμα:

Η ταχύτητα επιλογής στο cRark χρησιμοποιώντας CUDA ήταν 1625 κωδικοί πρόσβασης / δευτερόλεπτο. Σε ένα λεπτό, τριάντα έξι δευτερόλεπτα, μαντέψαμε έναν κωδικό πρόσβασης με 3 χαρακτήρες: "q)$". Για σύγκριση: ο ρυθμός ωμής βίας στο Advanced Archive Password Recovery στον διπύρηνο επεξεργαστή μου Athlon 3000+ είναι το πολύ 50 κωδικοί πρόσβασης/δευτερόλεπτο και η ωμή βία θα διαρκέσει 5 ώρες. Δηλαδή, η επιλογή ενός αρχείου RAR με bruteforce στο cRark χρησιμοποιώντας μια κάρτα γραφικών GeForce 9800 GTX+ είναι 30 φορές πιο γρήγορη από ό,τι σε μια CPU.

Για όσους έχουν επεξεργαστή Intel, καλή μητρική πλακέτα με υψηλή συχνότητα διαύλου συστήματος (FSB 1600 MHz), ο ρυθμός της CPU και η ωμή δύναμη θα είναι υψηλότερες. Και αν έχετε έναν τετραπύρηνο επεξεργαστή και ένα ζεύγος καρτών γραφικών του επιπέδου GeForce 280 GTX, τότε η απόδοση της ωμής δύναμης κωδικού πρόσβασης επιταχύνεται κατά καιρούς. Συνοψίζοντας το παράδειγμα, πρέπει να ειπωθεί ότι αυτό το πρόβλημα λύθηκε χρησιμοποιώντας την τεχνολογία CUDA σε μόλις 2 λεπτά αντί για 5 ώρες, γεγονός που υποδηλώνει υψηλές δυνατότητες για αυτήν την τεχνολογία!

συμπεράσματα

Έχοντας εξετάσει σήμερα την τεχνολογία για παράλληλους υπολογισμούς CUDA, είδαμε ξεκάθαρα όλη τη δύναμη και τις τεράστιες δυνατότητες για την ανάπτυξη αυτής της τεχνολογίας χρησιμοποιώντας το παράδειγμα ενός προγράμματος ανάκτησης κωδικού πρόσβασης για Αρχεία RAR. Πρέπει να πω για τις προοπτικές αυτής της τεχνολογίας, αυτή η τεχνολογίασίγουρα θα βρει μια θέση στη ζωή κάθε ατόμου που αποφασίζει να το χρησιμοποιήσει, είτε πρόκειται για επιστημονικές εργασίες, είτε για εργασίες που σχετίζονται με την επεξεργασία βίντεο, είτε ακόμη και για οικονομικές εργασίες που απαιτούν γρήγορο ακριβή υπολογισμό, όλα αυτά θα οδηγήσουν σε αναπόφευκτη αύξηση της εργασίας παραγωγικότητα που δεν μπορεί να αγνοηθεί. Μέχρι σήμερα, η φράση "οικιακός υπερυπολογιστής" έχει ήδη αρχίσει να μπαίνει στο λεξικό. Είναι απολύτως προφανές ότι για να μεταφραστεί ένα τέτοιο αντικείμενο σε πραγματικότητα, κάθε σπίτι έχει ήδη ένα εργαλείο που ονομάζεται CUDA. Από την κυκλοφορία των καρτών που βασίζονται στο τσιπ G80 (2006), μεγάλο ποσόΕπιταχυντές βασισμένοι στην NVIDIA που υποστηρίζουν την τεχνολογία CUDA, η οποία μπορεί να κάνει πραγματικότητα το όνειρο του υπερυπολογιστή σε κάθε σπίτι. Με την προώθηση της τεχνολογίας CUDA, η NVIDIA αυξάνει την αξιοπιστία της στα μάτια των πελατών με τη μορφή παροχής πρόσθετων λειτουργιών στον εξοπλισμό τους, που πολλοί έχουν ήδη αγοράσει. Μένει μόνο να πιστεύουμε ότι σύντομα το CUDA θα αναπτυχθεί πολύ γρήγορα και θα επιτρέψει στους χρήστες να εκμεταλλευτούν πλήρως όλες τις δυνατότητες παράλληλων υπολογιστών στη GPU.