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

Τι είναι το CUDA; Παράλληλος προγραμματισμός για GPU

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

Ενώ έχουν υπάρξει άλλα προτεινόμενα API για GPU, όπως το OpenCL, και υπάρχουν ανταγωνιστικές GPU από άλλες εταιρείες, όπως η AMD, ο συνδυασμός GPU CUDA και Nvidia κυριαρχεί σε διάφορους τομείς εφαρμογών, συμπεριλαμβανομένης της βαθιάς μάθησης, και αποτελεί θεμέλιο για ορισμένες οι ταχύτεροι υπολογιστές στον κόσμο.

Οι κάρτες γραφικών είναι αναμφισβήτητα τόσο παλιές όσο ο υπολογιστής - δηλαδή, αν θεωρήσετε το IBM Monochrome Display Adapter του 1981 μια κάρτα γραφικών. Μέχρι το 1988, θα μπορούσατε να αποκτήσετε μια κάρτα 2D VGA Wonder 16-bit από την ATI (η εταιρεία τελικά αποκτήθηκε από την AMD). Μέχρι το 1996, θα μπορούσατε να αγοράσετε έναν τρισδιάστατο επιταχυντή γραφικών από το 3dfx Interactive, ώστε να μπορείτε να εκτελέσετε το πρώτο πρόσωπο shooter Quake με πλήρη ταχύτητα.

Επίσης το 1996, η Nvidia άρχισε να προσπαθεί να ανταγωνιστεί στην αγορά επιταχυντών 3D με αδύναμα προϊόντα, αλλά έμαθε καθώς πήγε και το 1999 παρουσίασε το επιτυχημένο GeForce 256, την πρώτη κάρτα γραφικών που ονομάστηκε GPU. Εκείνη την εποχή, ο κύριος λόγος για την κατοχή GPU ήταν για τα παιχνίδια. Μόνο αργότερα οι άνθρωποι χρησιμοποίησαν GPU για μαθηματικά, επιστήμη και μηχανική.

Η προέλευση του CUDA

Το 2003, μια ομάδα ερευνητών με επικεφαλής τον Ian Buck παρουσίασε το Brook, το πρώτο ευρέως εγκριθέν μοντέλο προγραμματισμού που επέκτεινε το C με παράλληλες κατασκευές δεδομένων. Ο Buck αργότερα έγινε μέλος της Nvidia και ηγήθηκε της κυκλοφορίας του CUDA το 2006, της πρώτης εμπορικής λύσης για υπολογιστές γενικής χρήσης σε GPU.

OpenCL εναντίον CUDA

Ο ανταγωνιστής CUDA OpenCL κυκλοφόρησε από την Apple και τον Όμιλο Khronos το 2009, σε μια προσπάθεια να παράσχει ένα πρότυπο για ετερογενείς υπολογιστές που δεν περιοριζόταν σε επεξεργαστές Intel / AMD με GPU Nvidia. Ενώ το OpenCL ακούγεται ελκυστικό λόγω της γενικότητάς του, δεν έχει απόδοση όπως και το CUDA σε GPU Nvidia και πολλά πλαίσια βαθιάς μάθησης είτε δεν το υποστηρίζουν είτε δεν το υποστηρίζουν μόνο ως σκέψη μόλις κυκλοφορήσει η υποστήριξη CUDA.

Βελτίωση απόδοσης CUDA

Το CUDA έχει βελτιωθεί και διευρύνει το πεδίο εφαρμογής του με την πάροδο των ετών, λίγο πολύ με το βελτιωμένο GPUs Nvidia. Από την έκδοση 9.2 του CUDA, χρησιμοποιώντας πολλαπλές GPU διακομιστή P100, μπορείτε να πραγματοποιήσετε έως και 50x βελτιώσεις απόδοσης σε σχέση με τους CPU. Το V100 (δεν φαίνεται σε αυτό το σχήμα) είναι άλλο 3x πιο γρήγορα για ορισμένα φορτία. Η προηγούμενη γενιά GPU διακομιστή, η K80, προσέφερε βελτιώσεις απόδοσης 5x έως 12x σε σχέση με τους CPU.

Νβίδια

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

Νβίδια

Τομείς εφαρμογών CUDA

Νβίδια

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

  1. Υπολογιστική χρηματοδότηση
  2. Μοντελοποίηση κλίματος, καιρού και ωκεανού
  3. Επιστήμη δεδομένων και αναλυτικά στοιχεία
  4. Βαθιά μάθηση και μηχανική μάθηση
  5. Άμυνα και νοημοσύνη
  6. Κατασκευή / AEC (Αρχιτεκτονική, Μηχανική και Κατασκευές): CAD και CAE (συμπεριλαμβανομένων των υπολογιστικών δυναμικών ρευστών, υπολογιστικών δομικών μηχανικών, σχεδιασμού και οπτικοποίησης και ηλεκτρονικός σχεδιασμός αυτοματισμού)
  7. Πολυμέσα και ψυχαγωγία (συμπεριλαμβανομένων κινούμενων σχεδίων, μοντελοποίησης και απόδοσης, διόρθωση χρώματος και διαχείριση κόκκων, σύνθεση, φινίρισμα και εφέ, επεξεργασία, κωδικοποίηση και ψηφιακή διανομή, γραφικά on-air, on-set, review και στερεοφωνικά εργαλεία και γραφικά καιρού)
  8. Ιατρική απεικόνιση
  9. Πετρέλαιο και φυσικό αέριο
  10. Έρευνα: Ανώτατη εκπαίδευση και υπερυπολογισμός (συμπεριλαμβανομένης της υπολογιστικής χημείας και της βιολογίας, της αριθμητικής ανάλυσης, της φυσικής και της επιστημονικής οπτικοποίησης)
  11. Ασφάλεια και προστασία
  12. Εργαλεία και διαχείριση

CUDA στη βαθιά μάθηση

Η βαθιά μάθηση έχει υπερβολική ανάγκη για ταχύτητα υπολογισμού. Για παράδειγμα, για να εκπαιδεύσουν τα μοντέλα για τη Μετάφραση Google το 2016, οι ομάδες του Google Brain και της Μετάφρασης Google έκαναν εκατοντάδες τρέξιμο TensorFlow μιας εβδομάδας χρησιμοποιώντας GPU. είχαν αγοράσει 2.000 GPU βαθμού διακομιστή από τη Nvidia για το σκοπό αυτό. Χωρίς GPU, αυτές οι προπονήσεις θα απαιτούσαν μήνες και όχι μια εβδομάδα για σύγκλιση. Για την ανάπτυξη παραγωγής αυτών των μοντέλων μετάφρασης TensorFlow, η Google χρησιμοποίησε ένα νέο τσιπ προσαρμοσμένης επεξεργασίας, το TPU (μονάδα επεξεργασίας tensor).

Εκτός από το TensorFlow, πολλά άλλα DL πλαίσια βασίζονται στο CUDA για την υποστήριξη GPU τους, συμπεριλαμβανομένων των Caffe2, CNTK, Databricks, H2O.ai, Keras, MXNet, PyTorch, Theano και Torch. Στις περισσότερες περιπτώσεις χρησιμοποιούν τη βιβλιοθήκη cuDNN για τους υπολογισμούς του βαθιού νευρικού δικτύου. Αυτή η βιβλιοθήκη είναι τόσο σημαντική για την εκπαίδευση των πλαισίων βαθιάς μάθησης που όλα τα πλαίσια που χρησιμοποιούν μια δεδομένη έκδοση του cuDNN έχουν ουσιαστικά τους ίδιους αριθμούς απόδοσης για αντίστοιχες περιπτώσεις χρήσης. Όταν το CUDA και το cuDNN βελτιώνονται από έκδοση σε έκδοση, όλα τα πλαίσια βαθιάς μάθησης που ενημερώνονται στη νέα έκδοση βλέπουν τα κέρδη απόδοσης. Όπου η απόδοση τείνει να διαφέρει από πλαίσιο σε πλαίσιο είναι το πόσο καλά κλιμακώνονται σε πολλαπλές GPU και πολλαπλούς κόμβους.

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

Νβίδια

Εργαλειοθήκη CUDA

Το CUDA Toolkit περιλαμβάνει βιβλιοθήκες, εργαλεία εντοπισμού σφαλμάτων και βελτιστοποίησης, έναν μεταγλωττιστή, τεκμηρίωση και μια βιβλιοθήκη χρόνου εκτέλεσης για την ανάπτυξη των εφαρμογών σας. Διαθέτει στοιχεία που υποστηρίζουν τη βαθιά μάθηση, τη γραμμική άλγεβρα, την επεξεργασία σήματος και τους παράλληλους αλγόριθμους. Σε γενικές γραμμές, οι βιβλιοθήκες CUDA υποστηρίζουν όλες τις οικογένειες GPU Nvidia, αλλά αποδίδουν καλύτερα στην τελευταία γενιά, όπως το V100, το οποίο μπορεί να είναι 3 x ταχύτερο από το P100 για φόρτο εργασίας βαθιάς μάθησης. Η χρήση μίας ή περισσότερων βιβλιοθηκών είναι ο ευκολότερος τρόπος για να επωφεληθείτε από τις GPU, αρκεί οι αλγόριθμοι που χρειάζεστε να έχουν εφαρμοστεί στην κατάλληλη βιβλιοθήκη.

Νβίδια

Βιβλιοθήκες βαθιάς μάθησης CUDA

Στη σφαίρα βαθιάς μάθησης, υπάρχουν τρεις βασικές βιβλιοθήκες επιτάχυνσης της GPU: το cuDNN, το οποίο ανέφερα νωρίτερα ως το στοιχείο GPU για τα περισσότερα πλαίσια βαθιάς μάθησης ανοιχτού κώδικα. TensorRT, το οποίο είναι ο βελτιστοποιητής και ο χρόνος εκτέλεσης της υψηλής απόδοσης βαθιάς μάθησης της Nvidia. και DeepStream, μια βιβλιοθήκη συμπερασμάτων βίντεο. Το TensorRT σάς βοηθά να βελτιστοποιήσετε μοντέλα νευρωνικών δικτύων, να βαθμονομήσετε για χαμηλότερη ακρίβεια με υψηλή ακρίβεια και να αναπτύξετε τα εκπαιδευμένα μοντέλα σε σύννεφα, κέντρα δεδομένων, ενσωματωμένα συστήματα ή πλατφόρμες προϊόντων αυτοκινήτων.

Νβίδια

Γραμμικές βιβλιοθήκες άλγεβρας και μαθηματικών CUDA

Η γραμμική άλγεβρα υποστηρίζει υπολογισμούς τανυστών και συνεπώς βαθιά μάθηση. Το BLAS (Basic Linear Algebra Subprograms), μια συλλογή αλγορίθμων μήτρας που εφαρμόστηκε στο Fortran το 1989, έχει χρησιμοποιηθεί από τότε από επιστήμονες και μηχανικούς. Το cuBLAS είναι μια έκδοση του BLAS με επιτάχυνση GPU και ο υψηλότερης απόδοσης τρόπος για να κάνετε αριθμητική μήτρα με GPU. Το cuBLAS υποθέτει ότι οι πίνακες είναι πυκνοί. Το cuSPARSE χειρίζεται αραιές μήτρες.

Νβίδια

Βιβλιοθήκες επεξεργασίας σήματος CUDA

Ο γρήγορος μετασχηματισμός Fourier (FFT) είναι ένας από τους βασικούς αλγόριθμους που χρησιμοποιούνται για την επεξεργασία σήματος. μετατρέπει ένα σήμα (όπως μια κυματομορφή ήχου) σε ένα φάσμα συχνοτήτων. Το cuFFT είναι ένα FFT με επιτάχυνση GPU.

Κωδικοποιητές, χρησιμοποιώντας πρότυπα όπως H.264, κωδικοποίηση / συμπίεση και αποκωδικοποίηση / αποσυμπίεση βίντεο για μετάδοση και προβολή. Το SDK Nvidia Video Codec επιταχύνει αυτήν τη διαδικασία με GPU.

Νβίδια

Βιβλιοθήκες παράλληλου αλγορίθμου CUDA

Όλες οι τρεις βιβλιοθήκες για παράλληλους αλγόριθμους έχουν διαφορετικούς σκοπούς. Το NCCL (Nvidia Collective Communications Library) προορίζεται για κλιμάκωση εφαρμογών σε πολλές GPU και κόμβους. Το nvGRAPH είναι για παράλληλη ανάλυση γραφημάτων. και το Thrust είναι μια βιβλιοθήκη προτύπων C ++ για το CUDA με βάση τη Βασική βιβλιοθήκη προτύπων C ++. Το Thrust παρέχει μια πλούσια συλλογή παράλληλων πρωτόγονων δεδομένων όπως σάρωση, ταξινόμηση και μείωση.

Νβίδια

Απόδοση CUDA έναντι CPU

Σε ορισμένες περιπτώσεις, μπορείτε να χρησιμοποιήσετε drop-in CUDA συναρτήσεις αντί για αντίστοιχες λειτουργίες CPU. Για παράδειγμα, οι ρουτίνες πολλαπλασιασμού μήτρας GEMM από το BLAS μπορούν να αντικατασταθούν από εκδόσεις GPU απλά συνδέοντας τη βιβλιοθήκη NVBLAS:

Νβίδια

Βασικά στοιχεία προγραμματισμού CUDA

Εάν δεν μπορείτε να βρείτε ρουτίνες βιβλιοθήκης CUDA για να επιταχύνετε τα προγράμματά σας, θα πρέπει να δοκιμάσετε το χέρι σας σε προγραμματισμό CUDA χαμηλού επιπέδου. Αυτό είναι πολύ πιο εύκολο τώρα από ό, τι όταν το δοκίμασα για πρώτη φορά στα τέλη της δεκαετίας του 2000. Μεταξύ άλλων λόγων, υπάρχει ευκολότερη σύνταξη και υπάρχουν καλύτερα εργαλεία ανάπτυξης διαθέσιμα. Η μόνη μου διαφορά είναι ότι στο MacOS ο τελευταίος μεταγλωττιστής CUDA και ο τελευταίος μεταγλωττιστής C ++ (από Xcode) σπάνια συγχρονίζονται. Κάποιος πρέπει να κατεβάσει παλαιότερα εργαλεία γραμμής εντολών από την Apple και να τα χρησιμοποιήσει xcode-επιλέξτε για να λάβετε τον κωδικό CUDA για μεταγλώττιση και σύνδεση.

Για παράδειγμα, σκεφτείτε αυτήν την απλή ρουτίνα C / C ++ για να προσθέσετε δύο πίνακες:

άκυρη προσθήκη (int n, float * x, float * y)

{  

για (int i = 0; i <n; i ++)

y [i] = x [i] + y [i];

}

Μπορείτε να το μετατρέψετε σε πυρήνα που θα τρέχει στην GPU προσθέτοντας το __παγκόσμια__ λέξη-κλειδί για τη δήλωση και καλέστε τον πυρήνα χρησιμοποιώντας τη σύνταξη τριπλού βραχίονα:

προσθήκη << >> (N, x, y);

Πρέπει επίσης να αλλάξετε το δικό σας malloc/νέος και Ελεύθερος/διαγράφω κλήσεις προς cudaMallocManaged και cudaFree έτσι ώστε να διαθέτετε χώρο στην GPU. Τέλος, πρέπει να περιμένετε να ολοκληρωθεί ο υπολογισμός GPU πριν χρησιμοποιήσετε τα αποτελέσματα στην CPU, με τα οποία μπορείτε να ολοκληρώσετε cudaDeviceSynchronize.

Ο τριπλός βραχίονας παραπάνω χρησιμοποιεί ένα νήμα και ένα νήμα. Οι τρέχουσες GPU Nvidia μπορούν να χειριστούν πολλά μπλοκ και νήματα. Για παράδειγμα, μια Tesla P100 GPU που βασίζεται στην Pascal GPU Architecture διαθέτει 56 Streaming Multiprocessors (SMs), καθένας ικανός να υποστηρίζει έως και 2048 ενεργά νήματα.

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

__παγκόσμια__

άκυρη προσθήκη (int n, float * x, float * y)

{

int index = blockIdx.x * blockDim.x + threadIdx.x;

int stride = blockDim.x * gridDim.x;

για (int i = index; i <n; i + = stride)

y [i] = x [i] + y [i];

}

Αν κοιτάξετε τα δείγματα στο CUDA Toolkit, θα δείτε ότι υπάρχουν περισσότερα που πρέπει να λάβετε υπόψη από τα βασικά που κάλυψα παραπάνω. Για παράδειγμα, ορισμένες κλήσεις συνάρτησης CUDA πρέπει να ολοκληρωθούν checkCudaErrors () κλήσεις. Επίσης, σε πολλές περιπτώσεις ο γρηγορότερος κώδικας θα χρησιμοποιεί βιβλιοθήκες όπως cuBLAS μαζί με εκχωρήσεις μνήμης κεντρικού υπολογιστή και συσκευής και αντιγραφή πινάκων εμπρός και πίσω.

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