τεχνολογία nvidia cuda. NVidia CUDA: Χρεώσεις GPU και θάνατος CPU; Συσκευή κεντρικού υπολογιστή ελαχιστοποίησης μετεγκατάστασης δεδομένων

Αυτό ινσι. Ωστόσο, η αναζήτηση του συνδυασμού "CUDA scan", έχοντας δει μόνο 2 άρθρα, δεν ταιριάζει σε καμία περίπτωση με τον αλγόριθμο σάρωσης στη GPU - αλλά είναι ένας από τους ίδιους τους βασικούς αλγόριθμους. Λοιπόν, έχοντας αναπνεύσει βαριά, ας ανατρέξουμε στο μάθημα για το Udacity - Intro to Parallel Programming και τολμώ να γράψω μια νέα σειρά άρθρων για το CUDA. Θα σου πω για άλλη μια φορά ότι η σειρά θα στηρίζεται στη δική της πορεία, και ακόμα κι αν έχεις μια ώρα, θα περάσεις πιο πλούσια τη γιόγκα. Προς το παρόν, προγραμματίζονται τα ακόλουθα άρθρα:
Μέρος 1: Παροχή.
Μέρος 2: Υλικό GPU και μοτίβα παράλληλης επικοινωνίας.
Μέρος 3: Βασικοί αλγόριθμοι GPU: μείωση, σάρωση και ιστόγραμμα.
Μέρος 4: Βασικοί αλγόριθμοι GPU: συμπαγής, τμηματοποιημένη σάρωση, ταξινόμηση. Πρακτική εφαρμογή κάποιων αλγορίθμων.
Μέρος 5: Βελτιστοποίηση λογισμικού GPU.
Μέρος 6: Παράδειγμα παραλληλοποίησης μεταγενέστερων αλγορίθμων.
Μέρος 7: Πρόσθετα θέματα παράλληλου προγραμματισμού, δυναμικός παραλληλισμός.

Zatrimka vs οικοδομική άδεια

Πρώτα απ 'όλα, αν μπορείτε να βάλετε ένα δέρμα μπροστά από ένα GPU freeze για να ολοκληρώσετε τις εργασίες σας - και για τέτοιους σκοπούς, μια καλή GPU, αν χρειαστεί να την παγώσετε; Για το vidpovіdі sіd σημαίνει 2 έννοιες:
Ζατρίμκα(λανθάνουσα κατάσταση) - η ώρα κατά την οποία ολοκληρώνεται μία εντολή/λειτουργία.
Δυνατότητα διέλευσης- αριθμός εντολών/πράξεων, οι οποίες προσμετρώνται ανά ώρα.
Ένα απλό παράδειγμα: ίσως ένα επιβατικό αυτοκίνητο με ταχύτητα 90 km/έτος και χωρητικότητα 4 ατόμων και ένα λεωφορείο με χωρητικότητα 60 km/έτος και χωρητικότητα 20 ατόμων. Εάν για μια επιχείρηση δέχεται την κίνηση 1 ατόμου ανά 1 χιλιόμετρο, τότε η καθυστέρηση ενός επιβατικού αυτοκινήτου είναι 3600/90 = 40 δευτερόλεπτα - για λίγα δευτερόλεπτα 1 άτομο είναι στα μισά του δρόμου μέχρι 1 χιλιόμετρο, η απόδοση ενός αυτοκινήτου είναι 4/ 40 = 0,1 πράξεις / δευτερόλεπτο. Καθυστέρηση διαύλου - 3600/60=60 δευτ., απόδοση διαύλου - 20/60=0,3(3) λειτουργίες/δευτερόλεπτο.
Έτσι από, CPU - tse car, GPU - bus: μπορεί να υπάρχει μεγάλο μπλοκάρισμα, αλλά και μεγάλη δυναμικότητα κτιρίου. Όσο για το χρονοδιάγραμμα μιας συγκεκριμένης επέμβασης δέρματος, δεν είναι τόσο σημαντικό όσο ο αριθμός αυτών των λειτουργιών ανά δευτερόλεπτο - απλώς ρίξτε μια ματιά στη GPU.

Βασική κατανόηση και όροι του CUDA

Και πάλι, ας μιλήσουμε για την ορολογία CUDA:

  • Συνημμένο (συσκευή)- GPU. Ο ρόλος του "αουτσάιντερ" είναι νικηφόρος - όσοι μπορούν ακόμη και να χρησιμοποιήσουν την CPU είναι λιγότερο πιθανό να εργαστούν.
  • οικοδεσπότης (οικοδεσπότης)- ΕΠΕΞΕΡΓΑΣΤΗΣ. Το Vikonu παίζει ρόλο - εκκινεί μια εργασία στο παράρτημα, βλέπει τη μνήμη στο παράρτημα, μετακινεί τη μνήμη / από το παράρτημα. Και έτσι, το άσμα CUDA λέει ότι ως συνημμένο, έτσι ώστε ο οικοδεσπότης να θυμάται τη δική του μνήμη.
  • Πυρήνας- Η εργασία που ξεκινά από τον οικοδεσπότη στο εξωτερικό κτίριο.
Εάν επιλέξετε CUDA, γράφετε απλώς τον κώδικα της αγαπημένης σας γλώσσας προγραμματισμού (η λίστα των κινήσεων που υποστηρίζονται, όχι σε C και C ++), μετά τον οποίο ο μεταγλωττιστής CUDA δημιουργεί τον κωδικό OK για τον κεντρικό υπολογιστή και OK για το πρόσθετο επί. Λίγη προσοχή: Θα προσθέσω τον κώδικα, αλλά δεν φταίω που δεν έγραψα τίποτα περισσότερο από το C μου με κάποιο είδος "CUDA-extensions".

Κύρια στάδια των προγραμμάτων CUDA

  1. Ο κεντρικός υπολογιστής βλέπει την απαραίτητη ποσότητα μνήμης στο παράρτημα.
  2. Ο κεντρικός υπολογιστής θα αντιγράψει τα δεδομένα από τη μνήμη μου στη μνήμη μου.
  3. Ο οικοδεσπότης ξεκινά τους πυρήνες τραγουδιού στο βοηθητικό κτίριο.
  4. Συνδέστε τους πυρήνες.
  5. Θα επισυνάψω ένα αντίγραφο υποδοχής των αποτελεσμάτων από τη μνήμη στη μνήμη μου.
Προφανώς, για τη μέγιστη απόδοση της GPU, είναι απαραίτητο να εξοικονομήσετε μια ώρα, που δαπανήθηκε για την εργασία των πυρήνων, έως και μια ώρα, που δαπανήθηκε στη μνήμη αυτής της κίνησης δεδομένων, ήταν περισσότερο.

Πυρήνες

Ας ρίξουμε μια πιο προσεκτική ματιά στη διαδικασία σύνταξης του κώδικα για τους πυρήνες και εκκίνησης. Σημαντική αρχή Οι πυρήνες γράφονται όπως (πρακτικά) τα τελευταία προγράμματα- ώστε να μην αφήνετε τη δημιουργία και την εκκίνηση ροών από τον κώδικα των ίδιων των πυρήνων. Natomist, για την οργάνωση παράλληλων υπολογισμών Η GPU εκτελεί μεγάλο αριθμό αντιγράφων ενός πυρήνα σε διαφορετικά νήματα- για να είμαι πιο ακριβής, εσείς οι ίδιοι φαίνεται να ξεκινάτε κάποια streams. Και έτσι, στρέφοντας την απόδοση της GPU στην τροφοδοσία - όσο περισσότερες ροές εκτελείτε (για λόγους κατανόησης, ότι όλες οι βρωμιές θα κερδίσουν το ρομπότ) - τόσο το καλύτερο.
Ο κώδικας των πυρήνων θεωρείται ως ένας εξαιρετικός διαδοχικός κώδικας σε τέτοιες στιγμές:
  1. Οι μεσαίοι πυρήνες μπορούν να αναγνωρίσουν το «αναγνωριστικό» ή, πιο απλά, προφανώς, τη θέση της ροής, η οποία είναι μεταδοτικά νικηφόρα - με τη θέση νικητή, επιτυγχάνουμε ότι ένας πυρήνας είναι πρακτικός με διαφορετική αγρανάπαυση τζιν στη ροή, σε που τρέχει. Πριν από την ομιλία, μια τέτοια οργάνωση παράλληλων υπολογισμών ονομάζεται SIMD (Single Instruction Multiple Data) - εάν μερικοί επεξεργαστές ολοκληρώσουν την ίδια λειτουργία ταυτόχρονα, αν και σε διαφορετικά δεδομένα.
  2. Σε ορισμένες περιπτώσεις, οι κωδικοί του πυρήνα πρέπει να αλλάξουν διαφορετικούς τρόπους συγχρονισμού.
Με ποια κατάταξη ορίζουμε τον αριθμό των ροών, για τις οποίες θα εκκινηθεί ο πυρήνας; Ακόμα τσιπ GPU ΓραφικάΗ Μονάδα Επεξεργασίας, φυσικά, κόλλησε στο μοντέλο CUDA, η ίδια στη μέθοδο ρύθμισης του αριθμού των ροών:
  • Στο πίσω μέρος, οι διαστάσεις του λεγόμενου πλέγματος (πλέγμα) ορίζονται σε τρισδιάστατες συντεταγμένες: grid_x, grid_y, grid_z. Ως αποτέλεσμα, το δίκτυο σχηματίζεται από grid_x*grid_y*grid_zμπλοκ.
  • Στη συνέχεια, το μέγεθος του μπλοκ αλλάζει σε τρισδιάστατες συντεταγμένες: block_x, block_y, block_z. Ως αποτέλεσμα, το μπλοκ θα διπλωθεί block_x*block_y*block_zροές. Πατέρα, σε παρακαλώ grid_x*grid_y*grid_z*block_x*block_y*block_zροές. Σημαντικός σεβασμός - ο μέγιστος αριθμός ροών σε ένα μπλοκ περικλείεται και κατατίθεται ανά μοντέλο GPU - οι τυπικές τιμές είναι 512 (παλαιότερα μοντέλα) και 1024 (νεότερα μοντέλα).
  • Διαθέσιμη αλλαγή μεσαίου πυρήνα threadIdxі blockIdxμε χωράφια x, y, z- βρώμα για να εκδικηθεί τις τρισδιάστατες συντεταγμένες στη ροή στο μπλοκ και στο μπλοκ στον ιστότοπο είναι ξεκάθαρο. Αλλαγές είναι επίσης διαθέσιμες μπλοκΔιμі gridDimμε τα ίδια πεδία - αλλάξτε το μέγεθος του μπλοκ και το πλέγμα είναι καθαρό.
Επομένως, υπάρχει κάποιος τρόπος να εκκινήσετε τις ροές με έξυπνο τρόπο για την επεξεργασία εικόνων 2D και 3D: για παράδειγμα, είναι απαραίτητο να επεξεργαστείτε το δέρμα ενός εικονοστοιχείου 2D ή εικόνων 3D και, στη συνέχεια, εάν επιλέξετε ένα μπλοκ (κατάθεση στις εικόνες GPU , συλλέγεται ο τρόπος επεξεργασίας αυτών των εικόνων) έτσι ώστε να καλυφθεί ολόκληρη η εικόνα, είναι δυνατό, εάν είναι υπερβολικό - έτσι ώστε η επέκταση της εικόνας να μην κοινοποιείται σε ολόκληρο το μπλοκ.

Γράφουμε ένα πρόγραμμα στο CUDA

Τελειώστε τη θεωρία, γράψτε κώδικα για μια ώρα. Οδηγίες για τη ρύθμιση της διαμόρφωσης CUDA για διάφορα λειτουργικά συστήματα - docs.nvidia.com/cuda/index.html. Έτσι, για την απλότητα της εργασίας με αρχεία εικόνας, θα τροποποιήσουμε το OpenCV και για ίση παραγωγικότητα της CPU και της GPU - OpenMP.
Η εργασία έχει ρυθμιστεί να γίνεται απλά: η μετατροπή μιας έγχρωμης εικόνας από μια γκρι εικόνα. Για ποιον, η αλήθεια είναι pixel εικονοστοιχείαστην κλίμακα sir_y είναι σημαντικό για τον τύπο: Υ = 0,299*pix.R + 0,587*pix.G + 0,114*pix.B.
Θα γράψουμε τον σκελετό του προγράμματος στο πίσω μέρος:

κύρια.cpp

#περιλαμβάνω #περιλαμβάνω #περιλαμβάνω #περιλαμβάνω #περιλαμβάνω #περιλαμβάνω #περιλαμβάνω #περιλαμβάνω #include "openMP.hpp" #include "CUDA_wrappers.hpp" #include "common/image_helpers.hpp" με χρήση του χώρου ονομάτων cv; χρησιμοποιώντας namespace std? int main(int argc, char** argv) ( χρησιμοποιώντας χώρο ονομάτων std::chrono; if(argc != 2) ( cout<<" Usage: convert_to_grayscale imagefile" << endl; return -1; } Mat image, imageGray; uchar4 *imageArray; unsigned char *imageGrayArray; prepareImagePointers(argv, image, &imageArray, imageGray, &imageGrayArray, CV_8UC1); int numRows = image.rows, numCols = image.cols; auto start = system_clock::now(); RGBtoGrayscaleOpenMP(imageArray, imageGrayArray, numRows, numCols); auto duration = duration_cast(system_clock::now() - start); cout<<"OpenMP time (ms):" << duration.count() << endl; memset(imageGrayArray, 0, sizeof(unsigned char)*numRows*numCols); RGBtoGrayscaleCUDA(imageArray, imageGrayArray, numRows, numCols); return 0; }


Όλα είναι ξεκάθαρα εδώ - διαβάζουμε το αρχείο από τις εικόνες, παίρνουμε τις ενδείξεις στα χρώματα και τα χρώματα της γκρι εικόνας, ξεκινάμε την επιλογή
με OpenMP και παραλλαγή με CUDA, παγώνουμε την ώρα. Λειτουργία προετοιμασίαImagePointersμπορεί να μοιάζει με αυτό:

προετοιμασίαImagePointers

πρότυπο void preparateImagePointers(const char * const inputImageFileName, cv::Mat& inputImage, T1** inputImageArray, cv::Mat& outputImage, T2** outputImageArray, const int outputImageType) (χρησιμοποιώντας το χώρο ονομάτων =REadIIMd;με χρήση χώρου ονομάτων AD_Image; if (inputImage.empty()) (cerr<< "Couldn"t open input file." << endl; exit(1); } //allocate memory for the output outputImage.create(inputImage.rows, inputImage.cols, outputImageType); cvtColor(inputImage, inputImage, cv::COLOR_BGR2BGRA); *inputImageArray = (T1*)inputImage.ptr(0); *outputImageArray = (T2*)outputImage.ptr (0); }


Μιλάω για ένα μικρό κόλπο: στα δεξιά, στο γεγονός ότι έχουμε ακόμη λίγη δουλειά στο skin pixel της εικόνας - γι' αυτό, με την επιλογή CUDA, υπάρχει μεγαλύτερο πρόβλημα επιτάχυνσης της ώρας μπλε λειτουργίες μέχρι την ώρα εμφάνισης της μνήμης αυτού του αντιγράφου των δεδομένων, και ως αποτέλεσμα, η τελευταία ώρα Η έκδοση CUDA θα είναι μεγαλύτερη από την έκδοση OpenMP, αλλά θέλουμε να δείξουμε ότι το CUDA είναι πιο έξυπνο :) Έτσι για το CUDA θα διαρκέσει μόνο μία ώρα, δουλεύοντας στην οπτικοποίηση της μετατροπής εικόνας - χωρίς να βελτιωθούν οι λειτουργίες της μνήμης. Από μόνος μου, θα πω ότι για τη μεγάλη τάξη, η ώρα της βασικής εργασίας εξακολουθεί να κυριαρχεί και η CUDA θα είναι πιο εξοικειωμένη με βελτιωμένες λειτουργίες από τη μνήμη.
Ας γράψουμε τον κώδικα για την παραλλαγή OpenMP:

openMP.hpp

#περιλαμβάνω #περιλαμβάνω #περιλαμβάνω void RGBtoGrayscaleOpenMP(uchar4 *imageArray, unsigned char *imageGrayArray, int numRows, int numCols) ( #pragma omp parallel for collapse(2) for (int i = 0; i< numRows; ++i) { for (int j = 0; j < numCols; ++j) { const uchar4 pixel = imageArray; imageGrayArray = 0.299f*pixel.x + 0.587f*pixel.y+0.114f*pixel.z; } } }


Κάντε τα πάντα απευθείας - μόλις προσθέσαμε μια οδηγία omp παράλληλα γιαμέχρι κώδικα ενός νήματος - για τους οποίους όλη η ομορφιά είναι αυτή η στεγανότητα του OpenMP. Προσπάθησα να παίξω με την παράμετρο πρόγραμμαΗ μπύρα βγήκε μόνο πιο ζεστή, πιο χαμηλή χωρίς αυτήν.
Zreshtoyu, ας περάσουμε στο CUDA. Εδώ θα γράψουμε πιο αναλυτικά. Πρέπει να δείτε τη μνήμη για τα δεδομένα εισόδου, να τα μετακινήσετε από την CPU στη GPU και να δείτε τη μνήμη για τα δεδομένα εισόδου:

Συνημμένο κείμενο

void RGBtoGrayscaleCUDA(const uchar4 * const h_imageRGBA, unsigned char* const h_imageGray, size_t numRows, size_t numCols) ( uchar4 *d_imageRGBA; ανυπόγραφο char *d_imageGray; const size_t εκκίνηση για την τιμή/μνήμη , sizeof(uchar4) * numPixels)), το GPU checkCudaErrors(cudaMemcpy(d_imageRGBA, h_imageRGBA, sizeof(uchar4) * numPixels, cudaMemcpyHostToDevice));


Παρακαλούμε δώστε προσοχή στο πρότυπο ονομασίας CUDA - τα δεδομένα της CPU βασίζονται h_ (η ost), δεδομένα GPU - προβολή ρε_ (ρεκακία). check Cuda Errors- μακροεντολή, προερχόμενη από το μάθημα του αποθετηρίου github Udacity. Μπορεί να μοιάζει με αυτό:

Συνημμένο κείμενο

#περιλαμβάνω #define checkCudaErrors(val) check((val), #val, __FILE__, __LINE__) template άκυρος έλεγχος (T err, const char * const func, const char * const file, const int line) ( if (err! = cudaSuccess) ( std::cerr<< "CUDA error at: " << file << ":" << line << std::endl; std::cerr << cudaGetErrorString(err) << " " << func << std::endl; exit(1); } }


cudaMalloc- αναλογικό mallocγια GPU cudaMemcpy- αναλογικό memcpyΜπορεί να υπάρχει μια πρόσθετη παράμετρος για το enum look-ahead, η οποία καθορίζει τον τύπο αντιγράφου: cudaMemcpyHostToDevice, cudaMemcpyDeviceToHost, cudaMemcpyDeviceToDevice.
Στη συνέχεια, είναι απαραίτητο να ρυθμίσετε το μέγεθος του πλέγματος και του μπλοκ και να καλέσετε τον πυρήνα, χωρίς να ξεχάσετε να ορίσετε την ώρα:

Συνημμένο κείμενο

dim3 blockSize; dim3 gridSize; int threadNum; cudaEvent_t start, stop; cudaEventCreate(&start); cudaEventCreate(&stop); threadNum = 1024; blockSize = dim3(TreadNum, 1, 1); gridSize = dim3(numCols/threadNum+1, numRows, 1); cudaEventRecord(start); rgba_to_grayscale_simple<<>>(d_imageRGBA, d_imageGray, numRows, numCols); cudaEventRecord(stop); cudaEventSynchronize(stop); cudaDeviceSynchronize(); checkCudaErrors(cudaGetLastError()); float χιλιοστά του δευτερολέπτου = 0; cudaEventElapsedTime(&χιλιοστά του δευτερολέπτου, έναρξη, διακοπή); std::out<< "CUDA time simple (ms): " << milliseconds << std::endl;


Δώστε σεβασμό στη μορφή wiki του πυρήνα - όνομα_πυρήνα<<>> . Ο ίδιος ο κώδικας του πυρήνα δεν είναι επίσης πολύ αναδιπλούμενος:

rgba_to_greyscale_simple

Global__ void rgba_to_grayscale_simple(const uchar4* const d_imageRGBA, unsigned char* const d_imageGray, int numRows, int numCols) ( int y = blockDim.y*blockIdx.y + threadIdxn,ifxum |= threadIdx.xy | >=numRows) επιστροφή, const int offset = y*numCols+x; const uchar4 pixel = d_imageRGBA; 0.114f*pixel.z;


Εδώ υπολογίζουμε τις συντεταγμένες yі Χεπεξεργασμένα εικονοστοιχεία, βίκο υλικό που περιγράφηκε προηγουμένως threadIdx, blockIdxі μπλοκΔιμ, Λοιπόν, και μετατροπή vikonuemo. Φέρτε σεβασμό στην εκ νέου επαλήθευση if (x>=numCols || y>=numRows)- Έτσι, καθώς η επέκταση της εικόνας δεν θα είναι obov'yazkovo θα διαιρεθεί γενικά σχετικά με την επέκταση των μπλοκ, τέτοια μπλοκ μπορούν να "ξεπεράσουν" την εικόνα, επομένως είναι απαραίτητη μια εκ νέου επαλήθευση. Επίσης, μια συνάρτηση πυρήνα μπορεί να οριστεί ως προσδιοριστής __παγκόσμια__.
Rest Croc - αντιγράψτε το αποτέλεσμα πίσω από τη GPU στην CPU και αλλάξτε τη μνήμη:

Συνημμένο κείμενο

checkCudaErrors(cudaMemcpy(h_imageGray, d_imageGray, sizeof(unsigned char) * numPixels, cudaMemcpyDeviceToHost)); cudaFree(d_imageGray); cudaFree(d_imageRGBA);


Μιλώντας για αυτό, το CUDA σάς επιτρέπει να τροποποιήσετε τον μεταγλωττιστή C++ για τον κώδικα κεντρικού υπολογιστή - μπορείτε εύκολα να γράψετε συντομεύσεις για αυτόματη κλιμάκωση της μνήμης.
Επίσης, εκτελέστε το, κερδίστε το (το μέγεθος της εικόνας εισόδου είναι 10,109 × 4,542):
Χρόνος OpenMP (ms):45 CUDA απλός χρόνος (ms): 43.1941
Διαμόρφωση μηχανής, όπου πραγματοποιήθηκαν δοκιμές:

Συνημμένο κείμενο

Επεξεργαστής: Intel Core(TM) i7-3615QM CPU @ 2,30GHz.
GPU: NVIDIA GeForce GT 650M, 1024 MB, 900 MHz.
RAM: DD3, 2x4GB, 1600 MHz.
ΛΣ: OS X 10.9.5.
Μεταγλωττιστής: g++ (GCC) 4.9.2 20141029.
Μεταγλωττιστής CUDA: Εργαλεία μεταγλώττισης Cuda, έκδοση 6.0, V6.0.1.
Υποστηριζόμενη έκδοση OpenMP: OpenMP 4.0.


Φαίνεται ότι δεν είναι πολύ εχθρικό :) Και το πρόβλημα εξακολουθεί να είναι το ίδιο - δεν αρκεί να δουλέψουμε στο skin pixel - ξεκινάμε χιλιάδες ροές, τα δέρματα για τα οποία φαίνονται πρακτικά mittevo. Για μια CPU με CPU, αυτό το πρόβλημα δεν προκύπτει - το OpenMP εκτελεί έναν μικρό αριθμό ροών (8 για τον φορητό υπολογιστή μου) και μοιράζει το ρομπότ μεταξύ τους εξίσου - με αυτόν τον τρόπο, ο επεξεργαστής θα είναι πρακτικά απασχολημένος στο 100%, σε αυτό ώρα, όπως με τις GPU, στην πραγματικότητα, δεν vikoristovuemo όλα τα mіts γιόγκα. Η λύση είναι πιο προφανής - η επεξεργασία ενός ψεκασμού pixel στον πυρήνα. Νέος, βελτιστοποιημένος, ο πυρήνας θα μοιάζει με αυτό:

rgba_to_grayscale_optimized

#define WARP_SIZE 32 __global__ void rgba_to_grayscale_optimized(const lochar4* const d_imageRGBA, unsigned char* const d_imageGray, int numRows, int numCols, int elemsPerThread.xtxt; WARP_SIZE * WARP_SIZE)*(elemsPerThread-1)+x;για (int i=loop_start, j=0; j


Δεν είναι όλα τόσο απλά εδώ, όπως από τον μπροστινό πυρήνα. Πώς να μεγαλώσεις, τώρα το δέρμα ιδρώνει elemsPerThread pixel, και όχι στη σειρά, αλλά σε WARP_SIZE μεταξύ τους. Τι είναι το WARP_SIZE, γιατί αξίζει 32 και τώρα ήρθε η ώρα να ολοκληρώσω τα pixel αργότερα μέσα στην ημέρα, θα σας πω πιο αναλυτικά στα επόμενα μέρη, απλά θα πω αμέσως ότι είναι καλύτερα να κάνω περισσότερα αποτελεσματική εργασία στη μνήμη. Το δερμάτινο potik είναι πλέον φινιρισμένο elemsPerThreadεικονοστοιχεία από την ίδια θέση σε WARP_SIZE μεταξύ τους, επομένως η συντεταγμένη x του πρώτου εικονοστοιχείου για αυτό το νήμα που κινείται από την ου θέση στο μπλοκ επεκτείνεται τώρα για έναν πιο πτυσσόμενο τύπο χαμηλότερα νωρίτερα.
Ολόκληρος ο πυρήνας ξεκινάει ως εξής:

Συνημμένο κείμενο

threadNum=128; const int elemsPerThread = 16; blockSize = dim3(TreadNum, 1, 1); gridSize = dim3(numCols/(threadNum*elemsPerThread) + 1, numRows, 1); cudaEventRecord(start); rgba_to_grayscale_optimized<<>>(d_imageRGBA, d_imageGray, numRows, numCols, elemsPerThread); cudaEventRecord(stop); cudaEventSynchronize(stop); cudaDeviceSynchronize(); checkCudaErrors(cudaGetLastError()); χιλιοστά του δευτερολέπτου = 0; cudaEventElapsedTime(&χιλιοστά του δευτερολέπτου, έναρξη, διακοπή); std::out<< "CUDA time optimized (ms): " << milliseconds << std::endl;


Ο αριθμός των μπλοκ ανά x-συντεταγμένη είναι πλέον εγγυημένος ως numCols / (threadNum*elemsPerThread) + 1αναπληρωτής numCols/threadNum + 1. Διαφορετικά, όλα είναι ίδια.
Ας αρχίσουμε:
Χρόνος OpenMP (ms):44 CUDA απλός χρόνος (ms): 53,1625 CUDA χρόνος βελτιστοποιημένος (ms): 15,9273
Αφαιρέσαμε την αύξηση της ταχύτητας κατά 2,76 φορές (ξέρω, δεν πληρώνω μια ώρα για τη λειτουργία από τη μνήμη) - για ένα τόσο απλό πρόβλημα, δεν είναι κακό να το κάνετε. Έτσι, η εργασία είναι ακόμα πιο απλή - η CPU μπορεί να το χειριστεί καλά. Όπως μπορεί να φανεί από μια άλλη δοκιμή, μια απλή υλοποίηση στη GPU μπορεί να είναι σε θέση να προγραμματίσει την ταχύτητα της υλοποίησης στη CPU.
Αυτό είναι όλο προς το παρόν, στο επιθετικό κομμάτι μπορούμε να δούμε την ασφάλεια υλικού της GPU και τα κύρια μοτίβα της παράλληλης επικοινωνίας.
Όλος ο κωδικός εξόδου είναι διαθέσιμος στο bitbucket.

Ετικέτες: Προσθήκη ετικετών

- Ένα σύνολο διεπαφών χαμηλού προγραμματισμού ( API) για τη δημιουργία igor και άλλων εξαιρετικά παραγωγικών συμπληρωμάτων πολυμέσων. Ενεργοποιήστε την επένδυση υψηλής παραγωγικότητας 2D- І 3D-γραφικά, ήχος και εισαγωγή.

Direct3D (D3D) - διεπαφή για την προβολή triviworlds πρωτόγονοι(Γεωμετρικά σώματα). Εισαγω .

OpenGL(Βίντε Αγγλικά. Ανοίξτε τη Βιβλιοθήκη Γραφικών, Κυριολεκτικά - ανοιχτή βιβλιοθήκη γραφικών) - μια προδιαγραφή που ορίζει έναν ανεξάρτητο τύπο προγραμματιζόμενης διεπαφής λογισμικού πολλαπλών πλατφορμών για τη σύνταξη πρόσθετων που μπορεί να χρησιμοποιηθεί για τη δημιουργία δισδιάστατων και τρισδιάστατων γραφικών υπολογιστή. Περιλαμβάνει περισσότερες από 250 λειτουργίες για τη ζωγραφική αναδιπλούμενων σκηνών τριών κόσμων από απλά πρωτόγονα. Νίκη για τη δημιουργία βίντεο βουνών, εικονική πραγματικότητα, οπτικοποίηση στην επιστημονική έρευνα. Στην πλατφόρμα Windowsανταγωνίζονται με .

OpenCL(Βίντε Αγγλικά. Ανοίξτε τη γλώσσα υπολογιστών, Κυριολεκτικά - υπολογισμός vodkrita mov) - δομή(Πλαίσιο του συστήματος λογισμικού) για τη σύνταξη προγραμμάτων υπολογιστή που συνδέονται με παράλληλες χρεώσεις σε διάφορα γραφικά ( GPU) και ( ). πλαίσιο U OpenCLεισαγάγετε τον προγραμματισμό mov και το πρόσθετο προγραμματισμού διεπαφής ( API). OpenCLεξασφάλιση παραλληλισμού σε επίπεδο οδηγιών και σε επίπεδο δεδομένων και στην εφαρμογή της τεχνολογίας GPGPU.

GPGPU(σύντομη φόρμα αγγλικά) Γενικού-Π σκοπού G ραφές P rokussing Units, Κυριολεκτικά - GPUπαγκόσμια αναγνώριση) - η τεχνική της χρήσης ενός επεξεργαστή γραφικών μιας κάρτας βίντεο για καθολικούς υπολογισμούς, όπως ακούγεται να πραγματοποιηθεί.

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

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

SDK(σύντομη φόρμα αγγλικά) Κιτ ανάπτυξης λογισμικού) - Ένα σύνολο εργαλείων για την ανάπτυξη ασφάλειας λογισμικού.

ΕΠΕΞΕΡΓΑΣΤΗΣ(σύντομη φόρμα αγγλικά) Κεντρική μονάδα επεξεργασίας, Κυριολεκτικά - κεντρικό / κύριο / προσάρτημα μέτρησης κεφαλών) - κεντρικό (μικρο) συνημμένο, το οποίο vikonu οδηγίες μηχανής? μέρος της ασφάλειας υλικού, το οποίο είναι υπεύθυνο για τον υπολογισμό των λειτουργιών (καθήκοντα από το λειτουργικό σύστημα και το λογισμικό εφαρμογής) και συντονίζει την εργασία όλων των συνημμένων.

GPU(σύντομη φόρμα αγγλικά) Μονάδα Επεξεργασίας Γραφικών, Κυριολεκτικά - παράρτημα γραφικού υπολογισμού) - επεξεργαστής γραφικών. okremy συνημμένα ή κονσόλες παιχνιδιών, τα οποία vikonu γραφική απόδοση (οπτικοποίηση). Οι σύγχρονοι επεξεργαστές γραφικών μπορούν να επεξεργάζονται αποτελεσματικά και να αποδίδουν ρεαλιστικά γραφικά υπολογιστή. Ο επεξεργαστής γραφικών στους σημερινούς προσαρμογείς βίντεο zastosovuetsya ως συνδετήρας trivivirnoy γραφικών, proteo yogo μπορεί να συστραφεί σε ορισμένες λειτουργίες και για υπολογισμό ( GPGPU).

προβλήματα ΕΠΕΞΕΡΓΑΣΤΗΣ

Για μεγάλο χρονικό διάστημα, η αύξηση της παραγωγικότητας των παραδοσιακών οφειλόταν κυρίως στην επακόλουθη αύξηση της συχνότητας του ρολογιού (περίπου το 80% της παραγωγικότητας της αρχής της ίδιας της συχνότητας ρολογιού) με μια αύξηση κατά μία ώρα στον αριθμό των τρανζίστορ σε ένα κρύσταλλο. Ωστόσο, πιο μακριά, η αύξηση της συχνότητας ρολογιού (σε συχνότητα ρολογιού μεγαλύτερη από 3,8 GHz, τα τσιπ απλώς υπερθερμαίνονται!) συναντά έναν αριθμό θεμελιωδών φυσικών φραγμών (θραύσματα της τεχνολογικής διαδικασίας μπορεί να έχουν πλησιάσει τη διαστολή του ατόμου: Και το μέγεθος του ατόμου του πυριτίου είναι περίπου 0,543 nm):

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

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

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

Rosvitok GPU

Ταυτόχρονα, η ανάπτυξη του GPU:

Φύλλο πτώση 2008 - Intelεισήγαγε μια σειρά 4 πυρήνων Intel Core i7, τα οποία βασίζονται στη μικροαρχιτεκτονική της νέας γενιάς Nehalem. Οι επεξεργαστές λειτουργούν σε συχνότητα ρολογιού 26-32 GHz. Η Vikonani πίσω από την τεχνολογία διαδικασίας 45 nm.

Στήθος 2008 – ροζποχάλης παραδόσεις του 4πύρηνου AMD Phenom II 940(κωδικό όνομα - Ντένεμπ). Παράγεται σε συχνότητα 3 GHz, που παράγεται για την τεχνολογία διαδικασίας 45 nm.

Traven 2009 - Εταιρία AMDπαρουσίασε την έκδοση του επεξεργαστή γραφικών ATI Radeon HD 4890από τον πυρήνα η συχνότητα ρολογιού αυξήθηκε από 850 MHz σε 1 GHz. Tse πρώτα γραφικόςεπεξεργαστής που λειτουργεί στο 1 GHz. Ο αριθμός των στελεχών του τσιπ και η αύξηση της συχνότητας αυξήθηκαν από 1,36 σε 1,6 teraflops. Επεξεργαστής για αντικατάσταση 800 (!) πυρήνων μέτρησης, υποστήριξη μνήμης βίντεο GDDR5, DirectX 10.1, ATI CrossFireXκαι όλες τις άλλες τεχνολογίες που τροφοδοτούν τα σύγχρονα μοντέλα καρτών γραφικών. Παρασκευάσματα τσιπ βασισμένα στην τεχνολογία 55-nm.

Βασικές δυνάμεις GPU

Ρύζι Vіdminnimi GPU(διορθώθηκε από ) є:

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

- τυπική πίεση αιχμής GPUπλουσιότερος, χαμηλότερος ;

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

"Η κρίση του είδους"

«Η κρίση του είδους» για ωρίμασαν μέχρι το 2005, - εμφανίστηκαν οι ίδιοι. Ale, ανεξάρτητα από την ανάπτυξη της τεχνολογίας, η αύξηση της παραγωγικότητας του μειώθηκε αισθητά. Παραγωγικότητα ώρας νερού GPUσυνεχίσει να αυξάνεται. Ναι, μέχρι το 2003. και η επαναστατική ιδέα αποκρυσταλλώθηκε - vikoristovuvat για τις ανάγκες του υπολογισμού του γραφικού mіts. Οι γραφικοί επεξεργαστές χρησιμοποιούνται ενεργά για «μη γραφικούς» υπολογισμούς (προσομοίωση φυσικής, επεξεργασία σημάτων, υπολογιστικά μαθηματικά/γεωμετρία, λειτουργίες με βάσεις δεδομένων, υπολογιστική βιολογία, υπολογιστική οικονομία, επιστήμη των υπολογιστών).

Το κύριο πρόβλημα είναι ότι δεν υπήρχε τυπική διεπαφή για προγραμματισμό GPU. Rozrobniki vikoristovuvali OpenGLή Direct3Dαλλά ήταν πολύ δύσκολο. Εταιρεία NVIDIA(μία από τις μεγαλύτερες συλλογές επεξεργαστών γραφικών, πολυμέσων και επικοινωνίας, καθώς και επεξεργαστών μέσων χωρίς βελάκια· ιδρύθηκε το 1993) ασχολήθηκε με την ανάπτυξη ενός ενιαίου προτύπου χειρός - και εισήγαγε την τεχνολογία CUDA.

Πώς ξεκίνησε

2006 - NVIDIAεπιδεικνύοντας CUDA™; η αρχή μιας επανάστασης στον υπολογισμό του GPU.

2007 - NVIDIAαρχιτεκτονική απελευθέρωσης CUDA(έκδοση Pochatov CUDA SDK bula που παρουσιάστηκε στις 15 Φεβρουαρίου 2007). υποψηφιότητα "Η καλύτερη καινοτομία" στο περιοδικό Λαϊκή Επιστήμηκαι "Vybіr chitachіv" vіd vidannya HPCWire.

2008 - τεχνολογία NVIDIA CUDAκέρδισε την υποψηφιότητα "Technical Perevaga" στο PC Magazine.

Τι είναι CUDA

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

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

CUDAδίνει στον έμπορο λιανικής την ευκαιρία να οργανώσει μια δικαστική έρευνα με πρόσβαση σε ένα σύνολο οδηγιών για μια γραφική επιτάχυνση και χερουβεί τη μνήμη του, οργάνωση σε έναν νέο αναδιπλούμενο παράλληλο υπολογισμό. Γραφικό priskoryuvach іz pіdtrimkoy CUDAγίνεται μια ενσύρματη προγραμματισμένη αρχιτεκτονική, παρόμοια με τη σημερινή. Παρόλα αυτά, δίνουμε στον παραγγελέα χαμηλή, χαμηλή και υψηλή πρόσβαση στην κατοχή, roblyach CUDAμια απαραίτητη βάση για σοβαρά εργαλεία υψηλής ποιότητας, όπως μεταγλωττιστές, αριθμομηχανές, μαθηματικές βιβλιοθήκες, πλατφόρμες λογισμικού.

Uralsky, κορυφαίος ειδικός στις τεχνολογίες NVIDIA, porіvnyuyuchi GPUі πες έτσι: - Tse poshlyahovik. Vіn їzdit zavzhdі ότι skіz, αλλά όχι πολύ γρήγορα. ΑΛΛΑ GPU- Τσε σπορ αυτοκίνητο. Απλώς δεν πας πουθενά σε ένα βρώμικο ακριβό κρασί, αλλά δώσε ένα κάλυμμα γαρνιτούρας και θα δείξεις όλη σου τη σουηδικότητα, που δεν είχε ονειρευτεί ποτέ ο poshlyakhovik! ..».

Δυνατότητα τεχνολογίας CUDA

Τεχνολογία CUDA

Volodymyr Frolov,[email προστατευμένο]

Αφηρημένη

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

1. Εισαγωγή

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

Γι' αυτό όλοι οι αλγόριθμοι των σύγχρονων συστημάτων μέτρησης πάνε για την αύξηση του αριθμού των επεξεργαστών και των πυρήνων και όχι για την αύξηση της συχνότητας ενός επεξεργαστή. Ο αριθμός των πυρήνων της κεντρικής μονάδας επεξεργασίας (CPU) σε προηγμένα συστήματα είναι πάνω από 8.

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

Προστατευτείτε για να θαυμάσετε τους bik γραφικούς επεξεργαστές της GPU (Graphics Processing Unit), εκεί, στο μονοπάτι του παραλληλισμού, πήγαν πλουσιοπάροχα νωρίτερα. Στις τρέχουσες κάρτες γραφικών, για παράδειγμα GF8800GTX, ο αριθμός των επεξεργαστών μπορεί να φτάσει τους 128. Η παραγωγικότητα τέτοιων συστημάτων, εάν προγραμματιστούν σωστά, μπορεί να είναι σημαντική (Εικ. 1).

Ρύζι. 1. Αριθμός λειτουργιών κινητής υποδιαστολής για CPU και GPU

Εάν οι πρώτες κάρτες γραφικών εμφανίζονταν μόλις προς πώληση, η δυσοσμία θα ήταν απλή (μαζί με τον κεντρικό επεξεργαστή) από τα υψηλότερα εξειδικευμένα βοηθητικά κτίρια, που προορίζονται για την αφαίρεση του επεξεργαστή από την οπτικοποίηση δεδομένων δύο κόσμων. Με την ανάπτυξη της βιομηχανίας τυχερών παιχνιδιών και την εμφάνιση τέτοιων τετριμμένων παιχνιδιών όπως το Doom (Εικ. 2) και το Wolfenstein 3D (Εικ. 3), η ζήτηση βινυλίου για τρισδιάστατη απεικόνιση.

Μωρά 2.3. Παιχνίδια Doom και Wolfenstein 3D

Οι πρώτες κάρτες γραφικών Voodoo, (1996) και μέχρι το 2001, δημιουργήθηκαν από την εταιρεία 3Dfx λίγο πριν από το 2001 στη GPU, καθορίζοντας μόνο το σύνολο των λειτουργιών στα δεδομένα εισόδου.

Οι προγραμματιστές δεν είχαν επιλογή αλγορίθμων οπτικοποίησης και αυξημένη ευελιξία, εμφανίστηκαν shaders - μικρά προγράμματα που οπτικοποιούν την κορυφή του δέρματος και το εικονοστοιχείο δέρματος με μια κάρτα βίντεο. Τα καθήκοντά τους περιελάμβαναν μετασχηματισμούς πάνω από τις κορυφές και σκίαση-φωτισμό σε σημεία, για παράδειγμα, για το μοντέλο Phong.

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

Είναι δυνατό να συγκριθεί με το δικό μου FORTRAN με το γεγονός ότι οι βρωμές, όπως το FORTRAN, ήταν οι πρώτες, αλλά αναγνωρίστηκαν για vyrishennya μόνο έναν τύπο εργασίας. Τα Shaders είναι ελάχιστα χρήσιμα για την τελειοποίηση οποιωνδήποτε άλλων εργασιών, τετριμμένων μετασχηματισμών και ραστεροποιήσεων, όπως το FORTRAN, δεν είναι κατάλληλα για την ολοκλήρωση μιας εργασίας, που δεν σχετίζονται με αριθμητικά rozrahunki.

Σήμερα, υπάρχει μια τάση μη παραδοσιακών καρτών βίντεο για οπτικοποίηση στις ντουλάπες της κβαντικής μηχανικής, νοημοσύνη κομματιών, φυσικές ανακατασκευές, κρυπτογραφία, σωματικά σωστή οπτικοποίηση, ανακατασκευή από φωτογραφίες, αναγνώριση Το Qi zavdannya δονήθηκε χωρίς το χέρι στα όρια των γραφικών API (DirectX, OpenGL), θραύσματα του qi API δημιουργήθηκαν από άλλους zastosuvan.

Η ανάπτυξη γενικού προγραμματισμού στη GPU (General Programming on GPU, GPGPU) οδήγησε λογικά στη δικαίωση τεχνολογιών που στόχευαν σε έναν ευρύτερο τομέα παραγωγής, χαμηλότερη ροστεροποίηση. Ως αποτέλεσμα, η Nvidia δημιούργησε την τεχνολογία Compute Unified Device Architecture (ή εν συντομία CUDA) και η ATI, η οποία ανταγωνίζεται, δημιούργησε την τεχνολογία STREAM.

Θα πρέπει να σημειωθεί ότι τη στιγμή της συγγραφής αυτού του άρθρου, η τεχνολογία STREAM ήταν σθεναρά υπέρ της ανάπτυξης του CUDA και αυτό δεν φαίνεται εδώ. Εστιάζουμε στην τεχνολογία CUDA - GPGPU, η οποία σας επιτρέπει να γράφετε προγράμματα σε πολλές ταινίες C ++.

2. Κύρια διαφορά μεταξύ CPU και GPU

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

2.1. Δυνατότητες

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

Για την GPU, δεν είναι κακό. Όπως γνωρίζετε, έχοντας διαβάσει αυτό το άρθρο, το CUDA μπορεί να δει 6 είδη μνήμης. Μπορείτε να διαβάσετε από οποιαδήποτε μέση, φυσικά προσβάσιμη, αλλά να γράψετε - όχι στη μέση. Ο λόγος έγκειται στο γεγονός ότι η GPU, σε κάθε περίπτωση, είναι ένα συγκεκριμένο πρόσθετο, το αναγνωρίζουμε για συγκεκριμένους σκοπούς. Tse obezhennya zaprovadzhennja για ρομπότ zbіlshennya svydkostі singhnyh algogorіvіv і zvіzhennya vartosti і obladannya.

2.2. Σουηδικός κώδικας μνήμης

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

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

Στη GPU (εδώ μπορείτε να χρησιμοποιήσετε τις κάρτες γραφικών GF 8ης σειράς) οι κρυφές μνήμες είναι επίσης σημαντικές, αλλά ο μηχανισμός δεν είναι τόσο δύσκολος όσο στην CPU. Με έναν πρώτο τρόπο, εξαργυρώνοντας μια πλήρη εμμονή με τους τύπους μνήμης, αλλά με διαφορετικό τρόπο, οι κρυφές μνήμες εξασκούνται μόνο από την ανάγνωση.

Στη GPU, υπάρχει περισσότερο από αρκετός χρόνος για να θυμάστε να πληρώσετε για πρόσθετους παράλληλους υπολογισμούς. Προς το παρόν, κάποιος zavdannya ελέγχει τα δεδομένα, pratsyut іnshі, έτοιμο να υπολογίσει. Αυτή είναι μια από τις κύριες αρχές του CUDA, που σας επιτρέπει να αυξήσετε σημαντικά την παραγωγικότητα του συστήματος στο σύνολό του.

3. Πυρήνας CUDA

3.1. Μοντέλο ροής

Η αριθμητική αρχιτεκτονική του CUDA βασίζεται στην ιδέαμία ομάδα για ανώνυμα δεδομένα(Πολλαπλά δεδομένα μιας εντολής, SIMD) πολυεπεξεργαστής.

Μπορεί να χρησιμοποιηθεί η έννοια του SIMD, ότι μια εντολή σάς επιτρέπει να συλλέγετε ανώνυμα δεδομένα ταυτόχρονα. Για παράδειγμα, η εντολή addps στον επεξεργαστή Pentium 3 και στα νεότερα μοντέλα Pentium σάς επιτρέπει να προσθέσετε ταυτόχρονα 4 αριθμούς κινητής υποδιαστολής απλής ακρίβειας.

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

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

Κάτω από τη συσκευή (συσκευή), το άρθρο μας έχει έναν λογικό προσαρμογέα βίντεο, ο οποίος υποστηρίζει το πρόγραμμα οδήγησης CUDA ή άλλες εξειδικεύσεις συνημμένων, αναθέσεις για προγράμματα προγραμματισμού που χρησιμοποιούν CUDA (για παράδειγμα, όπως το NVIDIA Tesla). Στο άρθρο μας, μπορούμε να δούμε ότι η GPU μοιάζει λιγότερο με μια λογική κατοχή, μοναδική στις συγκεκριμένες λεπτομέρειες της υλοποίησης.

Ο κεντρικός υπολογιστής (host) είναι το όνομα του προγράμματος στην κύρια λειτουργική μνήμη του υπολογιστή, η υπερισχύουσα CPU και η παράκαμψη των βασικών λειτουργιών του ρομπότ με το συνημμένο.

Στην πραγματικότητα, εκείνο το μέρος του προγράμματός σας που λειτουργεί στη CPU είναιπλήθος, και η κάρτα γραφικών σας -συνημμένο. Λογικά, μπορείτε να εφαρμόσετε ως σύνολο πολυεπεξεργαστών (μικροί 4) συν το πρόγραμμα οδήγησης CUDA.

Ρύζι. 4. Συνημμένο

Ας πούμε ότι θέλουμε να εκτελέσουμε μια διαδικασία σε N νήματα στην επέκτασή μας (γι' αυτό θέλουμε να παραλληλίσουμε το ρομπότ). Όσον αφορά την τεκμηρίωση CUDA, ας ονομάσουμε τη διαδικασία πυρήνα.

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

Ρύζι. 5. Οργάνωση ροών

Στο σχ. 5. ο πυρήνας ορίζεται ως πυρήνας. Όλα τα νήματα που χτυπούν τον πυρήνα συνδυάζονται σε μπλοκ (Block) και τα μπλοκ, από τη φύση τους, συνδυάζονται σε ένα πλέγμα (Grid).

Όπως φαίνεται από το Σχήμα 5, οι δείκτες δύο κόσμων χρησιμοποιούνται για τον προσδιορισμό των ροών. Τα CUDA rozrobnik έχουν δώσει τη δυνατότητα να εργάζονται με ευρετήρια trivum, δύο ή απλούς (μονόκοσμους), ανάλογα με το πόσο εύχρηστος είναι ο προγραμματιστής.

Στον άγριο τύπο, ο δείκτης είναι ασήμαντος από διανύσματα. Για ένα δερματικό νήμα, θα δοθούν τα εξής: ο δείκτης του νήματος στη μέση του μπλοκ threadIdx και ο δείκτης του μπλοκ στη μέση του πλέγματος blockIdx. Κατά την εκκίνηση, όλα τα νήματα θα ανανεωθούν χωρίς άλλα ευρετήρια. Στην πραγματικότητα, μέσω του δείκτη qi, ο προγραμματιστής ελέγχει τον έλεγχο, υποδηλώνοντας ότι ένα μέρος του υποβάλλεται σε επεξεργασία στον ιδρώτα του δέρματος.

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

Ένα μπλοκ εργασιών (ροές) χτυπιέται σε έναν πολυεπεξεργαστή από μέρη ή ομάδες που ονομάζονται warp. Η επέκταση του στημόνι για την τρέχουσα στιγμή σε κάρτες γραφικών από την υποστήριξη CUDA είναι έως και 32 ροές. Οι εντολές στη μέση της πισίνας στημόνι ορίζονται σε στυλ SIMD, δηλαδή. όλα τα νήματα στη μέση ενός στημονιού μπορούν να έχουν μόνο μία εντολή κάθε φορά.

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

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

3.1.1. Αφαλάτωση

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

Ρύζι. 6. Οργάνωση αποσφαλμάτωσης στο SIMD

Έλα στον επόμενο κωδικό:

αν (συνέχεια)ΣΙ;

Στην περίπτωση του SISD (Single Instruction Single Data), ο τελεστής Α αντιστοιχίζεται, επαληθεύεται εκ νέου από το μυαλό, και μετά οι τελεστές Β και D αντιστοιχίζονται (άρα ο νους είναι αληθινός).

Ας έχουμε τώρα 10 ροές που είναι γραμμένες σε στυλ SIMD. Και στις 10 ροές, αποτυγχάνουμε στον τελεστή Α, μετά ελέγχουμε τη νοητική κατάσταση και φαίνεται ότι σε 9 από τις 10 ροές είναι αλήθεια και σε μία ροή είναι κακή.

Συνειδητοποίησα ότι δεν μπορούμε να τρέξουμε 9 νήματα για την εκτέλεση του τελεστή Β και ένα για την εκτέλεση του τελεστή C, επομένως σε μία ώρα μπορεί να εκτελεστεί μόνο μία εντολή για όλα τα νήματα. Είναι απαραίτητο να προσθέσετε σε αυτό το βαπάντκα ως εξής: η κατσαρόλα «χτυπιέται» στο πίσω μέρος του κεφαλιού, έτσι ώστε να καθαριστεί, έτσι ώστε το κρασί να μην έδωσε κανένα φόρο τιμής, και λήφθηκαν 9 ρέματα, τα οποία είχαν μείνει έξω. Ας «οδηγήσουμε» 9 νήματα που νικούν τον τελεστή Β και περάσουμε ένα νήμα με τον τελεστή Γ. Τα επόμενα νήματα συνδυάζονται ξανά και νικούν τον τελεστή D ταυτόχρονα.

Υπάρχει ένα συνολικό αποτέλεσμα: όχι μόνο οι πόροι των επεξεργαστών σπαταλώνται σε άδειες μάχες επανατριβής σε ρέματα που έχουν διακοπεί, τόσο πιο πλούσιοι, θα ντρεπόμαστε ως αποτέλεσμα της ήττας του OBIGI gіlki.

Ωστόσο, δεν είναι όλα τόσο άσχημα, όπως μπορείτε να δείτε με την πρώτη ματιά. Στο μεγάλο πλεονέκτημα της τεχνολογίας, μπορείτε να δείτε εκείνα που επικεντρώνονται στη δυναμική οδήγηση του προγράμματος οδήγησης CUDA και για τον προγραμματιστή, η δυσοσμία είναι ξεκάθαρη. Ταυτόχρονα, τρέχοντας με εντολές SSE από σύγχρονες CPU (απλώς δοκιμάστε 4 αντίγραφα του αλγόριθμου ταυτόχρονα), ο ίδιος ο προγραμματιστής φταίει για τις λεπτομέρειες: συνδυάστε δεδομένα κατά τέσσερα, μην ξεχάσετε τον έλεγχο και ξεκινήστε να γράφετε σε χαμηλό επίπεδο, μάλιστα, όπως στο assembler.

Από το μουστάκι του προαναφερόμενου κλαψούρισμα ένας ακόμα σεβαστός visnovok. Το Razgaluzhennya είναι ο λόγος για την πτώση της παραγωγικότητας από ισχυρές δυνάμεις. Shkidlivimi є λιγότερο από tі razgaluzhennya, στο οποίο τα ρεύματα αποκλίνουν στη μέση μιας δεξαμενής ρεμάτων στημονιού. Σε ορισμένες περιπτώσεις, οι ροές έχουν εξαπλωθεί στη μέση ενός μπλοκ, αλλά σε διαφορετικές δεξαμενές στημονιού ή στη μέση διαφορετικών μπλοκ, χωρίς να προκαλούν κανένα αποτέλεσμα.

3.1.2. Αλληλεπίδραση μεταξύ ροών

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

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

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

3.2. Μνήμη

Το CUDA έχει έξι τύπους μνήμης (Εικ. 7). Εγγραφή Ce, τοπική, καθολική, κατανεμημένη, σταθερή και υφή μνήμη.

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

Ρύζι. 7. Δείτε τη μνήμη του CUDA

3.2.0. Αρχείο

Όσο μπορεί, ο μεταγλωττιστής προσπαθεί να τοποθετήσει όλες τις τοπικά αλλαγμένες συναρτήσεις σε καταχωρητές. Η πρόσβαση σε τέτοιες αλλαγές περιορίζεται στη μέγιστη ταχύτητα. Η αρχιτεκτονική ροής διαθέτει 8192 καταχωρητές 32-bit διαθέσιμους ανά πολυεπεξεργαστή. Για να προσδιορίσετε πόσοι καταχωρητές είναι διαθέσιμοι για ένα νήμα, πρέπει να διαιρέσετε τον αριθμό (8192) ανά μέγεθος μπλοκ (αριθμός νημάτων για ένα νέο).

Με έναν αρκετά μεγάλο αριθμό 64 ροών, συνολικά 128 μητρώα θα εισέλθουν στο μπλοκ (υπάρχουν κάποια αντικειμενικά κριτήρια, αλλά 64 θα πρέπει να βρίσκονται στη μέση για πλούσιες θέσεις εργασίας). Πραγματικά, 128 καταχωρητές nvcc δεν φαίνονται καθόλου. Καλέστε το VIN, μην δώσετε περισσότερα από 40, αλλά διαγράψτε τα αλλαγμένα στην τοπική μνήμη. Φαίνεται λοιπόν ότι σε έναν πολυεπεξεργαστή μπορεί να κερδηθεί μια σειρά μπλοκ. Ο μεταγλωττιστής θα προσπαθήσει να μεγιστοποιήσει τον αριθμό των μπλοκ που μπορούν να υποστούν επεξεργασία ταυτόχρονα. Για μεγαλύτερη αποτελεσματικότητα, πρέπει να πάρετε λιγότερους από 32 καταχωρητές. Στη συνέχεια, θεωρητικά, μπορείτε να εκτελέσετε 4 μπλοκ (8 warp-іv, άρα 64 νήματα σε ένα μπλοκ) σε έναν πολυεπεξεργαστή. Ωστόσο, εδώ είναι πιο σημαντικό να φροντίσετε την κοινόχρηστη μνήμη που είναι απασχολημένη με νήματα, καθώς ένα μπλοκ καταλαμβάνει όλη τη μνήμη που μοιράζεται, δύο τέτοια μπλοκ δεν μπορούν να καταληφθούν από τον πολυεπεξεργαστή ταυτόχρονα.

3.2.1. Τοπική μνήμη

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

Φυσικά, η τοπική μνήμη είναι ανάλογο της παγκόσμιας μνήμης και λειτουργεί με tієyu και swidkіst. Τη στιγμή της συγγραφής του άρθρου, δεν υπήρχαν γνωστοί μηχανισμοί που θα επέτρεπαν τη ρητή ανάκτηση του μεταγλωττιστή χρησιμοποιώντας τοπική μνήμη για συγκεκριμένες αλλαγές. Είναι σημαντικό να ελέγξετε την τοπική μνήμη, αντί να vikoristovuvat її zovsіm (τμήμα 4 «Προτάσεις για βελτιστοποίηση»).

3.2.2. καθολική μνήμη

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

Προστατευτείτε για την ευελιξία σε στιγμές που πρέπει να κλάψετε swidkistyu. Η παγκόσμια μνήμη δεν αποθηκεύεται προσωρινά. Vaughn pratsyuє ακόμα πιο povіlno, kіlkіst zvernenі στην παγκόσμια μνήμη sіd ανά πάσα στιγμή minimaluvati.

Η συνολική μνήμη είναι απαραίτητη για την αποθήκευση των αποτελεσμάτων ρομποτικών προγραμμάτων πριν από την επεξεργασία τους στον κεντρικό υπολογιστή (στην προεπιλεγμένη μνήμη DRAM). Ο λόγος για αυτό είναι ότι η μνήμη είναι παγκόσμια - το μόνο είδος μνήμης που μπορεί να εγγραφεί.

Αλλαγές, που εκφράζονται με το χαρακτηρισμό __global__, τοποθετούνται στη μνήμη του κόσμου. Η καθολική μνήμη μπορεί επίσης να προβληθεί δυναμικά καλώντας τη συνάρτηση cudaMalloc(void* mem, int size) στον κεντρικό υπολογιστή. Θα προσθέσω αυτή τη λειτουργία, δεν είναι δυνατόν να την καλέσετε. Ακούγεται ότι το κεντρικό πρόγραμμα μπορεί να φροντίσει τη μνήμη, τι λειτουργεί στη CPU. Μπορείτε να παρακάμψετε τα δεδομένα από τον κεντρικό υπολογιστή κάνοντας κλικ στη συνάρτηση cudaMemcpy:

cudaMemcpy(void* gpu_mem, void* cpu_mem, int size, cudaMemcpyHostToDevice);

Έτσι, μπορείτε να ξεκινήσετε μόνοι σας την αντίστροφη διαδικασία:

cudaMemcpy(void* cpu_mem, void* gpu_mem, int size, cudaMemcpyDeviceToHost);

Αυτό το wiki λειτουργεί επίσης από τον κεντρικό υπολογιστή.

Όταν εργάζεστε με την παγκόσμια μνήμη, είναι σημαντικό να θυμάστε τους κανόνες συνένωσης. Η κύρια ιδέα είναι ότι το τρίτο μέρος της μνήμης αποθηκεύεται μέχρι την τελευταία μεσαία μνήμη, επιπλέον, 4,8 ή 16 byte. Με αυτό, το πρώτο νήμα είναι ένοχο για ζάπινγκ για τη διεύθυνση, δονώντας στο κορδόνι, προφανώς 4,8 ή 16 byte. Οι διευθύνσεις που εναλλάσσονται από το cudaMalloc είναι τουλάχιστον 256 byte κατά μήκος των συνόρων.

3.2.3. Θυμηθείτε τι χωρίζεται

Η μνήμη που διαιρείται δεν είναι προσωρινή, αλλά η μνήμη είναι γρήγορη. Її Συνιστάται να κάνετε vicorate ως έλεγχος προσωρινής μνήμης. Διατίθενται συνολικά 16 KB κοινόχρηστης μνήμης ανά πολυεπεξεργαστή. Διαιρώντας τον αριθμό με τον αριθμό των ημερών στο μπλοκ, παίρνουμε τη μέγιστη ποσότητα μνήμης που διαιρείται, διαθέσιμη για μία ροή (καθώς σχεδιάζεται να την κερδίσουμε ανεξάρτητα από όλες τις ροές).

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

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

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

shared_float mem_shared;

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

float x = mem_shared;

De threadIdx.x – δείκτης x του νήματος στη μέση του μπλοκ.

3.2.4. Σταθερή μνήμη

Η σταθερή μνήμη αποθηκεύεται στην κρυφή μνήμη, όπως φαίνεται στην Εικ. 4. Η κρυφή μνήμη χρησιμοποιείται σε μία μόνο παρουσία ενός πολυεπεξεργαστή, η οποία είναι επίσης η κύρια εργασία του μεσαίου μπλοκ. Στον κεντρικό υπολογιστή, μπορείτε να γράψετε σε σταθερή μνήμη καλώντας τη συνάρτηση cudaMemcpyToSymbol. Θα προσθέσω μια σταθερή μνήμη που είναι διαθέσιμη μόνο για ανάγνωση.

Η σταθερή μνήμη είναι πιο βολική για το vikoristan. Μπορείτε να rozmіschuvati in niy danі είναι-τι τύπος που διαβάζετε їх για τη βοήθεια της απλής έλξης.

#define N 100

Constant__int gpu_buffer[N];

void host_function()

int cpu_buffer[N];

cudaMemcpyToSymbol(gpu_buffer, cpu_buffer, sizeof(int )*N);

// __global__ σημαίνει ότι το device_kernel είναι ένας πυρήνας, επομένως μπορεί να εκτελεστεί σε μια GPU

Global__void device_kernel()

int a = gpu_buffer;

int b = gpu_buffer + gpu_buffer;

// gpu_buffer = a; ΚΟΜΜΑ! Η σταθερή μνήμη είναι διαθέσιμη μόνο για ανάγνωση

Δεδομένου ότι η κρυφή μνήμη χρησιμοποιείται για σταθερή μνήμη, η πρόσβαση σε αυτήν είναι ασφαλής. Η μόνη, αλλά ακόμα μεγάλη, μικρή ποσότητα σταθερής μνήμης είναι το γεγονός ότι γίνεται λιγότερο από 64 Kbyte (για ολόκληρο το συνημμένο). Γιατί είναι τόσο προφανές ότι στη μνήμη συμφραζομένων είναι λογικό να αποθηκεύουμε μόνο έναν μικρό αριθμό δεδομένων που είναι συχνά νικηφόρα.

3.2.5. Μνήμη υφής

Η μνήμη υφής αποθηκεύεται στην κρυφή μνήμη (Εικ. 4). Για έναν πολυεπεξεργαστή δέρματος, υπάρχει μόνο μία κρυφή μνήμη, επομένως ολόκληρη η κρυφή μνήμη είναι η μεγαλύτερη για ολόκληρο το μεσαίο μπλοκ.

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

    shvidka vibirka τιμή ενός σταθερού rozmіru (byte, λέξη, subwiyne ή τέσσερις λέξεις) από έναν πίνακα ενός ή δύο κόσμων.

    κανονικοποιημένη διευθυνσιοδότηση με αριθμούς float σε διαστήματα. Potim їх είναι δυνατό να επιλέξετε, vikoristuuuu normalіzovanu απευθυνόμενοι. Η τιμή που προκύπτει θα είναι μια λέξη τύπου float4, με ένα διάστημα ;

    CudaMalloc((void**) &gpu_memory, N*sizeof (uint4 )); //προφανώς η μνήμη της GPU

    // Προσαρμογή παραμέτρων δέντρου υφής

    Texture.addressMode = cudaAddressModeWrap; //τρόπος Κάλυμμα

    Texture.addressMode = cudaAddressModeWrap;

    Texture.filterMode = cudaFilterModePoint; //πλησιέστερη τιμή

    texture.normalized = ψευδής; // μην στρίβετε την κανονικοποιημένη διευθυνσιοδότηση

    CudaBindTexture(0, texture, gpu_memory, N ) // ας αλλάξουμε τη μνήμη σε υφή

    cudaMemcpy(gpu_memory, cpu_buffer, N*sizeof(ενότητα 4), cudaMemcpyHostToDevice ); // αντιγραφή δεδομένων σεGPU

    // __global__ σημαίνει ότι το device_kernel είναι ένας πυρήνας, επομένως πρέπει να παραλληλιστεί

    Global__void device_kernel()

    uint4 a = tex1Dfetch(υφή,0); // μπορείτε να επιλέξετε περισσότερα δεδομένα με αυτόν τον τρόπο!

    uint4 b = tex1Dfetch(υφή,1);

    int c = a.x*b.y;

    ...

    3.3. Απλός πισινός

    Ως απλό άκρο, προτείνεται να ρίξετε μια ματιά στο πρόγραμμα cppIntegration από το CUDA SDK. Ο Vaughn παρουσιάζει τη ροή εργασιών CUDA, καθώς και την έκδοση nvcc (ειδικός μεταγλωττιστής C++ για Nvidia) του MS Visual Studio, που θα απλοποιήσει την ανάπτυξη προγραμμάτων στο CUDA.

    4.1. Εκτελέστε σωστά την ήττα του αφεντικού σας

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

    4.2. Επιλέξτε τύπο μνήμης

    Τοποθετήστε τα δεδομένα σας σε υφή ή σταθερή μνήμη, έτσι ώστε όλες οι εργασίες ενός μπλοκ να μετατρέπονται σε μία υποδοχή μνήμης ή κοντά σε στοιβαγμένες υποδοχές. Τα δύο δεδομένα μπορούν να υποστούν αποτελεσματική επεξεργασία χρησιμοποιώντας πρόσθετες λειτουργίες text2Dfetch και text2D. Η μνήμη υφής είναι ειδικά βελτιστοποιημένη για δύο κόσμους.

    Κατακτήστε την παγκόσμια μνήμη από τη χωρισμένη μνήμη, καθώς όλες οι εργασίες κατανέμονται μη συστηματικά σε διαφορετικές, εκτεταμένες τοποθεσίες μιας μνήμης (με διαφορετικές διευθύνσεις ή συντεταγμένες, όπως δεδομένα 2D / 3D).

    παγκόσμια μνήμη => μνήμη που διαιρείται

    syncthreads();

    Συλλέξτε δεδομένα στη μνήμη

    syncthreads();

    καθολική μνήμη<= разделяемая память

    4.3. Θυμίστε τα λίχνικα της μνήμης

    Η σημαία του μεταγλωττιστή --ptxas-options=-v σας επιτρέπει να πείτε ακριβώς ποιες λέξεις και ποια μνήμη (μητρώα, ποια είναι κατανεμημένα, τοπικά, σταθερά) στο victorist. Καθώς ο μεταγλωττιστής χρησιμοποιεί τοπική μνήμη, το γνωρίζετε. Η ανάλυση των δεδομένων σχετικά με τον αριθμό και τους τύπους μνήμης που κερδίζουν μπορεί να σας βοηθήσει πολύ στη βελτιστοποίηση του προγράμματος.

    4.4. Προσπαθήστε να ελαχιστοποιήσετε τον αριθμό των καταχωρήσεων και των μνημών που μοιράζονται

    Όσο μεγαλύτερος είναι ο πυρήνας του καταχωρητή warp ή η μνήμη που διαιρείται, τόσο λιγότερες ροές (πρωτεύον warp-iv) μπορούν να κερδίσουν ταυτόχρονα στον πολυεπεξεργαστή, επειδή ανταλλάσσονται πόροι του πολυεπεξεργαστή. Επομένως, μια μικρή αύξηση της πληρότητας των καταχωρητών, αλλά οι μνήμες που επεκτείνονται, μπορεί να οδηγήσει σε μείωση της παραγωγικότητας κατά δύο φορές - μέσω αυτών που είναι τώρα ακόμη και δύο φορές λιγότερο warp-iv ταυτόχρονα σε έναν πολυεπεξεργαστή .

    4.5. Η μνήμη των μοιρασμένων, ο τοπικός βουλευτής.

    Σαν να προκάλεσε ο μεταγλωττιστής Nvidia την απώλεια των δεδομένων στην τοπική μνήμη 'yat, scho razdelyaetsya (κοινή μνήμη).

    Τις περισσότερες φορές ο μεταγλωττιστής μπορεί να αλλάξει στην τοπική μνήμη, καθώς δεν θα συλληφθεί πολύ συχνά. Για παράδειγμα, η μπαταρία είναι devi συσσωρεύει τιμές, rozrakhovuyuschos s tsiklі. Όπως ένας εξαιρετικός κύκλος για τον κώδικα obsyagi (αν και όχι για μια ώρα vykonannya!), ο μεταγλωττιστής μπορεί να τοποθετήσει την μπαταρία σας στην τοπική μνήμη, tk. Vіn vykoristovuєtsya πολύ σπάνια, και τα μητρώα είναι λίγα. Το κόστος της παραγωγικότητας κατά καιρούς μπορεί να είναι σημαντικό.

    Λοιπόν, αν πραγματικά σπάνια το αλλάζετε νικητές - καλύτερα να το τοποθετήσετε στην παγκόσμια μνήμη.

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

    4.6. Κύκλοι στερέωσης

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

    Ο άξονας είναι το πώς είναι δυνατόν να ανοίξει ο κύκλος νοημάτων πίνακας sumi (για παράδειγμα, ολόκληρος):

    int a[N]; intsum;

    για (int i=0;i

    Zrozumilo, οι κύκλοι μπορούν να πυροδοτηθούν και χειροκίνητα (όπως φαίνεται παραπάνω), αλλά η πρακτική είναι αντιπαραγωγική. Είναι καλύτερα να τροποποιήσετε τα πρότυπα C++ για περισσότερες λειτουργίες που πρέπει να γνωρίζετε.

    πρότυπο

    κλάση ArraySumm

    Device__ static T exec (const T * arr) ( return arr + ArraySumm (arr+1); )

    πρότυπο

    κλάση ArraySumm<0,T>

    Device__ static T exec(const T* arr) ( return 0; )

    για (int i=0;i

    summ+= ArraySumm<4,int>::exec(a);

    Ορίστε ένα τικ ως χαρακτηριστικό του μεταγλωττιστή nvcc. Ο μεταγλωττιστής θα πρέπει πάντα να επιτρέπει το κλείσιμο συναρτήσεων του τύπου __συσκευή__ (για να είστε σίγουροι, χρησιμοποιήστε την ειδική οδηγία __noinline__).

    Otzhe, μπορείς να εμπνευστείς από το γεγονός ότι ο πισινός, παρόμοιος με τον μυτερό, φουντώνει με μια απλή ακολουθία τελεστών, και γιατί όχι να ενεργήσεις για την αποτελεσματικότητα του κώδικα γραμμένου με το χέρι. Ωστόσο, για έναν άγριο τύπο (όχι nvcc) δεν είναι δυνατό για κανέναν να έχει ένα booty, επειδή το inline δεν είναι άλλο από μια είσοδος ενός μεταγλωττιστή και μπορείτε να το αγνοήσετε. Δεν είναι εγγυημένο ότι οι λειτουργίες σας θα αποκατασταθούν.

    4.7. Περιηγηθείτε στα δεδομένα και επιλέξτε 16 byte

    Περιηγηθείτε στις δομές δεδομένων κατά κλοιό 16 byte. Σε αυτήν την περίπτωση, ο μεταγλωττιστής μπορεί να πάρει ειδικές οδηγίες για αυτά, ώστε να μπορούν να συλλέξουν τον όγκο των δεδομένων μία φορά 16 byte το καθένα.

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

    4.8. Τραπεζικές συγκρούσεις στη μνήμη, οι οποίες χωρίζονται

    Η μνήμη που διανέμεται είναι οργανωμένη σε 16 (συνολικά!) τράπεζες μνήμης με croc 4 byte. Για μια ώρα, η δεξαμενή των νημάτων στημόνι σε έναν πολυεπεξεργαστή χωρίζεται σε δύο μισά (όπως warp-size = 32) των 16 νημάτων το καθένα, που επιτρέπει την πρόσβαση στη μνήμη μέσω κάρτας.

    Οι εργασίες στα διαφορετικά μισά του στημονιού δεν έρχονται σε σύγκρουση με τις αναμνήσεις που χωρίζονται. Μέσω του zavdannya τα μισά του στημονιού θα μειωθούν στις ίδιες τράπεζες μνήμης, κατηγορώντας την κατάρρευση και, ως αποτέλεσμα, την πτώση της παραγωγικότητας. Zavdannya στα όρια του ενός μισού του στημονιού μπορεί να μεγαλώσει σε διαφορετικά χωριά μνήμης, τα οποία χωρίζονται, με ένα τραγούδι croc.

    Το βέλτιστο μέγεθος είναι 4, 12, 28, ..., 2 n-4 byte (Εικ. 8).

    Ρύζι. 8. Βέλτιστη εφαρμογή.

    Το Chi δεν είναι το βέλτιστο μέγεθος - 1, 8, 16, 32, ..., 2^n byte (Εικ. 9).

    Ρύζι. 9. Υποβέλτιστη εφαρμογή

    4.9. Ελαχιστοποίηση μετακίνησης δεδομένων Host<=>συσκευή

    Προσπαθήστε να μεταφέρετε τα ενδιάμεσα αποτελέσματα στον κεντρικό υπολογιστή για επεξεργασία για επιπλέον CPU. Εάν δεν εφαρμόσετε ολόκληρο τον αλγόριθμο, τότε πάρτε μέρος από το κύριο μέρος της GPU, αφήνοντας την CPU με λιγότερη εργασία.

    5. Φορητή βιβλιοθήκη μαθηματικών CPU/GPU

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

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

    6 . Βιβλιογραφία

      Κρις Κάσπερσκι. Τεχνική βελτιστοποίησης προγράμματος. Αποτελεσματική ανάκτηση μνήμης. - Αγία Πετρούπολη: BHV-Petersburg, 2003. - 464 σελ.: il.

      Οδηγός προγραμματισμού CUDA 1.1 ( http://developer.download.nvidia.com/compute/cuda/1_1/NVIDIA_CUDA_Programming_Guide_1.1.pdf )

      Οδηγός προγραμματισμού CUDA 1.1. σελίδα 14-15

      Οδηγός προγραμματισμού CUDA 1.1. σελίδα 48

    Από τη δαρβινική θεωρία της εξέλιξης, η πρώτη ανθρώπινη μάβπα (όπως
    buti για την ακρίβεια - homo antecessor, person-perepadnik) προσποιήθηκε ότι ήταν θεός
    έχουμε. Κέντρα μέτρησης Bagatoton με χίλιους και περισσότερους λαμπτήρες ραδιοφώνου,
    τι καταλαμβάνει τα τείχη της πόλης, άλλαξε με νότες pivkilogram, yaki, στην ομιλία,
    μην θυσιάσετε πρώτα την παραγωγικότητα. Οι μηχανές ντρούκαρ πριν από την κατακλυσμό έχουν αλλάξει
    για άλλους, είναι πάντα καλό για αυτό που είναι καλό (πλοήγηση στο σώμα ενός ατόμου)
    πλούσια λειτουργικά βοηθητικά κτίρια. Οι επεξεργαστές Giganti raptom αποφάσισαν να κάνουν wall up
    ο γραφικός πυρήνας της «πέτρας». Και οι κάρτες γραφικών άρχισαν όχι μόνο να δείχνουν μια εικόνα
    αποδεχτείτε το FPS και την ποιότητα των γραφικών, αλλά πραγματοποιήστε και όλους τους υπολογισμούς. Έτσι
    περισσότερη δουλειά! Σχετικά με την τεχνολογία του rich streaming, υπολογίστε την με τη βοήθεια GPU, και θα αναφερθεί.

    Γιατί GPU;

    Τσικάβο γιατί μετέφεραν στο γραφικό όλο το counting mіts
    προσαρμογέας? Όπως μπορείτε να δείτε, ο επεξεργαστής είναι στη μόδα και είναι απίθανο να εγκαταλείψει τη ζεστασιά του
    Μιστέχκο. Ale, η GPU έχει ένα ζευγάρι koziriv στο μανίκι ταυτόχρονα με ένα τζόκερ, αυτό το μανίκι
    vistachaє. Σύγχρονος κεντρικός επεξεργαστής φυλάκισης για περιορισμό του μέγιστου
    παραγωγικότητα κατά την επεξεργασία ακτινωτών δεδομένων και δεδομένων με αιώρηση
    Κώμη, ειδικά χωρίς να παρεμβαίνει σε οποιαδήποτε παράλληλη επεξεργασία πληροφοριών. Ιδιο
    μια ώρα η αρχιτεκτονική της κάρτας βίντεο επιτρέπει γρήγορο και χωρίς προβλήματα "παραλληλισμό"
    συλλογή δεδομένων. Από τη μία πλευρά, υπάρχει η εμφάνιση πολυγώνων (για το πλαίσιο 3D-μεταφορέα),
    z іnshoy – επεξεργασία υφών με pixel. Φαίνεται ότι είναι «ευτυχισμένο
    ανάλυση» στον πυρήνα της κάρτας. Επιπλέον, το ρομπότ μνήμης και ο επεξεργαστής βίντεο
    βέλτιστος, κάτω σύνδεσμος "RAM-cache-επεξεργαστής". Εκείνη τη στιγμή, αν είσαι μόνος
    Οι κάρτες γραφικών αρχίζουν να μετατρέπονται από έναν επεξεργαστή ροής GPU, διαφορετικά
    Η μοναξιά μπλέκεται ταυτόχρονα σε μια άλλη και, καταρχήν, μπορεί εύκολα να την προσεγγίσεις
    την αποτελεσματικότητα του επεξεργαστή γραφικών, σε συνδυασμό με την κατασκευή του διαύλου,
    Ωστόσο, για αυτόν τον μεταφορέα vantazhennya μπορεί
    κάθε είδους έξυπνες μεταβάσεις και razgaluzhen. ο κεντρικός επεξεργαστής μέσω του
    ευελιξία για τις δικές σας ανάγκες επεξεργαστή, κρυφή μνήμη, αποθήκευση
    πληροφορίες.

    Vchenі cholovіki zamyslilis schodo roboti GPU σε παράλληλους υπολογισμούς που
    Οι μαθηματικοί έχουν αναπτύξει μια θεωρία ότι υπάρχουν πολλές επιστημονικές έρευνες με πολλούς τρόπους παρόμοιους
    επεξεργασία τρισδιάστατων γραφικών. Πολλοί ειδικοί εξετάζουν ποιος είναι ο κύριος παράγοντας
    ανάπτυξη GPGPU (Υπολογισμός γενικού σκοπού σε GPU – καθολική
    rozrahunki με τη βοήθεια μιας κάρτας βίντεο
    ) εισήχθη το 2003 στο έργο Brook GPU.

    Οι δημιουργοί του έργου από το Πανεπιστήμιο του Στάνφορντ πέρασαν δύσκολες στιγμές
    Πρόβλημα: υλικό και λογισμικό zmusiti δόνηση προσαρμογέα γραφικών
    διάφορα σχέδια. μυρίζω veyshlo. Vikoristovuyuchi universal mov C,
    Αμερικανοί επιστήμονες zmusili pratsyuvati GPU σαν επεξεργαστής, προσαρμοσμένο για
    παράλληλη κοπή. Αφού ο Μπρουκ παρουσίασε μια ολόκληρη σειρά έργων για έργα VGA,
    όπως η βιβλιοθήκη Accelerator, η βιβλιοθήκη Brahma, το σύστημα
    μεταπρογραμματισμός GPU++ και άλλα.

    CUDA!

    Η αντίληψη για τις προοπτικές της εξέλιξης ήταν ενοχλητική AMDі NVIDIA
    μπείτε στη GPU του Brook σαν πίτμπουλ. Εάν παραλείψετε την πολιτική μάρκετινγκ, τότε
    Έχοντας εφαρμόσει τα πάντα σωστά, μπορείτε να κλείσετε τουλάχιστον στον τομέα των γραφικών
    αγορά, και ου στο μέτρημα (θαυμάστε τις ειδικές κάρτες μέτρησης που
    διακομιστές Teslaμε εκατοντάδες πολυεπεξεργαστές), αλλάζοντας τα ονόματα όλων των CPU.

    Zvichayno, οι "FPS Volodymyrs" ανέβηκαν στην πέτρα του δέρματος σκοντάφτοντας για τους δικούς τους.
    ράμματα, αλλά η κύρια αρχή έχει γίνει αμετάβλητη - εκτελέστε τον υπολογισμό
    από την GPU. Ας ρίξουμε μια ματιά στην «πράσινη» τεχνολογία αμέσως. CUDA
    (Υπολογισμός Ενοποιημένης Αρχιτεκτονικής Συσκευών).

    Το ρομπότ της «ηρωίδας» μας εργάζεται στο ασφαλές API, επιπλέον, μία για δύο.
    Το πρώτο είναι high-core, CUDA Runtime, με λειτουργίες, όπως
    περισσότερες απλές ισοτιμίες αναλύονται και μεταφέρονται στο κατώτερο API - CUDA Driver. Έτσι
    ότι η φράση «πολύ αξιόπιστη» είναι στάσιμη σε μεγάλο βαθμό. Όλη η δύναμη να ξέρεις
    στον οδηγό και λάβετε її για να βοηθήσετε τις βιβλιοθήκες, που δημιουργήθηκαν ευγενικά
    λιανοπωλητές NVIDIA: CUBLAS
    FFT (εξερεύνηση της εμφάνισης του αλγορίθμου Fur'e). Λοιπόν, ας περάσουμε στο πρακτικό
    μέρη του υλικού.

    Ορολογία CUDA

    NVIDIAΛειτουργεί με τις δικές του αναθέσεις για το CUDA API. πονγκ
    v_dr_znyayutsya vіd vyznachen, scho zastosovuyutsya να συνεργαστεί με τον κεντρικό επεξεργαστή.

    Potik (νήμα)- Συλλέξτε δεδομένα, τα οποία είναι απαραίτητα για τη συλλογή (όχι
    Vymagaє μεγάλη resursіv pіd ώρα orobki).

    στημόνι- Ομάδα 32 ροών. Τα δεδομένα συλλέγονται μόνο
    warps, aka warp - τα ελάχιστα δεδομένα obsyag.

    ΟΙΚΟΔΟΜΙΚΟ ΤΕΤΡΑΓΩΝΟ- Ροές Sukupnіst (vіd 64 έως 512) ή sukupnіst
    warpiv (τύπος 2 έως 16).

    Sitka (πλέγμα)- Tse sukupnіst blokіv. Ένα τέτοιο podіl danih
    zastosovuєtsya vikljuchno podvischennya παραγωγικότητα. Λοιπόν, ποιος είναι ο αριθμός
    ο πολυεπεξεργαστής είναι μεγάλος, τότε τα μπλοκ συνενώνονται παράλληλα. Yakscho w
    δεν γλίτωσε την κάρτα (συνιστούμε στους λιανοπωλητές για διπλωμένα τριαντάφυλλα
    ο προσαρμογέας δεν είναι χαμηλότερος από τον GeForce 8800 (GTS 320 MB), στη συνέχεια γίνεται επεξεργασία των μπλοκ δεδομένων
    διαδοχικά.

    Επίσης η NVIDIA εισάγει τόσο κατανοητό, όπως πυρήνας, οικοδεσπότης (οικοδεσπότης)
    і συσκευή.

    Pratsyuemo!

    Για γενική εργασία με CUDA, χρειάζεστε:

    1. Γνωρίστε τη φύση των πυρήνων shader της GPU, τα θραύσματα είναι η ουσία του προγραμματισμού
    pogaє έχουν ίσες rozpodіlі navantazhennya μεταξύ τους.
    2. Να προγραμματίσετε τη μέση του C, να διορθώσετε ορισμένες πτυχές.

    Ροζρομπνίκι NVIDIAέσπασε τα «γεμίσματα» της κάρτας βίντεο kіlka
    αλλιως κατω μι λεγεται μπαχιτι. Γιατί λοιπόν δεν θέλεις να τύχει να δεις τα πάντα
    λεπτή αρχιτεκτονική. Ο Rozberemo Budov «πέτρα» G80 θρυλικός GeForce 8800
    GTX
    .

    Ο πυρήνας shader αποτελείται από οκτώ συμπλέγματα TPC (Texture Processor Cluster)
    επεξεργαστές υφής (για παράδειγμα, GeForce GTX 280- 15 πυρήνες 8800 GTS
    їх έξι, υ 8600 - Χωτήρι κ.λπ.). Ti, στην καρδιά σου, αθροίσεις στα δύο
    ροή πολλαπλών επεξεργαστών (streaming multiprocessor - far SM). SM (έξι συνολικά
    16) διπλωμένο από το μπροστινό άκρο (το έργο της ανάγνωσης και αποκωδικοποίησης οδηγιών) και
    πίσω άκρο (τέλος οδηγιών) αγωγών, καθώς και οκτώ βαθμωτές SP (shader
    επεξεργαστή) και δύο SFU (Super Functional Units). Για τον παλμό του δέρματος (μονό
    ώρα) μπροστινό τέλος επιλέξτε warp και κάντε γιόγκα. Shchob usі στημόνι ροές
    (υποθέτω, їх 32 τεμάχια) αποδείχθηκε, χρειάζονται 32/8 = 4 κύκλοι στο τέλος του αγωγού.

    Ένας δερμάτινος πολυεπεξεργαστής μπορεί να ονομαστεί κοινόχρηστη μνήμη.
    Її επέκταση για να γίνει 16 kilobyte και να δώσει στον προγραμματιστή πλήρη ελευθερία
    diy. Razpodіlya γιακ θέλετε :). Η κοινόχρηστη μνήμη προστατεύει τις κλήσεις ροής
    ένα μπλοκ δεν αναγνωρίζεται για εργασία με σκίαστρες εικονοστοιχείων.

    Επίσης το SM μπορεί να μετατραπεί σε GDDR. Για τον οποίο «έραψαν» 8 kilobyte
    μνήμη cache, η οποία αποθηκεύει όλους τους τίτλους για ρομπότ (για παράδειγμα, απαρίθμηση
    σταθερές).

    Πολυεπεξεργαστής max 8192 καταχωρητές. Ο αριθμός των ενεργών μπλοκ δεν μπορεί να είναι
    περισσότερα από οκτώ, και ο αριθμός των στημονιών - όχι περισσότερο από 768/32 = 24. Μπορεί να φανεί ότι το G80
    Μπορείτε να επεξεργαστείτε το πολύ 32*16*24 = 12.288 ροές ανά ώρα. Δεν γίνεται
    διορθώστε αυτά τα στοιχεία κατά τη βελτιστοποίηση του προγράμματος nadal (σε ένα μπολ vag
    - Μπλοκ Razmіr, στο іnshiy - αριθμός ροών). Η ισορροπία των παραμέτρων μπορεί να αλλάξει
    δόθηκε σημαντικός ρόλος σε αυτό NVIDIAπροτείνουμε τετράγωνα βίκοριζων
    sі 128 ή 256 ροές. Το Block z 512 flows είναι αναποτελεσματικό, τα θραύσματα μπορούν
    κινούμενα ζατρίμς. Vrakhovuychi όλες οι λεπτές κάρτες γραφικών GPU συν
    κακές δεξιότητες προγραμματισμού, μπορείτε να δημιουργήσετε πιο παραγωγικές
    zasib για παράλληλους υπολογισμούς. Πριν από την ομιλία, σχετικά με τον προγραμματισμό ...

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

    Για "δημιουργικότητα" με τη μία από το CUDA, είναι απαραίτητο Η κάρτα γραφικών GeForce δεν είναι χαμηλότερη
    όγδοη σειρά
    . W

    Ο επίσημος ιστότοπος χρειάζεται τρία πακέτα λογισμικού: το πρόγραμμα οδήγησης
    υποστήριξη CUDA (για λειτουργικό σύστημα δέρματος - δικό του) χωρίς ενδιάμεσο πακέτο CUDA SDK (άλλο
    έκδοση beta) και πρόσθετες βιβλιοθήκες (εργαλειοθήκη CUDA). Τεχνολογική υποστήριξη
    Λειτουργικά συστήματα Windows (XP και Vista), Linux και Mac OS X.
    επιλέγοντας Vista Ultimate Edition x64 (θα πω ότι το σύστημα ήταν
    απλά φανταστικό). Κατά τη στιγμή της σύνταξης, αυτές οι σειρές είναι σχετικές με τα ρομπότ
    Πρόγραμμα οδήγησης για ForceWare 177.35. Σαν ένα σετ εργαλείων βικορίστ
    πακέτο λογισμικού Borland C++ 6 Builder
    το δικό μου Γ).

    Οι άνθρωποι, όπως ξέρω, είναι εύκολο να συνηθίσουν σε ένα νέο περιβάλλον. Λιγότερο απαραίτητο
    απομνημονεύστε τις κύριες παραμέτρους. _global_ λέξη-κλειδί (πριν από τη συνάρτηση)
    Δείχνει ότι η συνάρτηση πρέπει να βρίσκεται πριν από τον πυρήνα. ї viklikatime κεντρικό
    επεξεργαστή και ολόκληρο το ρομπότ θα βρίσκεται στη GPU. Το Wiklik _global_ κάνει περισσότερα
    συγκεκριμένες λεπτομέρειες, αλλά η επέκταση του ίδιου του δικτύου, η επέκταση του μπλοκ και του πυρήνα θα είναι
    κολλημένος. Για παράδειγμα, η σειρά _global_ void saxpy_parallel<<>>, de X –
    μέγεθος του πλέγματος και Y - μέγεθος του μπλοκ, το οποίο καθορίζει τον αριθμό των παραμέτρων.

    Το σύμβολο _συσκευή_ σημαίνει ότι η συνάρτηση καλείται από τον πυρήνα γραφικών, αλλά
    ακολουθήστε αυτές τις οδηγίες. Αυτή η λειτουργία είναι αποθηκευμένη στη μνήμη του πολυεπεξεργαστή,
    otzhe, otrimati її διεύθυνση είναι αδύνατη. Το πρόθεμα _host_ σημαίνει ότι το wiki είναι
    ότι obrobka περνούν λιγότερο για τη μοίρα της CPU. Είναι απαραίτητο να εγγυηθούμε για αυτό που _global_ i
    Η _συσκευή_ δεν μπορεί να καλέσει ένα από ένα και δεν μπορεί να καλέσει τον εαυτό του.

    Επίσης, η γλώσσα για CUDA μπορεί να έχει χαμηλές λειτουργίες για εργασία με μνήμη βίντεο: cudafree
    (αλλαγή μνήμης μεταξύ GDDR και RAM), cudamemcpy και cudamemcpy2D (αντίγραφο
    μνήμη μεταξύ GDDR και RAM) και cudamalloc (προβολή μνήμης).

    Όλα τα προγράμματα κώδικα πρέπει να μεταγλωττίζονται από την πλευρά του CUDA API. Πάνω στο στάχυ λαμβάνεται
    κώδικα, αναθέσεις συμπεριλαμβανομένων για τον κεντρικό επεξεργαστή και poddaetsya
    τυπική μεταγλώττιση και άλλος κώδικας, αναθέσεις για τον προσαρμογέα γραφικών,
    ξαναγράψτε σε PTX (πολύ εικαστικός συναρμολογητής) για
    δείχνοντας πιθανή χάρη. Μετά από όλους αυτούς τους «χορούς», υπάρχει ένα υπόλοιπο
    μετάφραση (μετάδοση) εντολών σε κατανόηση για κινήσεις GPU/CPU.

    Καλέστε για το γάμο

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

    Το πρόγραμμα περιήγησης CUDA SDK έχει επεκταθεί ειδικά για αρχάριους. Be-yaky bazhayuchy μπορεί
    νιώστε τη δύναμη των παράλληλων υπολογισμών στο δικό σας δέρμα (καλύτερα να ενεργοποιήσετε ξανά την επαλήθευση
    σταθερότητα - το ρομπότ εφαρμόζεται χωρίς τεχνουργήματα και βίλες). Η προσθήκη μπορεί
    ένας μεγάλος αριθμός εκπομπών μίνι-προγραμμάτων (61 «δοκιμές»). Στο δέρμα dosvіdu є
    Τεκμηρίωση αναφοράς του κώδικα προγράμματος συν αρχεία PDF. Μπορείτε να δείτε αυτούς τους ανθρώπους
    παρόντες με τα παράθυρά τους στο πρόγραμμα περιήγησης, ασχολούνται με σοβαρές εργασίες.
    Εδώ μπορείτε επίσης να αλλάξετε την ταχύτητα του ρομπότ και του επεξεργαστή και της κάρτας βίντεο για την ώρα επεξεργασίας
    danich. Για παράδειγμα, σάρωση εμπλουτισμένων συστοιχιών με κάρτα βίντεο GeForce 8800
    GT
    512 MB με μπλοκ 256 νημάτων κυκλοφορούν σε 0,17109 χιλιοστά του δευτερολέπτου.
    Η τεχνολογία δεν αναγνωρίζει τα SLI tandems, έτσι έχετε ένα τρίο να φυσάει,
    ενεργοποιήστε τη λειτουργία "σύζευξης" πριν από το ρομπότ, διαφορετικά το CUDA θα λειτουργήσει μόνο ένα
    συσκευή. διπύρηνος AMD Athlon 64X2(συχνότητα πυρήνα 3000 MHz) η ίδια έγκριση
    περνούν σε 2,761528 χιλιοστά του δευτερολέπτου. Βγες ότι το G92 είναι μεγαλύτερο από 16 φορές
    shvidshe "πέτρα" AMD! Yak Bachish, το σύστημα απέχει πολύ από το να είναι ακραίο
    παράλληλα με το μη αγαπητό στις μάζες λειτουργικό σύστημα που δείχνει το κακό
    Αποτελέσματα.

    Krіm πρόγραμμα περιήγησης іsnuє low korisnyh suspіlstvo προγράμματα. Πλίθα
    προσάρμοσε τα προϊόντα της στη νέα τεχνολογία. Τώρα το Photoshop CS4 ενημερώθηκε
    οι νικηφόροι πόροι του κόσμου προσαρμογέων γραφικών (είναι απαραίτητο να παρέχονται ειδικές
    συνδέω). Με τέτοια προγράμματα, όπως ο μετατροπέας πολυμέσων Badaboom και το RapiHD, μπορείτε
    Δυνατότητα αποκωδικοποίησης βίντεο σε μορφή MPEG-2. Για την επεξεργασία ο ήχος είναι κακός
    pidide δωρεάν βοηθητικό πρόγραμμα Accelero. Αριθμός λογισμικού, βελτιωμένο CUDA API,
    φυσικά, συνεχίστε να μεγαλώνετε.

    Και την ώρα...

    Και ενώ διαβάζετε αυτό το υλικό, σκληρά εργαζόμενοι από ανησυχίες επεξεργαστή
    επεκτείνουν τις τεχνολογίες τους για την προώθηση της GPU από την CPU. 3 πλευρά AMDμουστάκι
    κατανοητό: έχουν ένα μεγαλειώδες dosvіd, nabutiy ταυτόχρονα iz ATI.

    Η δημιουργία των «μικροσυσκευών», Fusion, αποτελείται από έναν αριθμό πυρήνων
    με την κωδική ονομασία Buldozer και videochip RV710 (Kong). Η αλληλεπίδρασή σας θα είναι
    zdіysnyuvatsya για rahunok razrezheny ελαστικών HyperTransport. Άποψη αγρανάπαυσης
    αριθμός πυρήνων και χαρακτηριστικά συχνότητας Η AMD σχεδιάζει να δημιουργήσει μια ολόκληρη τιμή
    η ιεραρχία των «λίθων». Σχεδιάζεται επίσης η μετατροπή επεξεργαστών όπως για φορητούς υπολογιστές (Falcon),
    και για gadget πολυμέσων (Bobcat). Επιπλέον, η ίδια η στασιμότητα της τεχνολογίας
    Τα φορητά βοηθητικά κτίρια θα είναι η πρώτη εργασία για τους Καναδούς. Z επιτροπή ανάπτυξης
    Η παράλληλη απαρίθμηση της στασιμότητας ενός τέτοιου "kamintsiv" μπορεί να είναι ακόμη πιο δημοφιλής.

    IntelΤρεις ανά ώρα για το Larrabee σας. Προϊόντα AMD,
    yakscho να μην μεθύσεις, να εμφανιστείς στα ράφια των καταστημάτων όπως το 2009 - στο στάχυ
    Ροκ 2010. Και η απόφαση του αντιπάλου να δει το φως του Θεού είναι λιγότερο πιθανή σε δύο
    μοίρα.

    Το Larrabee έχει μεγάλο αριθμό (διαβάστε - εκατοντάδες) πυρήνες. Στο στάχυ
    Λοιπόν, μπορείτε να δείτε τα αγαθά, εξοφλημένα για 8 - 64 πυρήνες. Η δυσοσμία θυμίζει περισσότερο Pentium, ale
    να αρμέξει είναι έντονα καταπονημένο. Ο πυρήνας του δέρματος μπορεί να έχει 256 kilobyte cache ενός άλλου ίσου
    (Με ένα χρόνο γιόγκα, η ανάπτυξη θα αυξηθεί). Vzaymosv'yazok
    1024-bit αμφίδρομος δακτύλιος. Η Intel φαίνεται να είναι "παιδί"
    καλή πρακτική με το DirectX και το Open GL API (για το "Yabluchnikov"), τίποτα από αυτά
    δεν απαιτείται εισαγωγή λογισμικού.

    Και γιατί είμαι όλος tse rozpoviv; Είναι προφανές ότι ο Larrabee και ο Fusion δεν φαίνονται
    σταθεροί, σταθεροί επεξεργαστές από την αγορά
    κάρτες γραφικών. Για gamers και ακραίους ανθρώπους, ανάμεσα σε όνειρα, όπως παλιά, για να ξεφορτωθούν
    CPU με πλούσιο πυρήνα και ένα συνδυασμό με αυτοκόλλητα VGA κορυφαίας ποιότητας. Αλέ αυτοί που πλοηγούν
    οι εταιρείες επεξεργασίας να στραφούν στην παράλληλη χρέωση για αρχές,
    ανάλογο με το GPGPU, για να μιλήσουμε ήδη πλουσιοπάροχα για το τι. Ζόκρεμα για αυτούς που είναι
    τεχνολογία, όπως το CUDA, μπορεί να έχει το δικαίωμα χρήσης και, ίσως, να είναι
    ήδη δημοφιλής.

    Μικρό βιογραφικό

    Η παράλληλη χρέωση με τη βοήθεια μιας κάρτας βίντεο είναι απλώς ένα καλό εργαλείο
    στα χέρια ενός ρομποτικού προγραμματιστή. Δύσκολα επεξεργαστές chi στο νόμο του choli іz Moore
    να σταματήσει. Εταιρείες NVIDIAΞάπλωσε για να διανύσεις έναν ακόμα μακρύ δρόμο
    γλιστρώντας στη μάζα του API σας (το ίδιο μπορεί να ειπωθεί για το παιδί ATI/AMD).
    Πώς θα είσαι, δείξε το μέλλον. Επίσης, το CUDA θα επιστρέψει :).

    ΥΣΤΕΡΟΓΡΑΦΟ. Για όλους τους προγραμματιστές και τους ανθρώπους που κόλλησαν, συνιστώ να ρίξετε μια ματιά
    επόμενη "εικονική υποθήκη":

    Επίσημος ιστότοπος και ιστότοπος της NVIDIA
    GPGPU.com. Ολα
    δίνονται πληροφορίες - τα αγγλικά μου, αλλά ευχαριστώ, δεν θα το ήθελα
    Κινέζικα. Συνέχισε λοιπόν! Είμαι σίγουρος ότι ο συγγραφέας ήθελε να σε βοηθήσει λίγο
    ωραίες μυήσεις γνώσης CUDA!

    І αναθέσεις για μετάφραση στον κώδικα κεντρικού υπολογιστή (κεφαλίδα, κωδικός κλειδιού) και στον κωδικό συσκευής (κωδικός υλικού) (αρχεία με extensions.cu) σε αρχεία αντικειμένων, αξεσουάρ κατά τη διαδικασία μεταγλώττισης του τελικού προγράμματος ή βιβλιοθήκης σε οποιοδήποτε περιβάλλον προγραμματισμού, για παράδειγμα NetBeans.

    Στην αρχιτεκτονική CUDA, το μοντέλο μνήμης του πλέγματος, το μοντέλο συμπλέγματος των ροών και οι οδηγίες SIMD είναι νικηφόρα. Δεν υπάρχουν μόνο κάρτες γραφικών υψηλής απόδοσης, αλλά και άλλοι επιστημονικοί λογαριασμοί για κάρτες γραφικών nVidia. Τα αποτελέσματα αυτής της έρευνας χρησιμοποιούνται ευρέως για το CUDA σε διαφορετικούς γαλούς, συμπεριλαμβανομένης της αστροφυσικής, του υπολογισμού της βιολογίας και της χημείας, της μοντελοποίησης της δυναμικής των ποταμών, των ηλεκτρομαγνητικών αλληλεπιδράσεων, της τομογραφίας υπολογιστή, της σεισμικής ανάλυσης και άλλων. Το CUDA έχει τη δυνατότητα σύνδεσης με προγράμματα που χρησιμοποιούν OpenGL και Direct3D. Το CUDA είναι ένα λογισμικό πολλαπλών πλατφορμών για λειτουργικά συστήματα όπως το Linux, το Mac OS X και τα Windows.

    Στις 22 Μαρτίου 2010, η nVidia κυκλοφόρησε το CUDA Toolkit 3.0, το οποίο είναι μια αναβίωση της υποστήριξης OpenCL.

    Ιδιοκτησία

    Η πλατφόρμα CUDA εμφανίστηκε για πρώτη φορά στην αγορά με την κυκλοφορία του τσιπ NVIDIA G80 όγδοης γενιάς και έγινε παρούσα σε όλες τις επερχόμενες σειρές τσιπ γραφικών, που εμφανίζονται στις οικογένειες των ταχύτερων GeForce, Quadro και NVidia Tesla.

    Η πρώτη σειρά που υποστηρίζει το CUDA SDK, το G8x, είναι ένας μικρός διανυσματικός επεξεργαστής μονής ακρίβειας 32 bit που υποστηρίζει το CUDA SDK ως API (το CUDA υποστηρίζει τον τύπο διπλής ταινίας Ci, η ακρίβεια proteo μειώνεται στα 32-bit αιωρούμενα σημείο). Οι χαμηλότεροι επεξεργαστές GT200 μπορεί να υποστηρίζουν ακρίβεια 64 bit (μόνο για SFU), αλλά η απόδοση είναι σημαντικά υψηλότερη, χαμηλότερη για ακρίβεια 32 bit (μέσω αυτών, υπάρχουν μόνο δύο SFU ανά πολυεπεξεργαστή ροής δέρματος και βαθμωτοί επεξεργαστές - όλοι). Ο επεξεργαστής γραφικών οργανώνει τον πλούτο υλικού της ροής, που σας επιτρέπει να εκμεταλλευτείτε όλους τους πόρους του επεξεργαστή γραφικών. Με αυτόν τον τρόπο, εμφανίζεται η προοπτική μετατόπισης των λειτουργιών μιας φυσικής συντόμευσης σε μια γραφική (παράδειγμα υλοποίησης - nVidia PhysX). Επίσης, υπάρχουν ευρείες δυνατότητες χρήσης μιας γραφικής ρύθμισης ενός υπολογιστή σε έναν αναδιπλούμενο μη γραφικό υπολογισμό: για παράδειγμα, στον υπολογισμό της βιολογίας και άλλων τεχνικών επιστημών.

    Περεβαγή

    Εναλλακτικά με την παραδοσιακή προσέγγιση για την οργάνωση του υπολογισμού της παγκόσμιας αναγνώρισης για τις πρόσθετες δυνατότητες των γραφικών API, η αρχιτεκτονική CUDA μπορεί επίσης να κερδίσει σε αυτήν τη συλλογή:

    Ανταλλαγή

    • Όλες οι λειτουργίες, που εμφανίζονται στην επέκταση, δεν υποστηρίζουν την αναδρομή (στην έκδοση CUDA Toolkit 3.1, υποστηρίζουν ενδείξεις ότι η αναδρομή) και ενδέχεται να λειτουργούν άλλες ανταλλαγές

    Τροποποιήσεις GPU και βελτιώσεις γραφικών

    Μια μετάφραση του πρόσθετου με τη μορφή εξοπλισμού με δυνατότητα Nvidia από τη δηλωμένη νέα υποστήριξη για την τεχνολογία CUDA εμφανίζεται στον επίσημο ιστότοπο της Nvidia: CUDA-Enabled GPU Products (Αγγλικά).

    Μάλιστα, αυτή την ώρα στην αγορά υλικού για υπολογιστές, η υποστήριξη της τεχνολογίας CUDA θα εξασφαλιστεί με τις εξελιγμένες περιφερειακές συσκευές:

    Έκδοση προδιαγραφών GPU Κάρτες βίντεο
    1.0 G80, G92, G92b, G94, G94b GeForce 8800GTX/Ultra, 9400GT, 9600GT, 9800GT, Tesla C/D/S870, FX4/5600, 360M, GT 420
    1.1 G86, G84, G98, G96, G96b, G94b, G94b, G92b, G92b GeForce 8400GS/GT, 8600GT/GTS, 8800GT/GTS, 9600 GSO, 9800GTX/GX2, GTS 250, GT 120/30/40, FX 4/570, 3/580/33/17 /770M, 16/17/27/28/36/37/3800M, NVS420/50
    1.2 GT218, GT216, GT215 GeForce 210, GT 220/40, FX380 LP, 1800M, 370/380M, NVS 2/3100M
    1.3 GT200, GT200b GeForce GTX 260, GTX 275, GTX 280, GTX 285, GTX 295, Tesla C/M1060, S1070, Quadro CX, FX 3/4/5800
    2.0 GF100, GF110 GeForce (GF100) GTX 465, GTX 470, GTX 480, GTX140 500
    2.1 GF104, GF114, GF116, GF108, GF106 GeForce 610M, GT 430, GT 440, GTS 450, GTX 460, GTX 550 Ti, GTX 560, GTX 560 Ti, 500M, Quadro 600, 2000
    3.0 GK104, GK106, GK107 GeForce GTX 690, GTX 680, GTX 670, GTX 660 Ti, GTX 660, GForce GTX 680MX, GeForce GTX 675MX, GeFor 6 GeForce GT 645M, GeForce GT 640M
    3.5 GK110
    Nvidia GeForce για επιτραπέζιους υπολογιστές
    GeForce GTX 590
    GeForce GTX 580
    GeForce GTX 570
    GeForce GTX 560 Ti
    GeForce GTX 560
    GeForce GTX 550 Ti
    GeForce GTX 520
    GeForce GTX 480
    GeForce GTX 470
    GeForce GTX 465
    GeForce GTX 460
    GeForce GTS 450
    GeForce GTX 295
    GeForce GTX 285
    GeForce GTX 280
    GeForce GTX 275
    GeForce GTX 260
    GeForce GTS 250
    GeForce GT 240
    GeForce GT 220
    GeForce 210
    GeForce GTS 150
    GeForce GT 130
    GeForce GT 120
    GeForce G100
    GeForce 9800 GX2
    GeForce 9800 GTX+
    GeForce 9800 GTX
    GeForce 9800 GT
    GeForce 9600 GSO
    GeForce 9600 GT
    GeForce 9500 GT
    GeForce 9400 GT
    GeForce 9400mGPU
    GeForce 9300mGPU
    GeForce 8800 GTS 512
    GeForce 8800 GT
    GeForce 8600 GTS
    GeForce 8600 GT
    GeForce 8500 GT
    GeForce 8400GS
    Nvidia GeForce για φορητούς υπολογιστές
    GeForce GTX 580M
    GeForce GTX 570M
    GeForce GTX 560M
    GeForce GT 555M
    GeForce GT 540M
    GeForce GT 525M
    GeForce GT 520M
    GeForce GTX 485M
    GeForce GTX 480M
    GeForce GTX 470M
    GeForce GTX 460M
    GeForce GT 445M
    GeForce GT 435M
    GeForce GT 425M
    GeForce GT 420M
    GeForce GT 415M
    GeForce GTX 285M
    GeForce GTX 280M
    GeForce GTX 260M
    GeForce GTS 360M
    GeForce GTS 350M
    GeForce GTS 160M
    GeForce GTS 150M
    GeForce GT 335M
    GeForce GT 330M
    GeForce GT 325M
    GeForce GT 240M
    GeForce GT 130M
    GeForce G210M
    GeForce G110M
    GeForce G105M
    GeForce 310M
    GeForce 305M
    GeForce 9800M GTX
    GeForce 9800M GT
    GeForce 9800M GTS
    GeForce 9700M GTS
    GeForce 9700M GT
    GeForce 9650M GS
    GeForce 9600M GT
    GeForce 9600M GS
    GeForce 9500M GS
    GeForce 9500M G
    GeForce 9300M GS
    GeForce 9300MG
    GeForce 9200M GS
    GeForce 9100MG
    GeForce 8800M GTS
    GeForce 8700M GT
    GeForce 8600M GT
    GeForce 8600M GS
    GeForce 8400M GT
    GeForce 8400M GS
    NvidiaTesla *
    Tesla C2050/C2070
    Tesla M2050/M2070/M2090
    Tesla S2050
    Tesla S1070
    Tesla M1060
    Tesla C1060
    Tesla C870
    Tesla D870
    Tesla S870
    Nvidia Quadro για επιτραπέζιους υπολογιστές
    Quadro 6000
    Quadro 5000
    Quadro 4000
    Quadro 2000
    Quadro 600
    QuadroFX 5800
    QuadroFX 5600
    QuadroFX4800
    Quadro FX 4700X2
    QuadroFX4600
    QuadroFX 3700
    QuadroFX 1700
    QuadroFX 570
    QuadroFX470
    Quadro FX 380 Low Profile
    QuadroFX 370
    Quadro FX 370 Low Profile
    Quadro CX
    Quadro NVS450
    Quadro NVS 420
    Quadro NVS 290
    Quadro Plex 2100 D4
    Quadro Plex 2200 D2
    Quadro Plex 2100 S4
    Quadro Plex 1000 Model IV
    Nvidia Quadro για φορητούς υπολογιστές
    Quadro 5010M
    Quadro 5000M
    Quadro 4000M
    Quadro 3000M
    Quadro 2000M
    Quadro 1000M
    QuadroFX 3800M
    QuadroFX 3700M
    QuadroFX 3600M
    QuadroFX 2800M
    QuadroFX 2700M
    QuadroFX 1800M
    QuadroFX 1700M
    QuadroFX 1600M
    QuadroFX 880M
    QuadroFX 770M
    QuadroFX 570M
    QuadroFX 380M
    QuadroFX 370M
    QuadroFX 360M
    Quadro NVS 5100M
    Quadro NVS 4200M
    Quadro NVS 3100M
    Quadro NVS 2100M
    Quadro NVS 320M
    Quadro NVS 160M
    Quadro NVS 150M
    Quadro NVS 140M
    Quadro NVS 135M
    Quadro NVS 130M
    • Τα μοντέλα Tesla C1060, Tesla S1070, Tesla C2050/C2070, Tesla M2050/M2070, Tesla S2050 επιτρέπουν τη διενέργεια υπολογισμών στη GPU με μεταβλητή ακρίβεια.

    Χαρακτηριστικά και προδιαγραφές διαφορετικών εκδόσεων

    Υποστήριξη δυνατοτήτων (οι μη καταχωρημένες λειτουργίες είναι
    υποστηρίζεται για όλες τις υπολογιστικές δυνατότητες)
    Υπολογιστική ικανότητα (έκδοση)
    1.0 1.1 1.2 1.3 2.χ

    Λέξεις 32 bit στην παγκόσμια μνήμη
    γεια Έτσι

    τιμές κινητής υποδιαστολής στην παγκόσμια μνήμη
    Ακέραιες ατομικές συναρτήσεις που λειτουργούν
    Λέξεις 32 bit σε κοινόχρηστη μνήμη
    γεια Έτσι
    atomicExch() που λειτουργεί σε 32-bit
    τιμές κινητής υποδιαστολής σε κοινόχρηστη μνήμη
    Ακέραιες ατομικές συναρτήσεις που λειτουργούν
    Λέξεις 64-bit στην παγκόσμια μνήμη
    Στρεβλώστε τις λειτουργίες ψήφου
    Λειτουργίες κινητής υποδιαστολής διπλής ακρίβειας γεια Έτσι
    Ατομικές λειτουργίες που λειτουργούν σε 64-bit
    ακέραιες τιμές στην κοινόχρηστη μνήμη
    γεια Έτσι
    Ατομική προσθήκη κινητής υποδιαστολής σε λειτουργία
    Λέξεις 32 bit σε καθολική και κοινόχρηστη μνήμη
    _ψηφοφορία()
    _threadfence_system()
    _syncthreads_count(),
    _syncthreads_and(),
    _syncthreads_or()
    Λειτουργίες επιφάνειας
    τρισδιάστατο πλέγμα μπλοκ νημάτων
    τεχνικές προδιαγραφές Υπολογιστική ικανότητα (έκδοση)
    1.0 1.1 1.2 1.3 2.χ
    Μέγιστη διάσταση πλέγματος μπλοκ νημάτων 2 3
    Μέγιστη διάσταση x-, y- ή z του πλέγματος των μπλοκ νημάτων 65535
    Μέγιστη διάσταση μπλοκ νήματος 3
    Μέγιστη διάσταση x ή y ενός μπλοκ 512 1024
    Μέγιστη διάσταση z ενός μπλοκ 64
    Μέγιστος αριθμός νημάτων ανά μπλοκ 512 1024
    Μέγεθος στημονιού 32
    Μέγιστος αριθμός μπλοκ κατοίκων ανά πολυεπεξεργαστή 8
    Μέγιστος αριθμός μόνιμων παραμορφώσεων πολυεπεξεργαστή 24 32 48
    Μέγιστος αριθμός μόνιμων νημάτων ανά πολυεπεξεργαστή 768 1024 1536
    Αριθμός καταχωρητών 32-bit για πολυεπεξεργαστή 8 ΧΙΛ 16 χιλ 32 Χιλ
    Μέγιστη ποσότητα κοινόχρηστης μνήμης ανά πολυεπεξεργαστή 16 KB 48KB
    Αριθμός κοινόχρηστων τραπεζών μνήμης 16 32
    Ποσότητα τοπικής μνήμης ανά νήμα 16 KB 512 KB
    Σταθερό μέγεθος μνήμης 64KB
    Σετ εργασίας κρυφής μνήμης ανά πολυεπεξεργαστή για σταθερή μνήμη 8KB
    Σετ εργασίας κρυφής μνήμης ανά πολυεπεξεργαστή για μνήμη υφής Ανάλογα με τη συσκευή, μεταξύ 6 KB και 8 KB
    Μέγιστο πλάτος για υφή 1D
    8192 32768
    Μέγιστο πλάτος για υφή 1D
    αναφορά δεσμευμένη σε γραμμική μνήμη
    2 27
    Μέγιστο πλάτος και αριθμός στρώσεων
    για αναφορά υφής με στρώσεις 1D
    8192x512 16384x2048
    Μέγιστο πλάτος και ύψος για 2D
    αναφορά υφής δεσμευμένη σε
    γραμμική μνήμη ή πίνακα CUDA
    65536 x 32768 65536 x 65535
    Μέγιστο πλάτος, ύψος και αριθμός
    στρωμάτων για αναφορά υφής με 2D επίπεδα
    8192 x 8192 x 512 16384 x 16384 x 2048
    Μέγιστο πλάτος, ύψος και βάθος
    για αναφορά τρισδιάστατης υφής δεσμευμένη σε γραμμική
    μνήμη ή μια συστοιχία CUDA
    2048x2048x2048
    Μέγιστος αριθμός υφών που
    μπορεί να συνδεθεί σε έναν πυρήνα
    128
    Μέγιστο πλάτος για επιφάνεια 1D
    αναφορά δεσμευμένη σε πίνακα CUDA
    Δεν
    υποστηρίζεται
    8192
    Μέγιστο πλάτος και ύψος για ένα 2D
    αναφορά επιφάνειας δεσμευμένη σε πίνακα CUDA
    8192 x 8192
    Μέγιστος αριθμός επιφανειών που
    μπορεί να συνδεθεί σε έναν πυρήνα
    8
    Μέγιστος αριθμός εντολών ανά
    πυρήνας
    2 εκατομμύρια

    Βαρέλι

    CudaArray* cu_array; υφή< float , 2 >tex; // Εκχώρηση πίνακα cudaMalloc( & cu_array, cudaCreateChannelDesc< float>(), πλάτος ύψος); // Αντιγραφή δεδομένων εικόνας στον πίνακα cudaMemcpy( cu_array, εικόνα, πλάτος* ύψος, cudaMemcpyHostToDevice) ; // Συνδέστε τον πίνακα στην υφή cudaBindTexture( tex, cu_array) ; // Εκτέλεση του πυρήνα dim3 blockDim(16, 16, 1); dim3 gridDim(width/blockDim.x, height/blockDim.y, 1); πυρήνας<<< gridDim, blockDim, 0 >>> (d_data, πλάτος, ύψος); cudaUnbindTexture(tex); __global__ void kernel(float * odata, int ύψος, int πλάτος) ( unsigned int x = blockIdx.x * blockDim.x + threadIdx.x ; unsigned int y = blockIdx.y * blockDim.y + threadIdx.y ; float tex, x, y);data[y* πλάτος+ x] = c;

    Εισαγωγή pycuda.driver όπως drv εισαγωγή numpy drv.init() dev = drv.Device(0) ctx=dev.make_context() mod=drv.SourceModule( """ __global__ void multiply_them(float *dest, float *a, float *b) (const int i = threadIdx.x; dest[i] = a[i] * b[i]; ) """) multiply_them = mod.get_function ("multiply_them") a = numpy.random .randn (400 ) .atype (numpy.float32 ) b = numpy.random .randn (400 ) .astype (numpy.float32_them) multip(a) .Out (dest) , drv.In (a) , drv.In (b) , block= (400 , 1 , 1 ) ) print dest-a*b

    Το CUDA ως μάθημα στα πανεπιστήμια

    Έρχεται στις αρχές του 2009, το μοντέλο λογισμικού CUDA έχει αναπτυχθεί σε 269 πανεπιστήμια σε όλο τον κόσμο. Στη Ρωσία, τα πρώτα μαθήματα για το CUDA διαβάζονται στο Πολυτεχνείο της Αγίας Πετρούπολης, στο Κρατικό Πανεπιστήμιο του Γιαροσλάβλ. P. G. Demidov, Moskovsky, Nizhny Novgorod, St. Petersburg, Tverskoye, Kazan, Novosibirsky, Novosibirsky Holden Technical University of the Permsky UNIVITIES, the MITENENTY UNIVITITITITITIONALY INITITITITIONALY INITY ONITYAS. Bauman, RKhTU im. Mendelev, Διαπεριφερειακό Κέντρο Υπερυπολογιστών της Ρωσικής Ακαδημίας Επιστημών, . Επιπλέον, τον Δεκέμβριο του 2009, ανακοινώθηκε η έναρξη των εργασιών του πρώτου επιστημονικού και φωτιστικού κέντρου στη Ρωσία "Parallel Calculation", το οποίο οργανώθηκε στην πόλη Dubna, πριν από την ημερομηνία της οποίας η διαβούλευση για την ολοκλήρωση του αναδιπλούμενοι υπολογισμοί στη GPU.

    Στην Ουκρανία, τα μαθήματα για το CUDA διαβάζονται στο Ινστιτούτο Ανάλυσης Συστημάτων του Κιέβου.

    Posilannya

    Επίσημοι πόροι

    • CUDA Zone (Ρωσικά) - επίσημος ιστότοπος CUDA
    • CUDA GPU Computing (Αγγλικά) - επίσημα φόρουμ ιστού αφιερωμένα στους υπολογισμούς CUDA

    Ανεπίσημοι πόροι

    Tom's Hardware
    • Ντμίτρο Τσεκάνοφ. nVidia CUDA: χρεώσεις για κάρτες γραφικών ή θάνατος CPU; . Tom's Hardware (22 Σεπτεμβρίου 2008).
    • Ντμίτρο Τσεκάνοφ. nVidia CUDA: Δοκιμή GPU για την κύρια αγορά. Tom's Hardware (Τρίτη, 19, 2009).
    iXBT.com
    • Oleksiy Berillo. NVIDIA CUDA - μη γραφικός υπολογισμός σε επεξεργαστές γραφικών. Μέρος 1. iXBT.com (23 Σεπτεμβρίου 2008). Αρχειοθετήθηκε τον περασμένο Φεβρουάριο 4, 2012. Αναθεωρήθηκε στις 20 Σεπτεμβρίου 2009.
    • Oleksiy Berillo. NVIDIA CUDA - μη γραφικός υπολογισμός σε επεξεργαστές γραφικών. Μέρος 2ο. iXBT.com (22 Ιουλίου 2008). - Εφαρμόστε την ενημερωμένη έκδοση κώδικα NVIDIA CUDA. Αρχειοθετήθηκε τον περασμένο Φεβρουάριο 4, 2012. Αναθεωρήθηκε στις 20 Σεπτεμβρίου 2009.
    Άλλοι πόροι
    • Μπορέσκοφ Ολεξίι Βικτόροβιτς. Fundamentals of CUDA (20 Σεπτεμβρίου 2009). Αρχειοθετήθηκε τον περασμένο Φεβρουάριο 4, 2012. Αναθεωρήθηκε στις 20 Σεπτεμβρίου 2009.
    • Volodymyr Frolov.Εισαγωγή στην τεχνολογία CUDA. Περιοδικό Merezhevy "Computer graphics and multimedia" (19 Δεκεμβρίου 2008). Αρχειοθετήθηκε τον περασμένο Φεβρουάριο 4, 2012. Αναθεωρήθηκε στις 28 Ιουνίου 2009.
    • Ιγκόρ Οσκόλκοφ.Το NVIDIA CUDA είναι ένα οικονομικό εισιτήριο για τον κόσμο των μεγάλων αριθμών. Υπολογιστές (30 Απριλίου 2009). Ανακτήθηκε στις 3 Μαΐου 2009.
    • Volodymyr Frolov.Εισαγωγή στην τεχνολογία CUDA (1 Σεπτεμβρίου 2009). Αρχειοθετήθηκε τον περασμένο Φεβρουάριο 4, 2012. Αναθεωρήθηκε στις 3 Απριλίου 2010.
    • GPGPU.ru. Κάρτες βίντεο Wikoristannya για υπολογισμό
    • . Παράλληλο Υπολογιστικό Κέντρο

    Σημειώσεις

    Div. επίσης



Πνευματικά δικαιώματα © 2022 Σχετικά με το stosunki.