एनव्हीडिया क्यूडा तंत्रज्ञान. NVidia CUDA: GPU शुल्क आणि CPU मृत्यू? डेटा माइग्रेशन मिनिमायझेशन होस्ट डिव्हाइस

त्या इंशी. तथापि, "CUDA स्कॅन" संयोजनाचा शोध, केवळ 2 लेख पाहिल्यानंतर, कोणत्याही प्रकारे GPU वरील स्कॅन अल्गोरिदमशी जुळत नाही - परंतु ते स्वतः मूलभूत अल्गोरिदमपैकी एक आहे. तर, मोठा श्वास घेतल्यावर, Udacity - Intro to Parallel Programming या अभ्यासक्रमाकडे परत पाहू आणि मी CUDA बद्दल लेखांची एक नवीन मालिका लिहिण्याचे धाडस केले. मी तुम्हाला पुन्हा एकदा सांगेन की मालिका स्वतःच्या मार्गावर आधारित असेल आणि तुमच्याकडे एक तास असला तरीही, तुम्ही योगासने अधिक समृद्ध कराल. याक्षणी, खालील लेखांचे नियोजन केले आहे:
भाग 1: तरतूद.
भाग २: GPU हार्डवेअर आणि समांतर संप्रेषण पद्धती.
भाग 3: मूलभूत GPU अल्गोरिदम: कमी करा, स्कॅन करा आणि हिस्टोग्राम.
भाग 4: मूलभूत GPU अल्गोरिदम: संक्षिप्त, खंडित स्कॅन, क्रमवारी. काही अल्गोरिदमची व्यावहारिक अंमलबजावणी.
भाग 5: GPU सॉफ्टवेअर ऑप्टिमायझेशन.
भाग 6: त्यानंतरच्या अल्गोरिदमच्या समांतरीकरणाचे उदाहरण.
भाग 7: समांतर प्रोग्रामिंगचे अतिरिक्त विषय, डायनॅमिक समांतरवाद.

झत्रिमका वि बिल्डिंग परमिट

सर्व प्रथम, आपण आपली कार्ये पूर्ण करण्यासाठी GPU फ्रीझच्या समोर एक त्वचा ठेवू शकता - आणि अशा हेतूंसाठी, एक चांगला GPU, आपल्याला ते गोठवण्याची आवश्यकता असल्यास? vidpovіdі sіd साठी 2 संकल्पना सूचित करा:
झात्रिमका(विलंबता) - ज्या तासादरम्यान एक सूचना/ऑपरेशन पूर्ण होते.
थ्रूपुट क्षमता- सूचना/ऑपरेशन्सची संख्या, ज्या प्रति तास मोजल्या जातात.
एक साधे उदाहरण: कदाचित 90 किमी/वर्षाचा वेग असलेली आणि 4 व्यक्तींची क्षमता असलेली प्रवासी कार आणि 60 किमी/वर्षाची क्षमता असलेली आणि 20 व्यक्तींची क्षमता असलेली बस. जर एखाद्या ऑपरेशनसाठी प्रति 1 किलोमीटर 1 व्यक्तीची हालचाल स्वीकारायची असेल, तर प्रवासी कारचा विलंब 3600/90 = 40s आहे - काही सेकंदांसाठी 1 व्यक्ती 1 किलोमीटरपेक्षा थोडी जास्त पुढे जाईल, कारचे थ्रूपुट 4/40 = 0.1 ऑपरेशन्स / सेकंद; बस विलंब - 3600/60=60s, बस थ्रूपुट - 20/60=0.3(3) ऑपरेशन्स/सेकंद.
त्यामुळे, CPU - tse कार, GPU - बस: एक मोठा अडथळा असू शकतो, परंतु एक मोठी थ्रूपुट इमारत देखील असू शकते. तुमच्या त्वचेच्या विशिष्ट ऑपरेशनच्या वेळेसाठी, प्रति सेकंद या ऑपरेशन्सची संख्या तितकी महत्त्वाची नाही - फक्त GPU वर एक नजर टाका.

CUDA ची मूलभूत समज आणि अटी

पुन्हा, CUDA शब्दावलीबद्दल बोलूया:

  • संलग्नक (डिव्हाइस)- GPU. "अंडरडॉग" ची भूमिका विजयी आहे - जे CPU देखील वापरू शकतात त्यांच्या कामाची शक्यता कमी आहे.
  • होस्ट (होस्ट)- सीपीयू. विकोनू भूमिका बजावत आहे - अॅनेक्सवर कार्य सुरू करणे, अॅनेक्सवरील मेमरी पाहणे, मेमरी हलवणे / अॅनेक्समधून. आणि म्हणून, CUDA मंत्र म्हणतो की संलग्नक म्हणून, म्हणून यजमान स्वतःची स्मृती लक्षात ठेवू शकतो.
  • कर्नल- आउटबिल्डिंगवर होस्टद्वारे लॉन्च केलेले कार्य.
तुम्ही CUDA निवडल्यास, तुम्ही फक्त तुमच्या आवडत्या प्रोग्रामिंगचा कोड लिहा (समर्थित मूव्हीजची यादी, C आणि C++ विरुद्ध नाही), त्यानंतर CUDA कंपाइलर होस्टसाठी ओके आणि अॅडसाठी ओके कोड तयार करतो. वर थोडी सावधगिरी: मी कोड जोडेन, परंतु काही प्रकारच्या "CUDA-विस्तार" सह माझ्या C पेक्षा अधिक काहीही लिहिल्याबद्दल मी दोषी आहे.

CUDA कार्यक्रमांचे मुख्य टप्पे

  1. होस्ट ऍनेक्सवर आवश्यक प्रमाणात मेमरी पाहतो.
  2. होस्ट माझ्या मेमरीमधील डेटा माझ्या मेमरीमध्ये कॉपी करेल.
  3. होस्ट आउटबिल्डिंगवर गायन कर्नल सुरू करतो.
  4. कर्नल संलग्न करा.
  5. मी मेमरीमधील परिणामांची होस्ट प्रत माझ्या मेमरीमध्ये संलग्न करेन.
अर्थात, GPU च्या जास्तीत जास्त कार्यक्षमतेसाठी, एक तास खर्च करणे आवश्यक आहे, कोरच्या कामावर खर्च करणे, एक तासापर्यंत, त्या फिरत्या डेटाच्या मेमरीवर खर्च करणे, ते अधिक होते.

केंद्रके

कर्नलसाठी कोड लिहिण्याची आणि ते सुरू करण्याची प्रक्रिया जवळून पाहू. महत्वाचे तत्व कर्नल शेवटच्या प्रोग्राम्सप्रमाणे (व्यावहारिकपणे) लिहिलेले असतात- म्हणून तुम्ही कोरच्या कोडमधूनच प्रवाह तयार आणि लाँच करू देत नाही. Natomist, समांतर गणना आयोजित करण्यासाठी GPU वेगवेगळ्या थ्रेडमध्ये एका कोरच्या मोठ्या प्रमाणात कॉपी चालवते- अधिक तंतोतंत सांगायचे तर, तुम्ही स्वतः काही प्रवाह लाँच करत आहात असे दिसते. आणि म्हणून, GPU च्या कार्यक्षमतेकडे वळणे - तुम्ही जितके जास्त प्रवाह चालवाल (समजण्यासाठी, की सर्व दुर्गंधी रोबोटवर जिंकतील) - चांगले.
कर्नलचा कोड अशा क्षणी एक उत्तम अनुक्रमिक कोड मानला जातो:
  1. मधले कोर "आयडेंटिफायर" किंवा अधिक सोप्या भाषेत, प्रवाहाची स्थिती ओळखण्यास सक्षम होऊ शकतात, जी संसर्गजन्यरित्या विजयी आहे - विजयी स्थितीद्वारे, आम्ही साध्य करतो की प्रवाहातील भिन्न डेनिम फॉलोसह एक कोर व्यवहार्य आहे. जे ते चालू आहे. भाषणापूर्वी, समांतर गणनांच्या अशा संस्थेला SIMD (सिंगल इंस्ट्रक्शन मल्टिपल डेटा) म्हणतात - जर थोड्या संख्येने प्रोसेसर एकाच वेळी समान ऑपरेशन पूर्ण करतात, जरी भिन्न डेटावर.
  2. काही प्रकरणांमध्ये, कर्नल कोडना सिंक्रोनाइझेशनचे वेगवेगळे मार्ग बदलणे आवश्यक आहे.
आम्ही कोणत्या श्रेणीनुसार प्रवाहांची संख्या सेट करतो, ज्यासाठी कर्नल लाँच केले जाईल? तरीही GPU चिप्स ग्राफिक्सप्रक्रिया युनिट, अर्थातच, CUDA मॉडेलवर, प्रवाहांची संख्या सेट करण्याच्या पद्धतीवर अडकले:
  • मागील बाजूस, तथाकथित ग्रिड (ग्रिड) चे परिमाण 3D निर्देशांकांमध्ये सेट केले जातात: grid_x, grid_y, grid_z. परिणामी, पासून नेटवर्क तयार होते grid_x*grid_y*grid_zब्लॉक
  • नंतर 3D निर्देशांकांमध्ये ब्लॉकचा आकार बदलला आहे: 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- ब्लॉकमधील प्रवाह आणि साइटमधील ब्लॉकमध्ये 3D समन्वयांचा बदला घेण्यासाठी दुर्गंधी येते हे स्पष्ट आहे. बदल देखील उपलब्ध आहेत ब्लॉकडिमі gridDimसमान फील्डसह - ब्लॉकचा आकार बदला आणि ग्रिड स्पष्ट आहे.
तर, 2D आणि 3D प्रतिमांवर प्रक्रिया करण्यासाठी स्मार्ट मार्गाने प्रवाह लाँच करण्याचा कोणताही मार्ग आहे का: उदाहरणार्थ, 2D किंवा 3D प्रतिमांमध्ये पिक्सेल स्किनवर प्रक्रिया करणे आवश्यक आहे, नंतर आपण ब्लॉक विस्तृत करणे निवडल्यास (GPU प्रतिमांमध्ये ठेव प्रतिमेमध्ये संकलित, या प्रतिमांवर प्रक्रिया करण्याचा मार्ग, GPU प्रतिमांवर प्रक्रिया करण्याचा मार्ग मॉडेलमध्ये अशा प्रकारे संकलित केला आहे की संपूर्ण प्रतिमा कव्हर केली गेली आहे, हे शक्य आहे, जर ते खूप जास्त असेल - जेणेकरून प्रतिमेचा विस्तार होईल संपूर्ण ब्लॉकद्वारे सामायिक केलेले नाही.

आम्ही CUDA वर एक कार्यक्रम लिहितो

सिद्धांत पूर्ण करा, एका तासासाठी कोड लिहा. विविध ऑपरेटिंग सिस्टमसाठी CUDA कॉन्फिगरेशन सेट करण्यासाठी सूचना - docs.nvidia.com/cuda/index.html. तर, इमेज फाइल्ससह काम करण्याच्या साधेपणासाठी, आम्ही ओपनसीव्ही आणि सीपीयू आणि जीपीयूच्या समान उत्पादकतेसाठी - ओपनएमपीमध्ये बदल करू.
कार्य सोप्या पद्धतीने पूर्ण करण्यासाठी सेट केले आहे: राखाडी प्रतिमेतून रंगीत प्रतिमेचे रूपांतर. ज्यांच्यासाठी, सत्य पिक्सेल आहे पिक्सेल sir_y स्केलवर ते सूत्रासाठी महत्त्वाचे आहे: वाय = 0.299*pix.R + 0.587*pix.G + 0.114*pix.B.
आम्ही प्रोग्रामचा सांगाडा मागे लिहू:

main.cpp

#समाविष्ट करा #समाविष्ट करा #समाविष्ट करा #समाविष्ट करा #समाविष्ट करा #समाविष्ट करा #समाविष्ट करा #समाविष्ट करा #include "openMP.hpp" #include "CUDA_wrappers.hpp" #include "common/image_helpers.hpp" वापरून नेमस्पेस cv; नेमस्पेस 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 सह प्रकार, आम्ही तास फ्रीज करतो. कार्य तयार इमेज पॉइंटर्सअसे दिसू शकते:

तयार इमेज पॉइंटर्स

टेम्पलेट void readyImagePointers(const char * const inputImageFileName, cv::Mat&inputImage, T1** inputImageArray, cv::Mat&outputImage, T2** outputImageArray, const int outputImageType) ( namespace वापरून IM_ORREAD = नामस्थान cv; OLREAD; जर (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); }


मी एका छोट्या युक्तीबद्दल बोलत आहे: उजवीकडे, आमच्याकडे अद्याप इमेजच्या स्किन पिक्सेलवर थोडे काम आहे - म्हणूनच, CUDA पर्यायासह, तासाचा वेग वाढवण्याची एक मोठी समस्या आहे. डेटाच्या त्या कॉपीची मेमरी पाहण्याच्या तासापर्यंत ब्लॅक ऑपरेशन, आणि परिणामी, अंतिम तास CUDA आवृत्ती OpenMP आवृत्तीपेक्षा मोठी असेल, परंतु आम्ही CUDA अधिक हुशार असल्याचे दर्शवू इच्छितो :) म्हणून CUDA साठी मेमरी ऑपरेशन्समध्ये सुधारणा न करता - प्रतिमा रूपांतरणाच्या व्हिज्युअलायझेशनवर काम करण्यासाठी फक्त एक तास लागेल. माझ्या स्वत: वर, मी असे म्हणेन की महान वर्गासाठी, मुख्य कामाचा तास अजूनही वरचढ आहे आणि CUDA मेमरीमधील सुधारित ऑपरेशन्ससह अधिक परिचित असेल.
OpenMP प्रकारासाठी कोड लिहू:

openMP.hpp

#समाविष्ट करा #समाविष्ट करा #समाविष्ट करा void RGBtoGrayscaleOpenMP(uchar4 *imageArray, unsigned char *imageGrayArray, int numRows, int numCols) ( #pragma omp समांतर कोलॅप्स(2) साठी (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 चे घट्टपणा आहे. मी पॅरामीटरच्या आसपास खेळण्याचा प्रयत्न केला वेळापत्रक ale फक्त उबदार बाहेर आला, त्याशिवाय कमी.
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 / मेमरी स्टार्ट-अप मेमरी तपासा (सर्व सुरू करा/tm/tr/tm/tr/gb/tm मेमरी जोडा) , sizeof(uchar4) * numPixels)); GPU checkCudaErrors(cudaMemcpy(d_imageRGBA, h_imageRGBA, sizeof(uchar4) * numPixels, cudaMemcpyHostToDevice));


कृपया CUDA नामकरण मानकाकडे लक्ष द्या - CPU वर डेटा आधारित आहे h_ (h ost), GPU डेटा - दृश्य d_ (d evice). तपासा एरर- मॅक्रो, जीथब रेपॉजिटरी Udacity कोर्समधून घेतले. असे दिसू शकते:

संलग्नक मजकूर

#समाविष्ट करा #define checkCudaErrors(val) check((val), #val, __FILE__, __LINE__) टेम्पलेट शून्य तपासणी (T err, const char * const func, const char * const फाइल, const int लाइन) ( 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एनम लुक-अहेडसाठी अतिरिक्त पॅरामीटर असू शकतो, जो कॉपी प्रकार निर्दिष्ट करतो: cudaMemcpyHostToDevice, cudaMemcpyDeviceToHost, cudaMemcpyDeviceToDevice.
मग ग्रिड आणि ब्लॉकचा आकार बदलणे आणि तास सेट करण्यास विसरू नका, कोरला कॉल करणे आवश्यक आहे:

संलग्नक मजकूर

dim3 ब्लॉक आकार; dim3 ग्रिड आकार; int threadNum; cudaEvent_t प्रारंभ करा, थांबवा; cudaEventCreate(&start); cudaEventCreate(&थांबा); threadNum = 1024; ब्लॉक साइज = मंद 3 (थ्रेडनम, 1, 1); gridSize = dim3(numCols/threadNum+1, numRows, 1); cudaEventRecord(प्रारंभ); rgba_to_grayscale_simple<<>>(d_imageRGBA, d_imageGray, numRows, numCols); cudaEventRecord(थांबा); cudaEventSynchronize(थांबा); cudaDeviceSynchronize(); checkCudaErrors(cudaGetLastError()); फ्लोट मिलिसेकंद = 0; cudaEventElapsedTime(&millisecons, start, stop); std::out<< "CUDA time simple (ms): " << milliseconds << std::endl;


कर्नल विकी फॉरमॅटला आदर द्या - कर्नल_नाव<<>> . कर्नलचा कोड देखील खूप फोल्ड करण्यायोग्य नाही:

rgba_to_grayscale_simple

Global__ void rgba_to_grayscale_simple(const uchar4* const d_imageRGBA, स्वाक्षरी न केलेले char* const d_imageGray, int numRows, int numCols) ( int y = blockDim.y*blockIdx.y + threadIdx, if ls.x; >=numRows) रिटर्न, const int ऑफसेट = y*numCols+x; const uchar4 pixel = d_imageRGBA; 0.114f*pixel.z;


येथे आपण निर्देशांकांची गणना करतो yі xप्रक्रिया केलेले पिक्सेल, आधी वर्णन केलेले व्हिकोरिस्टफ threadIdx, blockIdxі ब्लॉकडिम, तसेच, आणि vikonuemo रूपांतरण. पुन्हा पडताळणीसाठी आदर आणा जर (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.
रॅम: DD3, 2x4GB, 1600 MHz.
OS: OS X 10.9.5.
कंपाइलर: g++ (GCC) 4.9.2 20141029.
CUDA कंपाइलर: Cuda संकलन साधने, रिलीज 6.0, V6.0.1.
OpenMP ची आवृत्ती समर्थित: OpenMP 4.0.


असे दिसते की ते खूप प्रतिकूल नाही :) परंतु समस्या अजूनही तशीच आहे - त्वचेच्या पिक्सेलवर कार्य करणे पुरेसे नाही - आम्ही हजारो प्रवाह लॉन्च करतो, ज्या स्किनसाठी ते व्यावहारिकदृष्ट्या आवश्यक आहे. सीपीयू असलेल्या सीपीयूसाठी, ही समस्या उद्भवत नाही - ओपनएमपी एका ओळीत कमी संख्येने प्रवाह चालवते (माझ्या प्रवाहात 8) आणि रोबोटला त्यांच्यामध्ये समान रीतीने विभाजित करते - अशा प्रकारे, प्रोसेसर व्यावहारिकरित्या 100% व्यस्त असेल. , त्या तासात, GPU प्रमाणे, खरं तर, vikoristovuemo सर्व योग mіts नाही. उपाय अधिक स्पष्ट आहे - कोरमध्ये पिक्सेल शिंपडण्याची प्रक्रिया करणे. नवीन, ऑप्टिमाइझ केलेले, कर्नल असे दिसेल:

rgba_to_grayscale_optimized

#WARP_SIZE 32 __global__ void rgba_to_grayscale_optimized (const uchar4* const d_imageRGBA, unsigned char* const d_imageGray, int numRows, int numCols, int elemsPerdx, int numCols, int elemsPer_x; +treadx (xt_artx = 10/10/20000000) WARP_SIZE * WARP_SIZE)*(elemsPerThread-1)+x;for (int i=loop_start, j=0; j


समोरच्या भागाप्रमाणे येथे सर्वकाही इतके सोपे नाही. कसं मोठं व्हायचं, आता त्वचेला घाम येतोय elemsPerThreadपिक्सेल, आणि एका ओळीत नाही तर त्यांच्या दरम्यान WARP_SIZE मध्ये. WARP_SIZE काय आहे, त्याची किंमत 32 का आहे, आणि आता पिक्सेल नंतर पूर्ण करण्याची वेळ आली आहे, आगामी भागांमध्ये अधिक तपशीलवार वर्णन केले जाईल, मी तुम्हाला आत्ताच सांगेन की आम्ही मेमरीमध्ये अधिक कार्यक्षम कार्य करत आहोत. लेदर पोटिक आता रिफिनिश झाले आहे elemsPerThreadत्यांच्या दरम्यान WARP_SIZE मध्ये समान स्थितीतील पिक्सेल, त्यामुळे ब्लॉकमधील व्या स्थानावरून पुढे जाणाऱ्या या प्रवाहासाठी पहिल्या पिक्सेलचा x-समन्वय आता अधिक संकुचित करता येण्याजोग्या सूत्रासाठी आधीच्या कमी विस्तारित केला आहे.
संपूर्ण कर्नल असे सुरू केले आहे:

संलग्नक मजकूर

threadNum=128; const int elemsPerThread = 16; ब्लॉक साइज = मंद 3 (थ्रेडनम, 1, 1); gridSize = dim3(numCols/(threadNum*elemsPerThread) + 1, numRows, 1); cudaEventRecord(प्रारंभ); rgba_to_grayscale_optimized<<>>(d_imageRGBA, d_imageGray, numRows, numCols, elemsPerThread); cudaEventRecord(थांबा); cudaEventSynchronize(थांबा); cudaDeviceSynchronize(); checkCudaErrors(cudaGetLastError()); मिलीसेकंद = 0; cudaEventElapsedTime(&millisecons, start, stop); std::out<< "CUDA time optimized (ms): " << milliseconds << std::endl;


x-coordinate द्वारे ब्लॉक्सची संख्या आता म्हणून हमी दिली जाते numCols / (threadNum*elemsPerThread) + 1उप numCols/threadNum + 1. अन्यथा, सर्व काही समान आहे.
आपण सुरु करू:
OpenMP वेळ (ms): 44 CUDA वेळ साधा (ms): 53.1625 CUDA वेळ ऑप्टिमाइझ (ms): 15.9273
आम्ही गतीसाठी 2.76 पट वाढ काढून घेतली (मला माहित आहे, मी मेमरीमधून ऑपरेशनसाठी एका तासासाठी पैसे देत नाही) - अशा साध्या समस्येसाठी, ते करणे वाईट नाही. त्यामुळे, कार्य आणखी सोपे आहे - CPU ते चांगले हाताळू शकते. दुसर्‍या चाचणीवरून पाहिले जाऊ शकते, GPU वर एक साधी अंमलबजावणी CPU वर अंमलबजावणीच्या गतीसाठी प्रोग्राम करण्यास सक्षम असू शकते.
आत्तासाठी एवढेच, आक्षेपार्ह भागावर आम्ही GPU ची हार्डवेअर सुरक्षा आणि समांतर संप्रेषणाचे मुख्य नमुने पाहू शकतो.
सर्व आउटपुट कोड बिटबकेटवर उपलब्ध आहे.

टॅग: टॅग जोडा

- लो-प्रोग्रामिंग इंटरफेसचा संच ( API) इगोर आणि इतर उच्च उत्पादक मल्टीमीडिया पूरक तयार करण्यासाठी. उच्च-उत्पादक ट्रिम चालू करा 2D- І 3D- ग्राफिक्स, ध्वनी आणि परिचय.

डायरेक्ट3डी (D3D) - triviworlds पाहण्यासाठी इंटरफेस आदिम(भौमितिक संस्था). प्रविष्ट करा .

OpenGL(वीड इंग्रजी. ग्राफिक्स लायब्ररी उघडा, अक्षरशः - ओपन ग्राफिक लायब्ररी) - अॅड-ऑन लिहिण्यासाठी क्रॉस-प्लॅटफॉर्म प्रोग्राम करण्यायोग्य सॉफ्टवेअर इंटरफेसचा स्वतंत्र प्रकार परिभाषित करणारा एक तपशील, जो द्वि-आयामी आणि त्रि-आयामी संगणक ग्राफिक्स व्हिकोरिस्ट करतो. साध्या प्रिमिटिव्हमधून फोल्ड करण्यायोग्य थ्री-वर्ल्ड सीन पेंटिंगसाठी 250 हून अधिक फंक्शन्स समाविष्ट आहेत. व्हिडिओ पर्वत, आभासी वास्तविकता, वैज्ञानिक संशोधनातील व्हिज्युअलायझेशनच्या निर्मितीसाठी विजय. व्यासपीठावर खिडक्यासह स्पर्धा करा .

OpenCL(वीड इंग्रजी. संगणकीय भाषा उघडा, शब्दशः - वोडक्रिता मूव्ह गणना) - फ्रेमवर्कविविध ग्राफिक्स ( GPU) आणि ( ). यू फ्रेमवर्क OpenCL mov प्रोग्रामिंग आणि इंटरफेस प्रोग्रामिंग परिशिष्ट प्रविष्ट करा ( API). OpenCLसूचनांच्या स्तरावर आणि डेटाच्या स्तरावर आणि तंत्रज्ञानाच्या अंमलबजावणीवर समांतरता सुनिश्चित करा GPGPU.

GPGPU(संक्षिप्त फॉर्म इंग्रजी) सामान्य-P urpose G raphics P rokussing Units, शब्दशः - GPUजागतिक ओळख) - जागतिक गणनेसाठी व्हिडिओ कार्डचा ग्राफिक प्रोसेसर वापरण्याचे तंत्र, जसे की ते पार पाडणे वाटते.

शेडर(इंग्रजी. शेडर) - संश्लेषित प्रतिमांवर छाया प्रवृत्त करण्यासाठी एक प्रोग्राम, इमेज ऑब्जेक्टच्या अवशिष्ट पॅरामीटर्सचे क्षुल्लक ग्राफिक्स हायलाइट करते. नियमानुसार, त्यात काही प्रमाणात फोल्डिंग, क्लेइंग आणि रोझ लाइटचे वर्णन, टेक्सचर आच्छादन, दुमडलेला आणि तुटलेला, शेडिंग, पृष्ठभागाचे स्थलांतर आणि पोस्ट-प्रोसेसिंग प्रभाव समाविष्ट आहेत. साध्या भौमितिक आकारांच्या मदतीने फोल्डिंग पृष्ठभागांची कल्पना करता येते.

प्रस्तुतीकरण(इंग्रजी. प्रस्तुतीकरण) - व्हिज्युअलायझेशन, संगणक ग्राफिक्समध्ये, सॉफ्टवेअरच्या मदतीने मॉडेलसाठी प्रतिमा घेण्याची प्रक्रिया.

SDK(संक्षिप्त फॉर्म इंग्रजी) सॉफ्टवेअर डेव्हलपमेंट किट) - सॉफ्टवेअर सुरक्षिततेच्या विकासासाठी साधनांचा संच.

सीपीयू(संक्षिप्त फॉर्म इंग्रजी) सेंट्रल प्रोसेसिंग युनिट, शब्दशः - मध्य / मुख्य / डोके मोजणी संलग्नक) - मध्यवर्ती (मायक्रो); संलग्नक, जे vikonu मशीन सूचना; हार्डवेअर सुरक्षेचा एक भाग, जो ऑपरेशन्सची गणना (ऑपरेटिंग सिस्टम आणि ऍप्लिकेशन सॉफ्टवेअरद्वारे सेटिंग्ज) आणि सर्व संलग्नकांच्या कामाचे समन्वय यासाठी जबाबदार आहे.

GPU(संक्षिप्त फॉर्म इंग्रजी) ग्राफिक प्रोसेसिंग युनिट, शब्दशः - ग्राफिकल गणना परिशिष्ट) - ग्राफिक प्रोसेसर; okremy संलग्नक किंवा गेम कन्सोल, जे vikonu ग्राफिक रेंडरिंग (व्हिज्युअलायझेशन). आधुनिक ग्राफिक प्रोसेसर प्रभावीपणे प्रक्रिया करू शकतात आणि संगणक ग्राफिक्सचे वास्तववादी प्रस्तुतीकरण करू शकतात. आधुनिक व्हिडिओ अॅडॉप्टरमधील ग्राफिक प्रोसेसर स्क्रॅम्बलर ट्रायविमिरनॉय ग्राफिक्सप्रमाणे zastosovuetsya, प्रोटीओ योगो काही मोडमध्ये आणि गणनासाठी ( GPGPU).

अडचणी सीपीयू

बर्याच काळापासून, पारंपारिक उत्पादनांच्या उत्पादकतेत वाढ सर्वात महत्वाची म्हणजे घड्याळ वारंवारता (घड्याळाच्या वारंवारतेच्या सुरूवातीच्या उत्पादकतेच्या सुमारे 80%) नंतरच्या वाढीमुळे एक तासाच्या वाढीमुळे होते. एका क्रिस्टलमध्ये ट्रान्झिस्टर. तथापि, घड्याळाची वारंवारता आणखी दूर (3.8 GHz पेक्षा जास्त घड्याळाच्या वारंवारतेवर, चिप्स फक्त जास्त गरम होतात!) अनेक मूलभूत भौतिक अडथळ्यांना सामोरे जातात (तांत्रिक प्रक्रियेचे तुकडे अणूच्या आकाराच्या अगदी जवळ असू शकतात. : , आणि सिलिकॉन अणूचा आकार अंदाजे 0.543 एनएम आहे):

प्रथम, क्रिस्टल विस्तार बदलण्यासाठी आणि घड्याळाची वारंवारता वाढवण्यासाठी, ट्रान्झिस्टरचा प्रवाह वाढवा. कमी तणाव आणि उष्णता कमी होण्यामध्ये वाढ होण्यापर्यंत त्से वेडे;

दुसर्‍या मार्गाने, मेमरीमध्ये संक्रमणादरम्यान घड्याळाच्या सर्वोच्च वारंवारतेत वाढ अनेकदा जॅमद्वारे चालविली जाते, कारण मेमरीमध्ये प्रवेश वाढत्या घड्याळ वारंवारतांशी संबंधित नाही;

तिसरे म्हणजे, पारंपारिक क्रमिक वास्तूंमध्ये काही जोडण्यांसाठी, तथाकथित "व्हॉन न्यूमॅनियन हायस्कूल" द्वारे घड्याळ वारंवारता वाढल्यामुळे ते कुचकामी ठरतात - गणनाच्या सलग प्रवाहाचा परिणाम म्हणून उत्पादकता कमी होते. ज्यांच्यावर सिग्नल ट्रान्समिशनचे रेझिस्टिव्ह-कॅपेसिटिव्ह जॅमिंग आहेत, एकतर अतिरिक्त अरुंद जागेसह किंवा घड्याळाच्या वारंवारतेच्या वाढीसह.

रोसविटोक GPU

त्याच वेळी, च्या विकास GPU:

पाने पडणे 2008 - इंटेल 4-कोरची एक ओळ सादर केली इंटेल कोर i7, जे नवीन पिढीच्या मायक्रोआर्किटेक्चरवर आधारित आहेत नेहलम. प्रोसेसर 26-32 GHz च्या क्लॉक फ्रिक्वेंसीवर कार्य करतात. विकोनानी 45-nm प्रक्रिया तंत्रज्ञानाच्या मागे.

स्तन 2008 - 4-कोरची रोझपोचालिस डिलिव्हरी एएमडी फेनोम II 940(सांकेतिक नाव - देनेब). 45-nm प्रक्रिया तंत्रज्ञानासाठी उत्पादित, 3 GHz च्या वारंवारतेवर उत्पादित.

ट्रॅव्हन 2009 - कंपनी AMDग्राफिक्स प्रोसेसरची आवृत्ती सादर केली ATI Radeon HD 4890कोर घड्याळ वारंवारता 850 MHz वरून 1 GHz पर्यंत वाढली. Tse प्रथम ग्राफिक 1 GHz वर कार्यरत प्रोसेसर. चिपच्या स्ट्रेनची संख्या आणि वारंवारता वाढल्याने 1.36 ते 1.6 टेराफ्लॉप्सपर्यंत वाढ झाली. 800 (!) मोजणी कोर बदलण्यासाठी प्रोसेसर, व्हिडिओ मेमरीला समर्थन GDDR5, DirectX 10.1, ATI CrossFireXआणि इतर सर्व तंत्रज्ञान आधुनिक व्हिडीओ कार्ड मॉडेल्सना उर्जा देणारे. 55-nm तंत्रज्ञानावर आधारित चिपची तयारी.

मूलभूत शक्ती GPU

Vіdminnimi तांदूळ GPU(पासून दुरुस्त ) є:

- आर्किटेक्चर, जास्तीत जास्त पोत आणि फोल्डिंग ग्राफिक वस्तूंची लवचिकता वाढवण्याच्या उद्देशाने;

- उच्च दाब वैशिष्ट्यपूर्ण GPUश्रीमंत, कमी ;

- विशेष कन्व्हेयर आर्किटेक्चरचे नेते, GPUग्राफिक माहितीवर प्रक्रिया करण्यात अधिक कार्यक्षम, कमी.

"शैलीचे संकट"

साठी "शैलीचे संकट". 2005 पर्यंत परिपक्व, - ते स्वतः दिसू लागले. अले, तंत्रज्ञानाच्या विकासाची पर्वा न करता, उत्पादकतेची वाढ लक्षणीय घट झाली. पाणी तास उत्पादकता GPUवाढणे सुरू ठेवा. होय, 2003 पर्यंत. आणि क्रांतिकारी कल्पनेचे स्फटिकीकरण झाले - mіts ग्राफिकच्या गणनेच्या गरजांसाठी vikoristovuvat. ग्राफिकल प्रोसेसर सक्रियपणे "नॉन-ग्राफिकल" गणनेसाठी वापरले जाऊ लागले आहेत (भौतिकशास्त्राचे अनुकरण, सिग्नल प्रक्रिया, संगणकीय गणित/भूमिती, डेटा बेससह ऑपरेशन्स, संगणकीय जीवशास्त्र, संगणकीय अर्थशास्त्र, संगणक विज्ञान).

मुख्य समस्या अशी आहे की प्रोग्रामिंगसाठी कोणतेही मानक इंटरफेस नव्हते GPU. रोझरोब्निकी विकोरिस्टोवुवाली OpenGLकिंवा डायरेक्ट3डीपण ते खूप कठीण होते. महामंडळ NVIDIA(ग्राफिक, मीडिया आणि कम्युनिकेशन प्रोसेसरच्या सर्वात मोठ्या निवडींपैकी एक, तसेच कोरलेस मीडिया प्रोसेसर; 1993 मध्ये स्थापित) एकच मानक विकसित करण्यात गुंतले होते आणि तंत्रज्ञान सादर केले. CUDA.

त्याची सुरुवात कशी झाली

2006 - NVIDIAप्रात्यक्षिक CUDA™; च्या गणनेतील क्रांतीची सुरुवात GPU.

2007 - NVIDIAरिलीझ आर्किटेक्चर CUDA(पोचाटोव्ह आवृत्ती CUDA SDKबुला 15 फेब्रुवारी 2007 रोजी सादर केले); जर्नलमधील "सर्वोत्तम नवीनता" नामांकन लोकप्रिय विज्ञानआणि "Vybіr chitachіv" vіd vidannya HPCWire.

2008 - तंत्रज्ञान NVIDIA CUDAमध्ये "टेक्निकल पेरेवागा" नामांकन जिंकले पीसी मासिक.

काय आहे CUDA

CUDA(संक्षिप्त फॉर्म इंग्रजी) युनिफाइड डिव्हाइस आर्किटेक्चरची गणना करा, शब्दशः - आउटबिल्डिंगच्या आर्किटेक्चरची एकत्रित गणना) - आर्किटेक्चर (सॉफ्टवेअर आणि हार्डवेअरचे उत्तराधिकार) जे कंपनांना अनुमती देते GPUगुप्त कबुलीजबाब गणना, त्याच्या मध्ये GPUव्यावहारिकरित्या थकवणारा स्पिव्हप्रोसेसरची भूमिका बजावत आहे.

तंत्रज्ञान NVIDIA CUDA™- माझ्या प्रोग्रामिंगच्या विकासाचा गाभा सी, जे किरकोळ विक्रेत्यांना ग्राफिक प्रोसेसरच्या तीव्रतेची गणना करण्यासाठी एका तासापेक्षा कमी वेळेत फोल्डिंग गणना कार्यांसाठी प्रोग्राम तयार करण्यास अनुमती देते. जग आधीच लाखो सराव करत आहे GPUसमर्थनासह CUDA, ते हजारो प्रोग्रामर आधीच साधने वापरत आहेत (कोणतीही किंमत नाही!) CUDAजलद जोडण्यासाठी आणि सर्वात प्रगत संसाधन-बचत कार्यांसाठी - व्हिडिओ कोडिंग, ऑडिओ रेकॉर्डिंग, तेल आणि वायू संशोधन, उत्पादन मॉडेलिंग, वैद्यकीय इमेजिंग आणि वैज्ञानिक संशोधन.

CUDAकिरकोळ विक्रेत्याला एक नवीन समांतर गणना आयोजित करून, त्याच्या स्मरणशक्तीला ग्राफिकल वेगवान आणि जपण्यासाठी सूचनांच्या संचामध्ये प्रवेशासह न्यायालयीन तपास आयोजित करण्याची संधी देते. ग्राफिक priskoryuvach іz pіdtrimkoy CUDAआजच्या प्रमाणेच हार्ड-वायर्ड प्रोग्राम केलेले आर्किटेक्चर बनते. सर्व समान, आम्ही ऑर्डररला कमी, कमी आणि उच्च ताब्यात, roblyach मध्ये प्रवेश देतो CUDAकंपाइलर, कॅल्क्युलेटर, गणितीय लायब्ररी, सॉफ्टवेअर प्लॅटफॉर्म यासारख्या गंभीर उच्च-गुणवत्तेच्या साधनांसाठी आवश्यक आधार.

युराल्स्की, तंत्रज्ञानातील अग्रगण्य तज्ञ NVIDIA, porіvnyuyuchi GPUі असे म्हणा: - त्से poshlyahovik. Vіn їzdit zavzhdі की skіz, पण खूप जलद नाही. परंतु GPU- त्से स्पोर्ट्स कार. तुम्ही फक्त घाणेरड्या महागड्या वाईनवर कुठेही जाऊ नका, पण गार्न कव्हर द्या आणि तुम्ही तुमची सर्व स्विडिशपणा दाखवाल, ज्याची पोशल्याखोविकने स्वप्नातही कल्पना केली नसेल! ..».

तंत्रज्ञानाची शक्यता CUDA

CUDA तंत्रज्ञान

व्होलोडिमिर फ्रोलोव्ह,[ईमेल संरक्षित]

गोषवारा

लेख CUDA तंत्रज्ञानाबद्दल सांगते, जे प्रोग्रामरला अधिक विशिष्ट संख्या म्हणून व्हिडिओ कार्ड हॅक करण्यास अनुमती देते. Nvidia-व्युत्पन्न साधने तुम्हाला C++ उपसंचांमध्ये ग्राफिक्स प्रोसेसर (GPU) प्रोग्राम लिहिण्याची परवानगी देतात. हे प्रोग्रामरला शेडर्स वापरण्यास आणि रोबोटिक ग्राफिक्स पाइपलाइनची प्रक्रिया समजून घेण्यास मदत करेल. लेखात, CUDA पर्यायांसह प्रोग्रामिंगचा अनुप्रयोग आणि ऑप्टिमायझेशनच्या विविध पद्धती सादर केल्या आहेत.

1. परिचय

मोजणी तंत्रज्ञानाचा विकास जलद गतीने डझनभर वर्षे टिकून आहे. फ्लोअरिंग श्विदकी आहेत, परंतु त्याच वेळी, प्रोसेसरचे किरकोळ विक्रेते व्यावहारिकपणे तथाकथित "सिलिकॉन डेफ कुटा" पर्यंत गेले. अनेक गंभीर तांत्रिक कारणांमुळे घड्याळाच्या वारंवारतेत अकल्पनीय वाढ होणे अशक्य झाले.

म्हणूनच आधुनिक मोजणी प्रणालीचे सर्व अल्गोरिदम प्रोसेसर आणि कोरच्या संख्येत वाढ करण्यासाठी जातात, एका प्रोसेसरच्या वारंवारतेच्या वाढीसाठी नाही. प्रगत प्रणालींमध्ये सेंट्रल प्रोसेसिंग युनिट (CPU) च्या कोरची संख्या 8 पेक्षा जास्त आहे.

दुसरे कारण म्हणजे रोबोटची कमी गती आणि ऑपरेशनल मेमरी. जसे की प्रोसेसर वेगाने काम करत नाही, अरुंद जागेत, सराव दर्शविल्याप्रमाणे, हे अंकगणित ऑपरेशन्स नाही, तर मेमरी-कॅशे-मिसच्या जवळ आहे.

GPU (ग्राफिक्स प्रोसेसिंग युनिट) च्या बाईक ग्राफिक प्रोसेसरला आश्चर्यचकित करण्यासाठी प्रोट, तेथे, समांतरतेच्या मार्गावर, ते खूप पूर्वीचे होते. सध्याच्या व्हिडिओ कार्ड्समध्ये, उदाहरणार्थ GF8800GTX, प्रोसेसरची संख्या 128 पर्यंत पोहोचू शकते. अशा सिस्टमची उत्पादकता, योग्यरित्या प्रोग्राम केलेली असल्यास, लक्षणीय असू शकते (चित्र 1).

तांदूळ. 1. CPU आणि GPU साठी फ्लोटिंग पॉइंट ऑपरेशन्सची संख्या

जर पहिले व्हिडिओ कार्ड नुकतेच विक्रीसाठी दिसले, तर दुर्गंधी साधी केली जाईल (केंद्रीय प्रोसेसरसह) उच्च-विशेषता विस्तार, जे प्रोसेसरला द्वि-जागतिक डेटाच्या व्हिज्युअलायझेशनमधून बाहेर काढण्यासाठी नियुक्त केले गेले होते. गेमिंग उद्योगाच्या विकासासह आणि डूम (Fig. 2) आणि Wolfenstein 3D (Fig. 3) सारख्या क्षुल्लक खेळांच्या उदयामुळे 3D व्हिज्युअलायझेशनसाठी विनाइल मागणी आहे.

बाळ 2.3. गेम डूम आणि वोल्फेन्स्टाईन 3D

प्रथम Voodoo व्हिडिओ कार्ड, (1996) आणि अगदी 2001 पर्यंत, 3Dfx कंपनीने 2001 च्या आधी GPU मध्ये तयार केले होते, फक्त इनपुट डेटावर ऑपरेशन्सचा संच निश्चित केला होता.

प्रोग्रामरकडे व्हिज्युअलायझेशन अल्गोरिदमचा पर्याय नव्हता आणि लवचिकता वाढली, शेडर्स दिसू लागले - लहान प्रोग्राम जे व्हिडिओ कार्डसह त्वचेच्या शिरोबिंदू आणि त्वचेच्या पिक्सेलची कल्पना करतात. त्यांच्या कार्यांमध्ये शिखरांवर परिवर्तन आणि पॉइंट्समध्ये शेडिंग-लाइटनिंग समाविष्ट होते, उदाहरणार्थ, फॉंग मॉडेलसाठी.

क्षुल्लक परिवर्तन आणि रोस्टरायझेशनच्या उच्च शिक्षण संस्थांसाठी दुर्गंधी विकसित झाली आहे हे समजून घेतल्यानंतर, काही वेळा इच्छित असताना, शेडर्सने अगदी मजबूत विकास देखील काढून घेतला. त्याच वेळी, बहुउद्देशीय समृद्ध प्रोसेसर प्रणालींमध्ये GPUs विकसित होत असताना, मूव्ही शेडर्स उच्च-विशेषतेसह ओव्हररन केले जातात.

माझ्या FORTRAN शी तुलना करणे शक्य आहे की FORTRAN सारख्या दुर्गंधी पहिल्या होत्या, परंतु त्यांना केवळ एकाच प्रकारच्या कार्यासाठी ओळखले गेले. इतर कोणत्याही कार्याच्या परिपूर्णतेसाठी शेडर्सचा फारसा उपयोग होत नाही, क्रिम क्षुल्लक परिवर्तन आणि रास्टरायझेशन, FORTRAN सारखे, कार्य पूर्ण करण्यासाठी योग्य नाही, संख्यात्मक रोझराहुंकीशी संबंधित नाही.

आज, क्वांटम मेकॅनिक्स, तुकडा बुद्धिमत्ता, भौतिक पुनर्रचना, क्रिप्टोग्राफी, भौतिकदृष्ट्या योग्य व्हिज्युअलायझेशन, छायाचित्रांमधून पुनर्रचना, ओळख यांच्या कपाटांमध्ये व्हिज्युअलायझेशनसाठी अपारंपरिक व्हिडिओ कार्ड्सचा ट्रेंड आहे. Qi zavdannya ग्राफिक API (DirectX, OpenGL) च्या बॉर्डरवर बिनदिक्कतपणे कंपन केलेले, qi API चे शार्ड्स इतर zastosuvans द्वारे तयार केले गेले.

GPU वर सामान्य प्रोग्रामिंगच्या विकासामुळे (GPU, GPGPU वर सामान्य प्रोग्रामिंग) तार्किकदृष्ट्या उत्पादनाच्या विस्तृत क्षेत्रासाठी, कमी रोस्टरायझेशनच्या उद्देशाने तंत्रज्ञानाचे समर्थन केले गेले. परिणामी, Nvidia ने कॉम्प्युट युनिफाइड डिव्हाइस आर्किटेक्चर तंत्रज्ञान (किंवा थोडक्यात CUDA) तयार केले आणि ATI, जे स्पर्धा करते, त्यांनी STREAM तंत्रज्ञान तयार केले.

हे लक्षात घेतले पाहिजे की हा लेख लिहिण्याच्या वेळी, STREAM तंत्रज्ञान CUDA च्या विकासाच्या बाजूने होते आणि ते येथे पाहिले जाऊ शकत नाही. आम्ही CUDA - GPGPU तंत्रज्ञानावर लक्ष केंद्रित करतो, जे तुम्हाला एकाधिक C++ चित्रपटांमध्ये प्रोग्राम लिहिण्याची परवानगी देते.

2. CPU आणि GPU मधील मुख्य फरक

मध्यवर्ती प्रोसेसर आणि व्हिडिओ कार्डमधील प्रदेश आणि विशिष्ट वैशिष्ट्यांमधील फरकांचे तपशील थोडक्यात पाहू या.

२.१. शक्यता

सीपीयू मास्टर प्लॅन कार्यान्वित करण्यासाठी आणि मेमरी बाहेर कार्य करण्यासाठी संलग्नकांचा एक समूह आहे, ज्याला योग्यरित्या संबोधित केले आहे. CPU वरील प्रोग्राम्स एका रेखीय किंवा एकसंध मेमरीच्या मध्यभागी कोणत्याही व्यत्ययाशिवाय डाउनलोड केले जाऊ शकतात.

GPU साठी, ते वाईट नाही. तुम्हाला माहिती आहे की, हा लेख वाचल्यानंतर, CUDA 6 प्रकारच्या मेमरी पाहू शकते. तुम्ही जे काही मधल्यामधून वाचू शकता, भौतिकदृष्ट्या प्रवेशयोग्य आहे, परंतु लिहा - मध्यभागी नाही. कारण हे आहे की जीपीयू, कोणत्याही परिस्थितीत, एक विशिष्ट अॅड-ऑन आहे, आम्ही ते विशिष्ट हेतूंसाठी ओळखतो. zbіlshennya svydkostі रोबोट्स singhnyh algogorіvіv і zvіzhennya vartosti і obladannya साठी Tse obezhennya zaprovadzhennja.

२.२. स्वीडिश मेमरी कोड

अधिक संगणकीय प्रणालीची समान समस्या ही आहे की मेमरी प्रोसेसरपेक्षा अधिक कार्यक्षम आहे. CPU हॅकर्स एक प्रकारे कॅशेचे उल्लंघन करत आहेत. बहुतेक वेळा, मेमरी शिफ्टिंग सुपर-ऑपरेशनल किंवा कॅशे मेमरीमध्ये चालते, जी प्रोसेसरच्या वारंवारतेवर कार्य करते. त्से तुम्हाला मृत्यूपासून मृत्यूपर्यंत एक तास सोडण्याची परवानगी देतो, जे बहुतेक वेळा विजयी होते आणि शक्य तितक्या चांगल्या प्रकारे प्रोसेसरला झवाझवीत.

आदरपूर्वक, प्रोग्रामरसाठी, कॅशे व्यावहारिकदृष्ट्या स्पष्ट आहेत. जसे वाचताना, लिहिताना, डेटा एकदा ऑपरेशनल मेमरीमध्ये घेतला जात नाही, परंतु कॅशेमधून जातो. त्से मला, झोक्रेमा, एंट्रीनंतरच्या दिवसाचा अर्थ पटकन वाचण्याची परवानगी द्या.

GPU वर (येथे तुम्ही 8 व्या मालिकेतील GF व्हिडिओ कार्ड वापरू शकता) कॅशे देखील महत्त्वपूर्ण आहेत, परंतु यंत्रणा CPU सारखी कठीण नाही. प्रथमतः, स्मरणशक्तीच्या प्रकारांबद्दल पूर्ण वेड मिळवणे, परंतु वेगळ्या प्रकारे, कॅशेचा सराव केवळ वाचनातून केला जातो.

GPU वर, अतिरिक्त समांतर गणनेसाठी पैसे देण्याचे लक्षात ठेवण्यासाठी पुरेसा वेळ आहे. काही काळासाठी, एक zavdannya डेटा तपासतो, pratsyut іnshі, गणना करण्यास तयार आहे. हे CUDA च्या मुख्य तत्त्वांपैकी एक आहे, जे आपल्याला संपूर्ण सिस्टमची उत्पादकता मोठ्या प्रमाणात वाढविण्यास अनुमती देते.

3. CUDA कोर

३.१. फ्लो मॉडेल

CUDA चे संख्यात्मक आर्किटेक्चर संकल्पनेवर आधारित आहेअनामित डेटासाठी एक टीम(सिंगल इंस्ट्रक्शन मल्टिपल डेटा, SIMD) मल्टीप्रोसेसर.

SIMD ची संकल्पना वापरली जाऊ शकते, ती एक सूचना तुम्हाला एकाच वेळी निनावी डेटा गोळा करण्याची परवानगी देते. उदाहरणार्थ, Pentium 3 प्रोसेसर आणि नवीन Pentium मॉडेल्समधील addps कमांड तुम्हाला एकाच वेळी 4 एकल-परिसिजन फ्लोटिंग पॉइंट क्रमांक जोडण्याची परवानगी देते.

मल्टीप्रोसेसर एक मल्टी-कोर SIMD प्रोसेसर आहे ज्याच्या सर्व कोरांवर फक्त एक सूचना आहे. मल्टीप्रोसेसर कोरची त्वचा स्केलर नाही, म्हणून. ते शुद्ध मार्गाने वेक्टर ऑपरेशनला समर्थन देत नाही.

टिमच्या आधी, कसे सुरू ठेवायचे, आम्ही काही भेटींची ओळख करून देऊ. विशेष म्हणजे, या आकडेवारीच्या संलग्नक आणि होस्ट अंतर्गत, बहुसंख्य प्रोग्रामरनी ज्यांना कॉल केले आहे ते नाही. CUDA दस्तऐवजीकरणातील फरक टाळण्यासाठी आम्ही अशा अटी वापरू.

डिव्हाइस (डिव्हाइस) अंतर्गत, आमच्या लेखात एक वाजवी व्हिडिओ अॅडॉप्टर आहे जो CUDA ड्रायव्हरला समर्थन देतो, किंवा संलग्नकांच्या इतर स्पेशलायझेशन, प्रोग्रामिंग प्रोग्रामसाठी असाइनमेंट जे CUDA वापरतात (उदाहरणार्थ, NVIDIA Tesla सारखे). आमच्या लेखात, आम्ही पाहू शकतो की GPU ला तार्किक ताब्यात घेण्यासारखे कमी आहे, अंमलबजावणीच्या विशिष्ट तपशीलांसाठी अद्वितीय आहे.

होस्ट (होस्ट) हे संगणकाच्या मुख्य ऑपरेटिव्ह मेमरीमधील प्रोग्रामचे नाव आहे, सीपीयू ओव्हरराइड करणे आणि संलग्नकसह रोबोटच्या मुख्य कार्यांचे ओव्हरराइड करणे.

खरं तर, तुमच्या प्रोग्रामचा तो भाग जो CPU वर काम करतोयजमान आणि तुमचे व्हिडिओ कार्ड -संलग्नक तार्किकदृष्ट्या, तुम्ही मल्टीप्रोसेसर (लहान ४) आणि CUDA ड्रायव्हरचा संच म्हणून अर्ज करू शकता.

तांदूळ. 4. संलग्नक

समजा आम्हाला आमच्या विस्तारावर N थ्रेड्समध्ये एक प्रक्रिया चालवायची आहे (म्हणूनच आम्हाला रोबोटला समांतर करायचे आहे). जोपर्यंत CUDA दस्तऐवजीकरण जाते, त्या प्रक्रियेला कर्नल म्हणू या.

CUDA आर्किटेक्चरची वैशिष्ठ्यता ही एक ब्लॉक-चाळणी संस्था आहे, जी समृद्ध प्रवाह ऍडिटीव्ह (Fig. 5) द्वारे मर्यादित नाही. CUDA ड्रायव्हर स्वतंत्रपणे संसाधने वितरीत करतो आणि थ्रेड्स दरम्यान तयार करतो.

तांदूळ. 5. प्रवाहांचे संघटन

अंजीर वर. 5. कर्नल कर्नल म्हणून नियुक्त केले आहे. कोअरवर आदळणारे सर्व थ्रेड ब्लॉक्स (ब्लॉक) मध्ये एकत्र केले जातात आणि ब्लॉक्स त्यांच्या स्वतःच्या स्वभावानुसार, ग्रिड (ग्रिड) मध्ये एकत्र केले जातात.

आकृती 5 मधून पाहिल्याप्रमाणे, प्रवाह ओळखण्यासाठी द्वि-जागतिक निर्देशांक वापरले जातात. CUDA rozrobniks ने प्रोग्रामर किती सुलभ आहे यावर अवलंबून, trivum, टू-वर्ल्ड किंवा साधे (एकल-वर्ल्ड) निर्देशांकांसह कार्य करण्याची शक्यता दिली आहे.

वन्य प्रकारात, निर्देशांक वेक्टरद्वारे क्षुल्लक आहे. डर्मल थ्रेडसाठी, खालील दिले जाईल: थ्रेडआयडीएक्स ब्लॉकच्या मध्यभागी असलेल्या थ्रेडची अनुक्रमणिका आणि ब्लॉकआयडीएक्स ग्रिडच्या मध्यभागी असलेल्या ब्लॉकची अनुक्रमणिका. स्टार्टअपवर, सर्व थ्रेड्स आणखी अनुक्रमणिकेशिवाय रीफ्रेश केले जातील. खरं तर, क्यूई इंडेक्सद्वारे, प्रोग्रामर नियंत्रण नियंत्रित करतो, हे सूचित करतो की त्याचा एक भाग त्वचेच्या घामामध्ये प्रक्रिया करतो.

पुरवठ्याचे पुरावे, किरकोळ विक्रेत्यांनी अशा संस्थेलाच का काढून घेतले, हे क्षुल्लक नाही. एक कारण असे दिसते की एक ब्लॉक जिंकण्याची हमी आहेएकावर मी एक मल्टीप्रोसेसर जोडेन, परंतु एक मल्टीप्रोसेसर विविध ब्लॉक्सचा स्प्रॅट जिंकू शकतो. क्लिअर करण्याची इतर कारणे लेखाचा तास देण्यात आली होती.

टास्कचा ब्लॉक (प्रवाह) मल्टीप्रोसेसरवर वार्प नावाच्या भाग किंवा पूलद्वारे मारला जातो. CUDA सपोर्टवरून व्हिडिओ कार्ड्समध्ये सध्याच्या क्षणासाठी वार्पचा विस्तार 32 प्रवाहांपर्यंत आहे. वार्प पूलच्या मध्यभागी असलेल्या कमांड्स SIMD स्टाइल्सवर सेट केल्या आहेत, म्हणजे. तानेच्या मध्यभागी असलेल्या सर्व धाग्यांना एका वेळी एकच सूचना असू शकते.

येथे पुढील चेतावणी आहे. हा लेख लिहिण्याच्या वेळी सध्या असलेल्या आर्किटेक्चरमध्ये, एका मल्टीप्रोसेसरच्या मध्यभागी प्रोसेसरची संख्या 8 आहे, 32 नाही. यामुळे, हे स्पष्ट आहे की सर्व वार्प एकाच वेळी मारले जात नाहीत, ते 4 मध्ये मोडले जातात. भाग, ते अनुक्रमे मारले जातात (कारण प्रक्रिया).

अले, सर्व प्रथम, CUDA किरकोळ विक्रेते तानाच्या आकाराचे नियमन करत नाहीत. त्यांच्या रोबोट्समध्ये, दुर्गंधी 32 क्रमांकाचा नसून वार्प साइज पॅरामीटर सेट करते. वेगळ्या पद्धतीने, तार्किक दृष्टिकोनातून, वॉर्प हा प्रवाहाचा किमान पूल आहे, ज्याबद्दल कोणीही असे म्हणू शकतो की सर्व वाहते सायकलच्या मध्यभागी एकाच वेळी मोजले जातात - आणि प्रत्येक दिवसासह, सोडवण्याची परवानगी द्या प्रणाली खंडित होणार नाही.

3.1.1. डिसल्टिंग

बरं, तुम्ही अन्नाला दोष देता: जर त्याच क्षणी, तानाच्या मध्यभागी असलेले सर्व प्रवाह तेच निर्देश टाइप करत असतील, तर तुम्हाला कसे साफ करता येईल? प्रोग्राम कोड साफ केला असला तरीही, सूचना वेगळ्या असतील. येथेच मानक SIMD प्रोग्रामिंग सोल्यूशन कार्यात येते (आकृती 6).

तांदूळ. 6. SIMD मध्ये डीबगिंगची संस्था

पुढील कोड वर या:

जर (अटी)ब;

SISD (सिंगल इंस्ट्रक्शन सिंगल डेटा) च्या बाबतीत, ऑपरेटर A चे विकोन्युएड केले जाते, ते मनाने पुन्हा सत्यापित केले जाते, नंतर ऑपरेटर B आणि D चे व्हिकोनेटेड केले जातात (म्हणून मन खरे आहे).

आता 10 प्रवाह आहेत जे SIMD च्या शैलीत लिहिलेले आहेत. सर्व 10 प्रवाहांमध्ये, आम्ही ऑपरेटर A अयशस्वी होतो, नंतर आम्ही मानसिक स्थिती तपासतो आणि असे दिसून येते की 10 पैकी 9 प्रवाहांमध्ये ते खरे आहे आणि एका प्रवाहात ते वाईट आहे.

मला समजले की ऑपरेटर बी च्या अंमलबजावणीसाठी आम्ही 9 थ्रेड आणि ऑपरेटर सीच्या अंमलबजावणीसाठी एक थ्रेड चालवू शकत नाही, म्हणून एका तासात सर्व थ्रेडसाठी फक्त एक सूचना चालविली जाऊ शकते. या वाफडकामध्ये हे असे जोडणे आवश्यक आहे: भांडे डोक्याच्या मागील बाजूस "आत चालविले" आहे, जेणेकरून ते साफ केले जाईल, जेणेकरून वाइनने कोणतीही खंडणी दिली नाही, आणि 9 प्रवाह घेतले गेले, जे बाकी होते. बाहेर ऑपरेटर B ला हरवणारे 9 थ्रेड "ड्राइव्ह इन" करू आणि ऑपरेटर C सोबत एक थ्रेड पास करू. पुढील थ्रेड्स पुन्हा एकत्र केले जातात आणि ऑपरेटर D ला एकाच वेळी हरवतात.

एक सारांशित परिणाम आहे: प्रवाहातील लढायांच्या रिकाम्या स्मरणात केवळ प्रोसेसरची संसाधने काढून टाकली जात नाहीत, जे खंडित झाले आहेत, इतके श्रीमंत आहेत, ओबिगी गिल्कीच्या पराभवामुळे आम्हाला लाज वाटेल.

तथापि, सर्वकाही इतके वाईट नाही, जसे आपण पहिल्या दृष्टीक्षेपात पाहू शकता. तंत्रज्ञानाच्या मोठ्या फायद्यासाठी, आपण ते पाहू शकता जे गतिशीलपणे CUDA ड्राइव्हर चालविण्यावर लक्ष केंद्रित करतात आणि प्रोग्रामरसाठी दुर्गंधी स्पष्ट आहे. त्याच वेळी, आधुनिक CPUs मधील SSE कमांडसह धावणे (एकाच वेळी अल्गोरिदमच्या 4 प्रती वापरून पहा), प्रोग्रामर स्वतः तपशीलांसाठी जबाबदार आहे: चारने डेटा एकत्र करा, स्क्रीनिंगबद्दल विसरू नका आणि येथे लिहायला सुरुवात करा कमी पातळी, खरं तर, असेंबलर प्रमाणे.

वर नमूद केलेल्या मिशातून आणखी एक आदरणीय विस्नोव्होक. Razgaluzhennya शक्तिशाली शक्तींद्वारे उत्पादकता कमी होण्याचे कारण आहे. Shkidlivimi є tі razgaluzhennya पेक्षा कमी, ज्यावर ताना प्रवाहांच्या एका तलावाच्या मध्यभागी प्रवाह वळतात. काही प्रकरणांमध्ये, प्रवाह एका ब्लॉकच्या मधोमध पसरले आहेत, परंतु वेगवेगळ्या वॉर्प पूलमध्ये किंवा वेगवेगळ्या ब्लॉक्सच्या मध्यभागी, कोणताही परिणाम न होता.

३.१.२. प्रवाहांमधील परस्परसंवाद

हा लेख लिहिताना, थ्रेड्समधील परस्परसंवाद (डेटा सिंक्रोनाइझेशन आणि एक्सचेंज) फक्त ब्लॉकच्या मध्यभागी शक्य होते की नाही. म्हणूनच, कमी दस्तऐवजीकरण क्षमतांसह गंजणारा असल्याने, वेगवेगळ्या ब्लॉक्सच्या प्रवाहांमध्ये परस्पर आयोजित करणे अशक्य आहे.

दस्तऐवजीकरण नसलेल्या शक्यता असल्या तरी, त्यांना सुशोभित करण्याची शिफारस केलेली नाही. कारण दुर्गंधी इतर प्रणालीच्या विशिष्ट हार्डवेअर वैशिष्ट्यांवर आधारित आहे.

ब्लॉकच्या मध्यभागी असलेल्या सर्व कार्यांचे सिंक्रोनाइझेशन __synchtreads फंक्शन कॉलद्वारे नियंत्रित केले जाते. पैशाची देवाणघेवाण मेमरीद्वारे शक्य आहे, जी विभागली गेली आहे, म्हणून ब्लॉकच्या मध्यभागी असलेल्या सर्व कार्यांसाठी ते इतके महत्वाचे आहे.

३.२. स्मृती

CUDA मध्ये सहा प्रकारची मेमरी असते (चित्र 7). सीई रजिस्टर, स्थानिक, जागतिक, वितरित, स्थिर आणि टेक्सचर मेमरी.

एवढी मोठी संख्या व्हिडीओ कार्डच्या वैशिष्ट्यांमुळे आणि पहिल्या ओळखींमुळे प्रभावित झाली आहे, तसेच किरकोळ विक्रेत्यांनी याकोमोगा प्रणाली स्वस्त बनवण्यासाठी, सार्वत्रिक किंवा स्वीडिश वेगवेगळ्या मार्गांनी त्याग केला आहे.

तांदूळ. 7. CUDA ची स्मृती पहा

३.२.०. रजिस्ट्री

शक्यतोवर, कंपाइलर सर्व स्थानिक बदललेली फंक्शन्स रजिस्टर्समध्ये ठेवण्याचा प्रयत्न करतो. अशा बदलांमध्ये प्रवेश कमाल गतीपर्यंत मर्यादित आहे. स्ट्रीमिंग आर्किटेक्चरमध्ये प्रति मल्टीप्रोसेसर 8192 32-बिट रजिस्टर उपलब्ध आहेत. एका थ्रेडसाठी किती रजिस्टर्स उपलब्ध आहेत हे निर्धारित करण्यासाठी, तुम्हाला प्रति ब्लॉक आकार (8192) संख्या (नवीन थ्रेड्सची संख्या) विभाजित करणे आवश्यक आहे.

64 प्रवाहांच्या मोठ्या संख्येसह, एकूण 128 नोंदणी ब्लॉकमध्ये प्रवेश करतील (काही वस्तुनिष्ठ निकष आहेत, परंतु श्रीमंत नोकऱ्यांसाठी 64 मध्यभागी असले पाहिजेत). खरोखर, 128 रजिस्टर्स nvcc अजिबात पाहिले जाऊ शकत नाहीत. VIN ला कॉल करा, 40 पेक्षा जास्त देऊ नका, परंतु स्थानिक मेमरीमध्ये बदललेले हटवा. त्यामुळे असे दिसते की एका मल्टीप्रोसेसरवर, ब्लॉक्सचा एक भाग जिंकला जाऊ शकतो. कंपायलर एकाच वेळी प्रक्रिया करू शकणार्‍या ब्लॉक्सची संख्या वाढवण्याचा प्रयत्न करेल. अधिक कार्यक्षमतेसाठी, तुम्हाला ३२ पेक्षा कमी रजिस्टर्स घेणे आवश्यक आहे. मग, सैद्धांतिकदृष्ट्या, तुम्ही एका मल्टीप्रोसेसरवर 4 ब्लॉक्स (8 warp-іv, त्यामुळे एका ब्लॉकमध्ये 64 थ्रेड्स) चालवू शकता. तथापि, येथे थ्रेड्समध्ये व्यस्त असलेल्या सामायिक मेमरीचे संरक्षण करणे अधिक आवश्यक आहे, जेणेकरुन जर एका ब्लॉकने सामायिक केलेली सर्व मेमरी घेतली, तर असे दोन ब्लॉक एकाच वेळी मल्टीप्रोसेसरद्वारे व्यापले जाऊ शकत नाहीत.

३.२.१. स्थानिक मेमरी

जर, प्रक्रियांचा स्थानिक डेटा खूप जागा घेत असेल किंवा कंपायलर शेवटच्या वेळी त्याची गणना करू शकत नसेल, तर तुम्ही ते स्थानिक मेमरीमध्ये ठेवू शकता. ज्यांना तुम्ही स्वीकारू शकता, उदाहरणार्थ, विविध प्रकारच्या विस्तारांचे दिलेले निर्देशक.

भौतिकदृष्ट्या, स्थानिक मेमरी हे जागतिक मेमरीचे एक अॅनालॉग आहे आणि ते tієyu आणि swidkіst सह कार्य करते. लेख लिहिण्याच्या वेळी, विशिष्ट बदलांसाठी स्थानिक मेमरी वापरून कंपाइलरला स्पष्टपणे पुनर्प्राप्त करण्याची परवानगी देणारी कोणतीही ज्ञात यंत्रणा नव्हती. vikoristovuvat її zovsіm (div. विभाग 4 "अनुकूलनासाठी शिफारसी") ऐवजी स्थानिक मेमरी तपासणे महत्वाचे आहे.

३.२.२. जागतिक स्मृती

CUDA दस्तऐवजीकरण हे मुख्य यशांपैकी एक आहेजागतिक स्मृती पुरेशी अॅड्रेसिंगची शक्यता निर्माण करण्यासाठी तंत्रज्ञान. त्यामुळे तुम्ही मेमरीच्या कोणत्याही मधोमध वाचू शकता आणि तुम्ही ठराविक मध्यभागी तशाच प्रकारे लिहू शकता (GPU वर, ते तसे वाटत नाही).

swidkistyu रडणे आणले जाऊ वेळा मध्ये अष्टपैलुत्व साठी संरक्षण. ग्लोबल मेमरी कॅशे केलेली नाही. Vaughn pratsyuє आणखी povіlno, kіlkіst zvernenі जागतिक मेमरी sіd कोणत्याही वेळी minimizuvati.

रोबोटिक प्रोग्राम्सचे परिणाम होस्टवर (डिफॉल्ट DRAM मेमरीवर) संपादित करण्यापूर्वी ते जतन करण्यासाठी ग्लोबल मेमरी आवश्यक आहे. याचे कारण असे की मेमरी ग्लोबल आहे - एकच प्रकारची मेमरी जी रेकॉर्ड केली जाऊ शकते.

बदल, क्वालिफायर __ग्लोबल__ सह आवाज दिला, जगाच्या स्मरणात ठेवला. होस्टवरील cudaMalloc(void* mem, int size) फंक्शनला कॉल करून ग्लोबल मेमरी डायनॅमिकली देखील पाहिली जाऊ शकते. मी हे फंक्शन जोडेन, ते कॉल करणे शक्य नाही. असे वाटते की होस्ट प्रोग्राम मेमरीची काळजी घेऊ शकतो, CPU वर काय कार्य करते. तुम्ही cudaMemcpy फंक्शनवर क्लिक करून होस्टकडून डेटा ओव्हरराइड करू शकता:

cudaMemcpy(void* gpu_mem, void* cpu_mem, int आकार, cudaMemcpyHostToDevice);

म्हणून आपण स्वतः उलट प्रक्रिया सुरू करू शकता:

cudaMemcpy(void* cpu_mem, void* gpu_mem, int आकार, cudaMemcpyDeviceToHost);

हे विकी यजमानाकडून देखील कार्य करते.

जागतिक मेमरीसह काम करताना, कोलेसिंग नियम लक्षात ठेवणे महत्वाचे आहे. मुख्य कल्पना अशी आहे की मेमरीचा तिसरा भाग शेवटच्या मधल्या मेमरीपर्यंत संग्रहित केला जातो, शिवाय, 4.8 किंवा 16 बाइट्स. यासह, प्रथम थ्रेड पत्त्यासाठी झॅपिंगसाठी दोषी आहे, कॉर्डनवर कंपन करते, स्पष्टपणे 4.8 किंवा 16 बाइट्स. cudaMalloc द्वारे फिरवलेले पत्ते सीमा ओलांडून किमान 256 बाइट्स आहेत.

३.२.३. काय विभागले जात आहे ते लक्षात ठेवा

जी स्मृती विभागली जात आहे ती कॅशे करण्यायोग्य नाही, परंतु मेमरी जलद आहे. कॅशे चेक म्हणून व्हायकोरेट करण्याची शिफारस केली जाते. प्रति मल्टीप्रोसेसर एकूण 16KB सामायिक मेमरी उपलब्ध आहे. ब्लॉकमधील दिवसांच्या संख्येने संख्या विभाजित करून, आम्ही एका प्रवाहासाठी उपलब्ध असलेली जास्तीत जास्त मेमरी घेतो (जसे की ते सर्व प्रवाहांमधून स्वतंत्रपणे जिंकण्याची योजना आहे).

वाटून घेतलेला तांदूळ लक्षात ठेवा, जे मध्यम ब्लॉकच्या सर्व नेत्यांसाठी समान संबोधित केले जातात (चित्र 7). हे स्पष्ट आहे की प्रवाहांमधील डेटाच्या देवाणघेवाणीसाठी तुम्ही फक्त एक ब्लॉक जिंकू शकता.

याची हमी आहे की एका तासासाठी मल्टीप्रोसेसरवरील ब्लॉक मेमरीमध्ये संग्रहित केला जाईल. तथापि, मल्टीप्रोसेसरवर ब्लॉक बदलला असल्याने, त्याऐवजी जुना ब्लॉक जतन केला जाईल याची खात्री नाही. म्हणूनच ब्लॉक्समधील कार्ये सिंक्रोनाइझ करण्याचा प्रयत्न करणे, त्यांना डेटा म्हणून मेमरीमध्ये ठेवणे आणि त्यांच्या बचतीवर अवलंबून राहणे पुरेसे नाही.

बदल, __shared__ क्वालिफायरसह आवाज दिला जातो, ते शेअर केलेल्या मेमरीमध्ये ठेवले जातात.

shared_float mem_shared;

पुढच्या वेळी, आश्वासन द्या, मेमरी काय आहे, काय विभागले जात आहे, फक्त ब्लॉकसाठी. यासाठी, अॅरेच्या विविध घटकांचा शोध घेतल्यानंतर कॅशे कॅशेप्रमाणेच हॅक करणे आवश्यक आहे, उदाहरणार्थ:

float x = mem_shared;

De threadIdx.x – ब्लॉकच्या मध्यभागी असलेल्या थ्रेडचा अनुक्रमणिका x.

३.२.४. सतत स्मृती

अंजीर मध्ये पाहिल्याप्रमाणे, स्थिर मेमरी कॅश केली जाते. 4. कॅशे एका मल्टीप्रोसेसरच्या एकाच प्रसंगात वापरला जातो, जो मध्य ब्लॉकचे मुख्य कार्य देखील आहे. होस्टवर, तुम्ही cudaMemcpyToSymbol फंक्शनला कॉल करून स्थिर मेमरीवर लिहू शकता. मी एक सतत मेमरी जोडेन जी फक्त वाचण्यासाठी उपलब्ध आहे.

विकोरिस्तानसाठी सतत मेमरी अधिक सोयीस्कर आहे. तुम्ही niy danі मध्ये rozmіschuvati करू शकता- साध्या आकर्षणाच्या मदतीसाठी ते कोणत्या प्रकारचे їх वाचा.

# N 100 परिभाषित करा

Constant__int gpu_buffer[N];

व्हॉइड होस्ट_फंक्शन()

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 Kbytes (संपूर्ण संलग्नकांसाठी) पेक्षा कमी होते. हे इतके स्पष्ट का आहे की संदर्भित मेमरीमध्ये केवळ काही डेटा जतन करणे ही एक अर्थ आहे जी बर्याचदा विजयी होते.

३.२.५. टेक्सचर मेमरी

टेक्सचर मेमरी कॅश केली आहे (चित्र 4). स्किन मल्टीप्रोसेसरसाठी, फक्त एक कॅशे आहे, म्हणून संपूर्ण कॅशे संपूर्ण मध्यम ब्लॉकसाठी सर्वात मोठी आहे.

टेक्सचर मेमरीचे नाव (आणि, दुर्दैवाने, कार्यक्षमता) "पोत" आणि "टेक्श्चरिंग" समजण्यासाठी अवनत केले आहे. टेक्सचरिंग - रास्टरायझेशन प्रक्रियेदरम्यान बहुभुजावर पोत (फक्त चित्रे) लागू करण्याची प्रक्रिया. टेक्सचर मेमरी 2D डेटासाठी ऑप्टिमाइझ केली आहे आणि शक्य आहे:

    shvidka vibirka एक निश्चित rozmіru चे मूल्य (बाइट, शब्द, सबवाइन किंवा चार-शब्द) एक- किंवा दोन-जागतिक अॅरेमधून;

    अंतराने फ्लोट क्रमांकांद्वारे सामान्यीकृत पत्ता. 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, टेक्सचर , gpu_memory , N ) // चला मेमरी टेक्सचरमध्ये बदलू

    cudaMemcpy(gpu_memory, cpu_buffer, N*sizeof(uint 4), cudaMemcpyHostToDevice ); // डेटा कॉपी कराGPU

    // __global__ म्हणजे device_kernel एक कर्नल आहे, म्हणून ते समांतर करणे आवश्यक आहे

    Global__void device_kernel()

    uint4 a = tex1Dfetch(पोत,0); // आपण अशा प्रकारे अधिक डेटा निवडू शकता!

    uint4 b = tex1Dfetch(पोत,1);

    int c = a.x*b.y;

    ...

    ३.३. साधी बट

    एक साधा बट म्हणून, CUDA SDK वरून cppIntegration प्रोग्रामकडे एक नजर टाकण्याची सूचना केली आहे. वॉनने CUDA वर्कफ्लो, तसेच MS Visual Studio ची Nvcc (Nvidia साठी विशेष C++ कंपाइलर) आवृत्ती दाखवली, जी CUDA वर प्रोग्राम्सचा विकास सुलभ करेल.

    ४.१. आपल्या बॉसचा पराभव योग्यरित्या पार पाडा

    SIMD आर्किटेक्चरसाठी सर्व कार्ये योग्य नाहीत. उदाहरणार्थ, तुमचे कार्य ज्यांच्यासाठी संलग्न नाही, ते शक्य आहे, GPU वापरणे शक्य नाही. आणि तरीही, आपण GPU युक्त्यांचे कठोरपणे उल्लंघन केले आहे, अशा भागांमध्ये अल्गोरिदम खंडित करणे आवश्यक होते, जेणेकरून दुर्गंधी SIMD शैलीला प्रभावीपणे पराभूत करू शकेल. हे आवश्यक आहे - आपल्या कार्याच्या सुधारणेसाठी अल्गोरिदम बदलण्यासाठी, एक नवीन घेऊन या - जे SIMD साठी चांगले असेल. GPU च्या वेगळ्या क्षेत्राचे उदाहरण म्हणून, आपण अॅरेमधील घटकांचे पिरॅमिडल फोल्डिंग लागू करू शकता.

    ४.२. मेमरी प्रकार निवडा

    तुमचा डेटा टेक्सचर किंवा कॉन्स्टंट मेमरीमध्ये ठेवा, जेणेकरून एका ब्लॉकची सर्व टास्क एका मेमरी स्लॉटमध्ये रूपांतरित केली जातील किंवा स्टॅक केलेल्या स्लॉटच्या जवळ जातील. अतिरिक्त टेक्स्ट2डीफेच आणि टेक्स्ट2डी फंक्शन्स वापरून दोन डेटावर कार्यक्षमतेने प्रक्रिया केली जाऊ शकते. टेक्सचर मेमरी दोन जगांसाठी खास ऑप्टिमाइझ केली आहे.

    विभाजित केल्या जात असलेल्या मेमरीमधून जागतिक मेमरीवर विजय मिळवा, कारण सर्व कार्ये वेगवेगळ्या, दूरगामी एका प्रकारच्या मेमरी स्थानांवर (वेगवेगळ्या पत्त्यांसह किंवा समन्वयांसह, 2D / 3D डेटासह) वितरीत केल्या जातात.

    ग्लोबल मेमरी => स्मृती जी विभाजित आहे

    सिंकथ्रेड्स();

    मेमरीमध्ये डेटा गोळा करा

    सिंकथ्रेड्स();

    जागतिक स्मृती<= разделяемая память

    ४.३. स्मृती च्या lichniks आठवण करून द्या

    कंपाइलरचा ध्वज --ptxas-options=-v तुम्हाला व्हिक्टोरिस्टमध्ये नेमके कोणते शब्द आणि कोणती मेमरी (रजिस्ट्रीज, वितरित, स्थानिक, स्थिर) सांगण्याची परवानगी देतो. कंपाइलर स्थानिक मेमरी वापरत असल्याने, तुम्हाला त्याबद्दल माहिती आहे. विजयी असलेल्या मेमरीच्या संख्या आणि प्रकारांवरील डेटाचे विश्लेषण आपल्याला प्रोग्राम ऑप्टिमायझेशनमध्ये मोठ्या प्रमाणात मदत करू शकते.

    ४.४. शेअर केलेल्या नोंदी आणि आठवणींची संख्या कमी करण्याचा प्रयत्न करा

    वार्प रजिस्टरचा गाभा जितका मोठा असेल किंवा मेमरी विभाजित केली जाईल तितके कमी प्रवाह (प्राथमिक वार्प-iv) एकाच वेळी मल्टीप्रोसेसरवर जिंकू शकतात, कारण मल्टीप्रोसेसरच्या संसाधनांची देवाणघेवाण केली जाते. त्यामुळे, नोंदींच्या व्यापात थोडीशी वाढ आणि ज्या आठवणींचा विस्तार केला जात आहे, यामुळे काही प्रकरणांमध्ये दोन घटकांनी उत्पादकता कमी होऊ शकते - अगदी आता वॉर्प-इन पेक्षा दुप्पट कमी असलेल्यांद्वारे. एकदा मल्टीप्रोसेसरवर.

    ४.५. स्मृती काय विभागली जात आहे, स्थानिक उप.

    जणू काही Nvidia कंपाइलरमुळे स्थानिक मेमरी 'yat, scho razdelyaetsya (सामायिक मेमरी) मध्ये डेटा गमावला गेला.

    बहुतेक वेळा कंपाइलर स्थानिक मेमरीमध्ये बदलला जाऊ शकतो, कारण तो खूप वेळा उचलला जात नाही. उदाहरणार्थ, बॅटरी आहे devi जमा मूल्ये, rozrakhovuyuschos s tsiklі. obsyagi कोड साठी एक उत्तम सायकल प्रमाणे (जरी एक तास vykonannya नाही!), कंपाइलर तुमची बॅटरी स्थानिक मेमरीमध्ये ठेवू शकतो, tk. Vіn vykoristovuєtsya फार क्वचितच, आणि नोंदणी कमी आहेत. काही वेळा उत्पादकतेची किंमत लक्षणीय असू शकते.

    ठीक आहे, जर तुम्ही खरोखरच क्वचितच विजयी ते बदलत असाल तर - ते जागतिक स्मृतीमध्ये चांगले ठेवा.

    जर तुम्हाला कंपाइलरने स्थानिक मेमरीमध्ये असे बदल आपोआप वाटप करावे असे वाटत असेल, तर ते योग्य असू शकते, परंतु खरोखर नाही. कार्यक्रमांच्या आगामी सुधारणांसह विशिष्ट ठिकाणी जाणून घेणे सोपे नाही, कारण ते बर्याचदा बदलले जाते. कंपाइलर मेमरी नोंदणी करण्यासाठी असा बदल हस्तांतरित करू शकतो किंवा करू शकत नाही. जर __global__ सुधारक स्पष्टपणे निर्दिष्ट केले असेल, तर प्रोग्रामर अधिक क्रूरपणे जागरूक असेल.

    ४.६. रिग्थेशन चक्र

    समृद्ध प्रणालींमध्ये उत्पादकता वाढवण्यासाठी चक्र फिरवणे ही एक मानक पद्धत आहे. योगाचा सार असा आहे की त्वचेच्या पुनरावृत्तीवर, आपण अधिकाधिक जिंकू शकता, अशा प्रकारे पुनरावृत्तीची संख्या बदलू शकता आणि याचा अर्थ मानसिक संक्रमणांची संख्या, ज्यामुळे प्रोसेसर जिंकू शकेल.

    अक्ष म्हणजे सुमी अॅरेचे (उदाहरणार्थ, संपूर्ण) चक्र उघडणे कसे शक्य आहे.

    int a[N]; intsum

    साठी (int i=0;i

    Zrozumilo, सायकल गोळीबार केला जाऊ शकतो आणि व्यक्तिचलितपणे (वर दाखवल्याप्रमाणे), परंतु सराव अनुत्पादक आहे. अधिक फंक्शन्ससाठी C++ टेम्प्लेट्स बदलणे चांगले आहे ज्याची तुम्हाला जाणीव असणे आवश्यक आहे.

    टेम्पलेट

    वर्ग ArraySumm

    डिव्हाइस__ स्थिर T exec (const T * arr) ( return arr + ArraySumm (arr+1); )

    टेम्पलेट

    वर्ग ArraySumm<0,T>

    डिव्हाइस__ स्थिर T exec(const T* arr) ( परतावा 0; )

    साठी (int i=0;i

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

    एनव्हीसीसी कंपाइलरचे वैशिष्ट्य म्हणून एक टिक नियुक्त करा. कंपाइलरने नेहमी __device__ प्रकारातील फंक्शन्स बंद करण्याची परवानगी दिली पाहिजे (खात्री करण्यासाठी, __noinline__ विशेष निर्देश वापरा).

    ओत्झे, तुम्हाला या वस्तुस्थितीवरून प्रेरणा मिळू शकते की नितंब, निदर्शनास आणलेल्या गोष्टीप्रमाणेच, ऑपरेटरच्या साध्या क्रमाने रागावतो आणि हाताने लिहिलेल्या कोडच्या कार्यक्षमतेसाठी का नाही. तथापि, वाइल्ड प्रकारासाठी (nvcc नाही) कोणालाही लुटणे शक्य नाही, कारण इनलाइन हे कंपाइलर इंस्ट्रक्शनपेक्षा जास्त नाही आणि तुम्ही त्याकडे दुर्लक्ष करू शकता. आपली कार्ये पुनर्संचयित केली जातील याची हमी नाही.

    ४.७. डेटा ब्राउझ करा आणि 16 बाइट्स निवडा

    16-बाइट कॉर्डनद्वारे डेटा संरचना ब्राउझ करा. या प्रकरणात, कंपाइलर त्यांच्यासाठी विशेष सूचना लिहू शकतो, जे प्रत्येकी 16 बाइट्स एकदा डेटाला हरवेल.

    जर कर्जाची रचना 8 b किंवा कमी असेल, तर तुम्ही ती 8 b ने बदलू शकता. वैकल्पिकरित्या, तुम्ही एका वेळी दोन 8-बाइट बदल निवडू शकता, दोन 8-बाइट बदलांना अतिरिक्त युनियनच्या मागे असलेल्या संरचनेत एकत्र करून किंवा त्यांची यादी करू शकता. खालील गोष्टी काळजीपूर्वक हाताळल्या पाहिजेत, कंपाइलर स्थानिक मेमरीमध्ये डेटा संग्रहित करू शकतो, परंतु रजिस्टरमध्ये नाही.

    ४.८. मेमरीमध्ये बँक संघर्ष, जे विभागलेले आहेत

    जी मेमरी वितरित केली जात आहे ती 4-बाइट क्रोकसह मेमरीच्या 16 (एकूण!) बँकांकडे पाहून आयोजित केली जाते. एका तासासाठी, मल्टीप्रोसेसरवरील वार्प थ्रेड्सचा पूल प्रत्येकी 16 थ्रेड्सच्या दोन भागांमध्ये (जसे वार्प-आकार = 32) विभागला जातो, ज्यामुळे कार्डद्वारे मेमरीमध्ये प्रवेश करता येतो.

    तानाच्या वेगवेगळ्या भागांमधील कार्ये विभाजित केलेल्या आठवणींशी संघर्ष करत नाहीत. zavdannya द्वारे वॉर्प पूलचा एक अर्धा भाग मेमरीच्या समान बँकांवर कमी केला जाईल, ज्यामुळे पतन आणि परिणामी, उत्पादकता कमी होईल. तानाच्या एका भागाच्या सीमारेषेतील Zavdannya स्मृतींच्या वेगवेगळ्या गावांपर्यंत वाढू शकते, जे गाणे क्रोकसह विभागलेले आहेत.

    इष्टतम आकार 4, 12, 28, ..., 2 एन-4 बाइट्स (चित्र 8) आहे.

    तांदूळ. 8. इष्टतम फिट.

    ची इष्टतम आकार नाही - 1, 8, 16, 32, ..., 2^n बाइट्स (चित्र 9).

    तांदूळ. 9. सबऑप्टिमल फिट

    ४.९. हलवणारा डेटा होस्ट कमी करणे<=>डिव्हाइस

    अतिरिक्त CPU साठी प्रक्रिया करण्यासाठी मध्यवर्ती परिणाम होस्टवर हस्तांतरित करण्याचा प्रयत्न करा. तुम्ही संपूर्ण अल्गोरिदम लागू न केल्यास, सीपीयूला कमी टास्क सोडून GPU वर काही मुख्य भाग घ्या.

    5. CPU/GPU पोर्टेबल गणित लायब्ररी

    या लेखाच्या लेखकाने MGML_MATH लायब्ररी लिहिली आहे, जी हस्तांतरित केली जाऊ शकते, साध्या स्पेस ऑब्जेक्ट्ससह कार्य करण्यासाठी, विस्तार आणि होस्ट दोन्हीवर व्यावहारिक एक कोड आहे.

    MGML_MATH लायब्ररी भौतिक, ग्राफिकल आणि इतर स्पेस टास्कच्या विकासासाठी CPU/GPU पोर्टेबल (किंवा हायब्रिड) सिस्टीम लिहिण्यासाठी फ्रेमवर्क म्हणून वापरली जाऊ शकते. मुख्य फायदा असा आहे की एक आणि समान कोड सीपीयू आणि जीपीयू दोन्हीवर ट्वीक केला जाऊ शकतो आणि जर तो लायब्ररीमध्ये सादर केला गेला तर तो दुसऱ्या बाजूला स्थापित केला जाऊ शकतो.

    6 . साहित्य

      ख्रिस कॅस्परस्की. प्रोग्राम ऑप्टिमायझेशन तंत्र. प्रभावी मेमरी पुनर्प्राप्ती. - सेंट पीटर्सबर्ग: BHV-पीटर्सबर्ग, 2003. - 464 p.: 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

    डार्विनच्या उत्क्रांतीच्या सिद्धांतावरून, पहिला मानवासारखा मावपा (जसे
    बुटी टू अचूक - होमो पूर्ववर्ती, व्यक्ती-पेरेपॅडनिक) देव असल्याचे भासवले
    आमच्याकडे आहे. एक हजार आणि अधिक रेडिओ दिवे असलेली बॅगाटोटॉन मोजणी केंद्रे,
    शहराच्या भिंतींवर काय व्यापलेले आहे, पिव्हकिलोग्राम नोट्स, याकी, भाषणात बदलले आहे,
    प्रथम उत्पादकतेचा त्याग करू नका. अँटेडिलुव्हियन ड्रूकर मशीन्स बदलल्या आहेत
    इतरांसाठी, ते ज्यासाठी चांगले आहे त्यासाठी ते नेहमीच चांगले असते (व्यक्तीच्या शरीरावर नॅव्हिट)
    भरपूर फंक्शनल आउटबिल्डिंग. Giganti raptom प्रोसेसरने वॉल अप करण्याचा निर्णय घेतला
    "दगड" चा ग्राफिक कोर. आणि व्हिडीओ कार्ड्सने केवळ चित्रच दाखवायला सुरुवात केली नाही
    FPS आणि ग्राफिक्सची गुणवत्ता स्वीकारा, परंतु सर्व गणना देखील करा. तर
    अधिक काम! समृद्ध प्रवाहाच्या तंत्रज्ञानाबद्दल, GPU च्या मदतीने त्याची गणना करा आणि त्याचा उल्लेख केला जाईल.

    GPU का?

    Tsikavo, त्यांनी संपूर्ण मोजणी mіts ग्राफिकमध्ये का हस्तांतरित केली
    अडॅप्टर? जसे आपण पाहू शकता, प्रोसेसर फॅशनमध्ये आहे आणि त्याची उबदारता सोडण्याची शक्यता नाही
    मिस्टेको. Ale, GPU मध्ये स्लीव्हमध्ये एकाच वेळी जोकर, त्या स्लीव्हसह कोझिरिव्हची जोडी आहे
    vistachaє. कमाल मर्यादा मर्यादित करण्यासाठी कारावास आधुनिक केंद्रीय प्रोसेसर
    फ्लोटिंगसह सिलीरी डेटा आणि डेटाच्या प्रक्रियेदरम्यान उत्पादकता
    कोमी, विशेषत: माहितीच्या कोणत्याही समांतर प्रक्रियेत हस्तक्षेप न करता. त्याच
    एक तास व्हिडिओ कार्डचे आर्किटेक्चर जलद आणि समस्यांशिवाय "समांतरता" साठी परवानगी देते
    माहिती मिळवणे. एका बाजूने, बहुभुजांचा देखावा आहे (3D-कन्व्हेयर फ्रेमसाठी),
    z іnshoy – टेक्सचरची पिक्सेल प्रक्रिया. हे पाहिले जाऊ शकते की ते "आनंदी आहे
    ब्रेकडाउन” कार्डच्या मुळाशी. याव्यतिरिक्त, मेमरी रोबोट आणि व्हिडिओ प्रोसेसर
    इष्टतम, खालचा दुवा "RAM-cache-processor". त्या क्षणी, जर तुम्ही एकटे असाल
    व्हिडिओ कार्ड एका GPU स्ट्रीम प्रोसेसरद्वारे रूपांतरित होऊ लागतात, अन्यथा
    एकाकीपणा एकाच वेळी दुसर्‍यामध्ये अडकतो आणि तत्त्वतः, सहज पोहोचू शकतो
    ग्राफिक्स प्रोसेसरची कार्यक्षमता, बसच्या थ्रूपुट बिल्डिंगसह,
    तथापि, या vantazhennya कन्व्हेयर करू शकता
    सर्व प्रकारच्या हुशार संक्रमणे आणि razgaluzhen. केंद्रीय प्रोसेसर त्याच्या द्वारे
    तुमच्या स्वतःच्या प्रोसेसरच्या गरजा, कॅशे, स्टोरेजसाठी अष्टपैलुत्व
    माहिती

    Vchenі cholovіki zamyslilis schodo roboti GPU समांतर गणनेत की
    गणितज्ञांनी एक सिद्धांत विकसित केला आहे की अनेक प्रकारे वैज्ञानिक संशोधने आहेत.
    3D ग्राफिक्सची प्रक्रिया. बरेच तज्ञ विचार करतात की मुख्य घटक काय आहे
    विकास GPGPU (GPU वर सामान्य उद्देश गणना - सार्वत्रिक
    व्हिडिओ कार्डच्या मदतीने rozrahunki
    ) 2003 मध्ये ब्रूक GPU प्रकल्पात सादर केले गेले.

    स्टॅनफोर्ड विद्यापीठातील प्रकल्पाच्या निर्मात्यांना एक कठीण काळ होता
    समस्या: हार्डवेअर आणि सॉफ्टवेअर zmusiti ग्राफिक अडॅप्टर कंपन
    विविध योजना. मी veyshlo दुर्गंधी. Vikoristovuyuchi युनिव्हर्सल mov C,
    अमेरिकन शास्त्रज्ञ zmusili pratsyuvati GPU जसे प्रोसेसर, साठी समायोजित
    समांतर कट. ब्रूकने व्हीजीए-प्रकल्पांसाठी प्रकल्पांची संपूर्ण मालिका दाखवल्यानंतर,
    जसे की एक्सीलरेटर लायब्ररी, ब्रह्मा लायब्ररी, सिस्टम
    मेटाप्रोग्रामिंग GPU++ आणि इतर.

    CUDA!

    विकासाच्या संभाव्यतेची समज लाजिरवाणी होती AMDі NVIDIA
    पिट बैलप्रमाणे ब्रूक GPU मध्ये जा. आपण विपणन धोरण वगळल्यास, नंतर
    सर्वकाही योग्यरित्या अंमलात आणल्यानंतर, आपण किमान ग्राफिक क्षेत्रात बंद करू शकता
    बाजार, आणि मोजणीच्या वेळी (विशेष मोजणी कार्डांवर आश्चर्यचकित व्हा
    सर्व्हर टेस्लाशेकडो मल्टीप्रोसेसरसह), सर्व CPU ची नावे बदलणे.

    Zvichayno, "FPS Volodymyrs" त्यांच्या स्वत: च्या साठी stumbling लेदर दगड गुलाब.
    टाके, परंतु मुख्य तत्त्व अपरिवर्तनीय बनले आहे - गणना करा
    GPU द्वारे. चला "ग्रीन" तंत्रज्ञानावर एक नजर टाकूया. CUDA
    (युनिफाइड डिव्हाइस आर्किटेक्चरची गणना करा).

    आमच्या "नायिका" चा रोबोट सुरक्षित API वर काम करत आहे, शिवाय, एकदा दोनसाठी.
    पहिला हाय-कोर आहे, CUDA रनटाइम, फंक्शन्ससह, जसे
    अधिक साधे समान खंडित केले जातात आणि खालच्या API - CUDA ड्रायव्हरमध्ये हस्तांतरित केले जातात. तर
    की "अत्यंत विश्वासार्ह" हा वाक्प्रचार ताणलेला आहे. सर्व शक्ती जाण
    स्वतः ड्रायव्हरकडे, आणि लायब्ररींना मदत करण्यासाठी її मिळवा, कृपया तयार केले
    किरकोळ विक्रेते NVIDIA: क्युब्लास
    FFT (Fur'e अल्गोरिदमचे स्वरूप शोधत आहे). बरं, चला प्रॅक्टिकलकडे जाऊया
    साहित्याचे भाग.

    शब्दावली CUDA

    NVIDIA CUDA API साठी स्वतःच्या असाइनमेंटसह कार्य करते. पोंग
    v_dr_znyayutsya vіd vyznachen, scho zastosovuyutsya केंद्रीय प्रोसेसरसह कार्य करण्यासाठी.

    पोटिक (धागा)- डेटा गोळा करा, जो गोळा करणे आवश्यक आहे (नाही
    Vymagaє महान resursіv pіd तास orobki).

    ताना- 32 प्रवाहांचा समूह. डेटा फक्त गोळा केला जातो
    warps, aka warp - किमान obsyag डेटा.

    ब्लॉक- Sukupnіst प्रवाह (vіd 64 ते 512) किंवा sukupnіst
    warpiv (प्रकार 2 ते 16).

    सिटका (ग्रिड)- Tse sukupnіst blokіv. अशा podіl danih
    zastosovuєtsya vikljuchno podvischennya उत्पादकता. तर, संख्या काय आहे
    मल्टीप्रोसेसर मोठा आहे, नंतर ब्लॉक्स समांतर मध्ये एकत्र केले जातात. यक्षो प
    कार्ड सोडले नाही
    अॅडॉप्टर GeForce 8800 (GTS 320 MB) पेक्षा कमी नाही, नंतर डेटा ब्लॉक्सवर प्रक्रिया केली जाते
    क्रमाक्रमाने

    तसेच NVIDIA इतका समजण्यासारखा परिचय कर्नल, होस्ट (होस्ट)
    і डिव्हाइस.

    Pratsyuemo!

    CUDA सह सामान्य कामासाठी, आपल्याला आवश्यक आहे:

    1. GPU शेडर कोरचे स्वरूप जाणून घ्या, शार्ड हे प्रोग्रामिंगचे सार आहेत
    pogaє त्यांच्यामध्ये समान rozpodіlі navantazhennya आहे.
    2. C च्या मध्यभागी प्रोग्राम करण्यासाठी, काही पैलू निश्चित करण्यासाठी.

    रोझरोब्निकी NVIDIA kіlka व्हिडिओ कार्डचे "फिलिंग" क्रॅक केले
    अन्यथा, लोअर मीला बाचिती म्हणतात. मग आपण सर्वकाही पाहण्यासाठी का होऊ इच्छित नाही
    सूक्ष्म वास्तुकला. Rozberemo Budov "दगड" G80 पौराणिक GeForce 8800
    GTX
    .

    शेडर कोर आठ टीपीसी (टेक्श्चर प्रोसेसर क्लस्टर) क्लस्टरने बनलेला आहे
    टेक्सचर प्रोसेसर (उदाहरणार्थ, GeForce GTX 280- 15 कोर 8800 GTS
    їх सहा, y 8600 - छोटीरी इ.). ति, तुमच्या हृदयात, दोन जोडा
    स्ट्रीमिंग मल्टीप्रोसेसर (स्ट्रीमिंग मल्टीप्रोसेसर - दूर एसएम). एसएम (एकूण सहा
    16) समोरच्या टोकापासून दुमडलेला (सूचना वाचण्याचे आणि डीकोड करण्याचे कार्य) आणि
    पाइपलाइनचे बॅक एंड (सूचनांचा शेवट), तसेच आठ स्केलर एसपी (शेडर
    प्रोसेसर) आणि दोन SFUs (सुपर फंक्शनल युनिट्स). त्वचेच्या ठोक्यासाठी (सिंगल
    तास) फ्रंट एंड ताना निवडा आणि योग करा. Shchob usі ताना वाहते
    (मी अंदाज लावत आहे, їх 32 तुकडे) निघाले, पाइपलाइनच्या शेवटी 32/8 = 4 चक्र लागतात.

    लेदर मल्टीप्रोसेसरला शेअर्ड मेमरी म्हणता येईल.
    16 किलोबाइट्स होण्यासाठी विस्तार आणि प्रोग्रामरला पूर्ण स्वातंत्र्य द्या
    diy Razpodіlya याक तुम्हाला पाहिजे :). सामायिक मेमरी स्ट्रीमिंग कॉल सुरक्षित करते
    एक ब्लॉक पिक्सेल शेडर्ससह कामासाठी ओळखला जात नाही.

    तसेच SM GDDR मध्ये रूपांतरित करू शकतो. ज्यांच्यासाठी त्यांनी 8 किलोबाइट "शिवणे" केले
    कॅशे मेमरी, जी रोबोट्ससाठी सर्व मथळे जतन करते (उदाहरणार्थ, गणन
    स्थिरांक).

    मल्टीप्रोसेसर कमाल 8192 नोंदणी. सक्रिय ब्लॉक्सची संख्या असू शकत नाही
    आठ पेक्षा जास्त, आणि वार्प्सची संख्या - 768/32 = 24 पेक्षा जास्त नाही. हे पाहिले जाऊ शकते की G80
    तुम्ही कमाल ३२*१६*२४ = १२,२८८ प्रवाह प्रति तास प्रक्रिया करू शकता. करू शकत नाही
    नडाल प्रोग्राम ऑप्टिमाइझ करताना हे आकडे दुरुस्त करा (वॅगच्या एका वाटीवर
    - Razmіr ब्लॉक, іnshiy वर - प्रवाहांची संख्या). पॅरामीटर्सची शिल्लक बदलली जाऊ शकते
    त्यात महत्त्वाची भूमिका देण्यात आली NVIDIAवायकोरिस्टिंग ब्लॉक्सची शिफारस करा
    sі 128 किंवा 256 प्रवाह. ब्लॉक z 512 प्रवाह अकार्यक्षम आहे, शार्ड्स करू शकतात
    हलवून zatrims. Vrakhovuychi सर्व पातळ GPU व्हिडिओ कार्ड अधिक
    खराब प्रोग्रामिंग कौशल्ये, आपण अधिक उत्पादक तयार करू शकता
    समांतर गणनेसाठी zasib. भाषणापूर्वी, प्रोग्रामिंगबद्दल ...

    प्रोग्रामिंग

    CUDA कडून एकाच वेळी "सर्जनशीलता" साठी, ते आवश्यक आहे GeForce व्हिडिओ कार्ड कमी नाही
    आठवी मालिका
    . प

    अधिकृत साइटला तीन सॉफ्टवेअर पॅकेजेसची आवश्यकता आहे: ड्रायव्हर
    मध्यस्थ CUDA SDK पॅकेज (इतर
    बीटा आवृत्ती) आणि अतिरिक्त लायब्ररी (CUDA टूलकिट). तंत्रज्ञान समर्थन
    विंडोज ऑपरेटिंग सिस्टम (XP आणि Vista), Linux आणि Mac OS X.
    Vista Ultimate Edition x64 निवडत आहे (मी असे म्हणणार आहे की प्रणाली होती
    खूप मस्त). लेखनाच्या वेळी या पंक्ती रोबोट्ससाठी संबंधित आहेत
    फोर्सवेअर 177.35 साठी ड्राइव्हर. व्हिकोरिस्ट साधनांच्या संचाप्रमाणे
    सॉफ्टवेअर पॅकेज बोरलँड C++ 6 बिल्डर
    माझे C).

    लोक, माझ्या माहितीप्रमाणे, नवीन वातावरणाची सवय करणे सोपे आहे. कमी आवश्यक
    मुख्य पॅरामीटर्स लक्षात ठेवा. _global_ कीवर्ड (फंक्शनच्या आधी)
    फंक्शन कर्नलच्या आधी असावे हे दाखवते. ї viklikatime मध्य
    प्रोसेसर, आणि संपूर्ण रोबोट GPU वर असेल. Wiklik _global_ अधिक बनवते
    विशिष्ट तपशील, परंतु नेटवर्कचाच विस्तार, ब्लॉक आणि कोरचा विस्तार होईल
    अडकले उदाहरणार्थ, पंक्ती _global_ void saxpy_parallel<<>>, डी एक्स -
    ग्रिडचा आकार आणि Y - ब्लॉकचा आकार, जे पॅरामीटर्सची संख्या निर्धारित करते.

    _device_ चिन्हाचा अर्थ असा आहे की फंक्शनला ग्राफिकल कोर द्वारे कॉल केले जाते, परंतु
    या सूचनांचे अनुसरण करा. हे फंक्शन मल्टीप्रोसेसरच्या मेमरीमध्ये साठवले जाते,
    otzhe, otrimati її पत्ता अशक्य आहे. _host_ उपसर्ग म्हणजे विकी आहे
    की obrobka CPU च्या प्राक्तन कमी पास. काय _ग्लोबल_ i
    _device_ एकाला कॉल करू शकत नाही आणि स्वतःला कॉल करू शकत नाही.

    तसेच CUDA साठी भाषेमध्ये व्हिडिओ मेमरीसह कार्य करण्यासाठी कमी कार्ये असू शकतात: cudafree
    (GDDR आणि RAM मधील मेमरी बदल), cudamemcpy आणि cudamemcpy2D (कॉपी
    GDDR आणि RAM मधील मेमरी) आणि cudamalloc (मेमरी व्ह्यू).

    सर्व कोड प्रोग्राम्स CUDA API च्या बाजूने संकलित केले जाणे आवश्यक आहे. कोब वर घेतले आहे
    कोड, केंद्रीय प्रोसेसर आणि poddaetsya साठी असाइनमेंट समावेश
    मानक संकलन, आणि इतर कोड, ग्राफिक्स अडॅप्टरसाठी असाइनमेंट,
    साठी PTX (खूप अंदाज लावणारा असेंबलर) वर पुन्हा लिहा
    संभाव्य क्षमा दर्शवित आहे. या सर्व "नृत्य" नंतर, एक अवशेष आहे
    GPU/CPU mov साठी समजलेल्या कमांडचे भाषांतर (प्रसारण).

    लग्नासाठी डायल करा

    प्रोग्रामिंगच्या जवळजवळ सर्व पैलूंचे दस्तऐवजीकरणात वर्णन केले आहे
    ड्रायव्हर आणि दोन प्रोग्राम्ससह, तसेच किरकोळ विक्रेत्यांच्या साइटवर. रोझमीर
    लेख वाचू नका, त्यांचे वर्णन करण्यासाठी (वाचन जोडले जाऊ शकते
    थोडे प्रयत्न आणि स्वतंत्रपणे सामग्रीवर काम).

    विशेषत: नवशिक्यांसाठी CUDA SDK ब्राउझरचा विस्तार करण्यात आला आहे. Be-yaky bazhayuchy करू शकता
    समांतर गणनेची शक्ती तुमच्या स्वतःच्या त्वचेवर अनुभवा (चालू पुन्हा पडताळणी
    स्थिरता - रोबोट आर्टिफॅक्ट्स आणि विल्सशिवाय लागू केला जातो). परिशिष्ट मे
    मोठ्या संख्येने शो मिनी-प्रोग्राम्स (61 "चाचण्या"). त्वचा dosvіdu є करण्यासाठी
    प्रोग्राम कोड आणि PDF-फाईल्सचे दस्तऐवजीकरण अहवाल. तुम्ही ते लोक पाहू शकता
    ब्राउझरमध्ये त्यांच्या विंडोसह उपस्थित, गंभीर कामात गुंतलेले.
    येथे आपण प्रक्रियेच्या तासासाठी रोबोट आणि प्रोसेसर आणि व्हिडिओ कार्डची गती देखील बदलू शकता
    डॅनिच उदाहरणार्थ, व्हिडिओ कार्डसह रिच अॅरे स्कॅन करणे GeForce 8800
    जी.टी
    256 थ्रेड्सच्या ब्लॉकसह 512 MB 0.17109 मिलिसेकंदांमध्ये फिरते.
    तंत्रज्ञान SLI टँडम्स ओळखत नाही, म्हणून तुमच्याकडे त्रिकूट आहे,
    रोबोटच्या आधी “पेअरिंग” फंक्शन चालू करा, अन्यथा CUDA फक्त एक कार्य करेल
    डिव्हाइस. दुहेरी कोर AMD Athlon 64X2(कोर वारंवारता 3000 MHz) समान मान्यता
    2.761528 मिलिसेकंदात पास करा. बाहेर जा की G92 16 पटापेक्षा कमी मोठा आहे
    shvidshe "दगड" AMD! याक बच्चीश, प्रणाली अत्यंत दूर आहे
    जनमानसातील प्रेम नसलेल्या लोकांशी जुळवून घेणे वाईट दर्शविते ऑपरेटिंग सिस्टम
    परिणाम

    Krіm ब्राउझर іsnuє कमी korisnyh suspіlstvo कार्यक्रम. Adobe
    त्याची उत्पादने नवीन तंत्रज्ञानाशी जुळवून घेतली. आता Photoshop CS4 अपडेट केले आहे
    ग्राफिक अडॅप्टर्सची जगातील विजयी संसाधने (विशेष प्रदान करणे आवश्यक आहे
    प्लगइन). बडाबूम मीडिया कन्व्हर्टर आणि रॅपीएचडी सारख्या प्रोग्रामसह, तुम्ही हे करू शकता
    MPEG-2 फॉरमॅटमध्ये व्हिडिओ डीकोड करण्याची क्षमता. प्रक्रियेसाठी आवाज खराब आहे
    pidide किमती-मुक्त Accelero उपयुक्तता. सॉफ्टवेअरची संख्या, धारदार CUDA API,
    नक्कीच, वाढत रहा.

    आणि त्यावेळी...

    आणि तुम्ही ही सामग्री वाचत असताना, प्रोसेसरच्या चिंतेतील कठोर कामगार
    CPU वरून GPU चा प्रचार करण्यासाठी त्यांच्या तंत्रज्ञानाचा विस्तार करा. 3 बाजू AMDमिशी
    समजले: त्यांच्याकडे एक भव्य dosvіd आहे, nabutiy एकाच वेळी iz ATI.

    "मायक्रोडिव्हाइसेस" ची निर्मिती, फ्यूजन, अनेक कोरांपासून बनलेली आहे
    बुलडोझर आणि व्हिडीओचिप RV710 (कॉंग) कोडनाव. तुमचे परस्पर संबंध असतील
    rahunok razrezheny टायर HyperTransport साठी zdіysnyuvatsya. पडझड दृश्य
    कोर आणि वारंवारता वैशिष्ट्यांची संख्या AMD संपूर्ण किंमत तयार करण्याची योजना आखत आहे
    "दगड" चे पदानुक्रम. लॅपटॉप (फाल्कन) सारखे प्रोसेसर रूपांतरित करण्याची योजना आहे.
    आणि मल्टीमीडिया गॅझेट्ससाठी (बॉबकॅट). शिवाय, तंत्रज्ञानाची फारच स्तब्धता
    पोर्टेबल आउटबिल्डिंग हे कॅनेडियन लोकांसाठी पहिले काम असेल. झेड विकास समिती
    अशा "कामिंट्सिव" च्या स्थिरतेची समांतर गणना आणखी लोकप्रिय असू शकते.

    इंटेलतुमच्या लॅरबीसाठी प्रति तास तीन. उत्पादने AMD,
    yakscho मद्यधुंद न होण्यासाठी, 2009 सारख्या स्टोअरच्या शेल्फ् 'चे अव रुप - कोब वर
    2010 रॉक. आणि प्रतिस्पर्ध्याचा देवाचा प्रकाश पाहण्याचा निर्णय दोनमध्ये कमी आहे
    नशीब

    लॅरबीमध्ये मोठ्या संख्येने (वाचा - शेकडो) कोर आहेत. कोब वर
    बरं, तुम्ही वस्तू पाहू शकता, 8 - 64 कोरसाठी परतफेड केली आहे. दुर्गंधी पेंटियम, एले सारखी असते
    दूध काढण्यासाठी ते खूप जास्त काम केले जाते. स्किन कर्नल 256 किलोबाइट कॅशे दुसर्या समान असू शकते
    (एक वर्षाच्या योगाने वृद्धी वाढेल). Vzaymosv'yazok
    1024-बिट द्विदिशात्मक रिंग बस. इंटेल एक "मुल" असल्याचे दिसते
    डायरेक्टएक्स आणि ओपन जीएल एपीआय ("याब्लुच्निकोव्ह" साठी) सह चांगला सराव, यापैकी काहीही नाही
    सॉफ्टवेअर इनपुट आवश्यक नाही.

    आणि मी सर्व त्से रोझपोविव्ह का आहे? हे स्पष्ट आहे की लॅराबी आणि फ्यूजन पाहिले जाऊ शकत नाही
    बाजारातून स्थिर, स्थिर प्रोसेसर
    व्हिडिओ कार्ड. गेमर आणि अत्यंत लोकांसाठी, स्वप्नांच्या दरम्यान, पूर्वीप्रमाणे, सुटका करण्यासाठी
    रिच-कोर CPU आणि टॉप-एंड VGA decals सह टँडम. आले त्या नववीत
    प्रोसेसर कंपन्या तत्त्वांसाठी समांतर बिलिंगवर जातील,
    जीपीजीपीयूशी साधर्म्य असलेले, कशाबद्दल आधीच समृद्धपणे बोलणे. जे आहेत त्यांच्याबद्दल झोक्रेमा
    तंत्रज्ञान, CUDA सारखे, वापरण्याचा अधिकार असू शकतो आणि, कदाचित
    आधीच लोकप्रिय.

    लहान रेझ्युमे

    व्हिडिओ कार्डच्या मदतीने समांतर बिलिंग हे फक्त एक चांगले साधन आहे
    रोबोटिक प्रोग्रामरच्या हातात. चोली іz मूरच्या कायद्यावर हार्डली ची प्रोसेसर
    थांबा कंपन्या NVIDIAआणखी एक लांब मार्ग जाण्यासाठी झोपा
    तुमच्या API च्या वस्तुमानात सरकणे (मुलाबद्दल असेच म्हटले जाऊ शकते ATI/AMD).
    तू कसा असेल, भविष्य दाखवा. तसेच, CUDA परत येईल :).

    P.S. सर्व प्रोग्रामर आणि अडकलेल्या लोकांसाठी, मी एक नजर टाकण्याची शिफारस करतो
    पुढील "आभासी गहाण":

    NVIDIA अधिकृत वेबसाइट आणि वेबसाइट
    GPGPU.com. सर्व
    माहिती दिली आहे - माझे इंग्रजी, परंतु धन्यवाद, मला ते आवडणार नाही
    चिनी. तर ते चालू ठेवा! मला खात्री आहे की लेखक तुम्हाला थोडी मदत करू इच्छित आहे
    CUDA ज्ञानाची उच्च दीक्षा!

    होस्ट-कोड (हेड, की कोड) आणि डिव्हाइस-कोड (हार्डवेअर कोड) (extensions.cu सह फायली) ऑब्जेक्ट फाइल्समध्ये अनुवादासाठी असाइनमेंट, कोणत्याही प्रोग्रामिंग वातावरणात अंतिम प्रोग्राम किंवा लायब्ररी संकलित करण्याच्या प्रक्रियेतील अॅक्सेसरीज, उदाहरणार्थ NetBeans.

    CUDA आर्किटेक्चरमध्ये, ग्रिडचे मेमरी मॉडेल, प्रवाहांचे क्लस्टर मॉडेल आणि SIMD सूचना विजयी आहेत. nVidia व्हिडिओ कार्डसाठी केवळ उच्च-कार्यक्षमता ग्राफिक्स कार्डच नाहीत तर इतर वैज्ञानिक बिल देखील आहेत. खगोल भौतिकशास्त्र, जीवशास्त्र आणि रसायनशास्त्राची गणना, नद्यांच्या गतिशीलतेचे मॉडेलिंग, इलेक्ट्रोमॅग्नेटिक परस्परसंवाद, संगणक टोमोग्राफी, भूकंपाचे विश्लेषण आणि बरेच काही यासह विविध गॅल्यूजमध्ये CUDA साठी या संशोधनाचे परिणाम मोठ्या प्रमाणावर वापरले जातात. CUDA मध्ये OpenGL आणि Direct3D वापरणाऱ्या प्रोग्रामशी कनेक्ट करण्याची क्षमता आहे. CUDA हे लिनक्स, Mac OS X आणि Windows सारख्या ऑपरेटिंग सिस्टमसाठी क्रॉस-प्लॅटफॉर्म सॉफ्टवेअर आहे.

    22 मार्च 2010 रोजी, nVidia ने CUDA Toolkit 3.0 जारी केले, जे OpenCL समर्थनाचे पुनरुज्जीवन आहे.

    मालकी

    आठव्या पिढीतील NVIDIA चिप G80 च्या रिलीझसह CUDA प्लॅटफॉर्म प्रथम बाजारात दिसला आणि ग्राफिक्स चिप्सच्या सर्व आगामी मालिकांमध्ये उपस्थित झाला, जे वेगाने वाढणाऱ्या GeForce, Quadro आणि NVidia Tesla च्या कुटुंबांमध्ये वैशिष्ट्यीकृत आहेत.

    CUDA SDK, G8x ला सपोर्ट करणार्‍या मालिकेतील पहिला, एक लहान 32-बिट सिंगल-प्रिसिजन वेक्टर प्रोसेसर आहे जो CUDA SDK ला API म्हणून सपोर्ट करतो (CUDA दुहेरी मूव्ही Ci प्रकाराला सपोर्ट करतो, प्रोटीओ प्रिसिजन 32- पर्यंत कमी केले आहे. बिट फ्लोटिंग पॉइंट). खालचे GT200 प्रोसेसर 64-बिट अचूकतेला (केवळ SFU साठी) समर्थन देऊ शकतात, परंतु कार्यप्रदर्शन लक्षणीयरीत्या जास्त आहे, 32-बिट अचूकतेसाठी कमी आहे (त्याद्वारे, प्रति स्किन स्ट्रीमिंग मल्टीप्रोसेसर आणि स्केलर प्रोसेसर - सर्व) फक्त दोन SFU आहेत. ग्राफिक्स प्रोसेसर प्रवाहाची हार्डवेअर समृद्धता आयोजित करतो, ज्यामुळे तुम्हाला ग्राफिक्स प्रोसेसरच्या सर्व संसाधनांचा फायदा घेता येतो. अशाप्रकारे, भौतिक शॉर्टकटची कार्ये ग्राफिकवर (अंमलबजावणीचे उदाहरण - nVidia PhysX) हलवण्याची शक्यता दिसते. तसेच, फोल्ड करण्यायोग्य नॉन-ग्राफिक गणनेसाठी संगणकाची ग्राफिकल सेटिंग वापरण्याच्या विस्तृत शक्यता आहेत: उदाहरणार्थ, जीवशास्त्र आणि इतर विज्ञान युक्त्यांच्या गणनेमध्ये.

    पेरेवागी

    ग्राफिक API च्या अतिरिक्त शक्यतांसाठी जागतिक ओळखीची गणना आयोजित करण्याच्या पारंपारिक दृष्टिकोनासह, CUDA आर्किटेक्चर देखील या गॅलरीत जिंकू शकते:

    देवाणघेवाण

    • सर्व फंक्शन्स, जी एक्स्टेंशनवर प्रदर्शित केली जातात, पुनरावृत्तीला समर्थन देत नाहीत (CUDA टूलकिट 3.1 आवृत्तीमध्ये, पुनरावृत्तीचे संकेतक समर्थन करतात) आणि इतर एक्सचेंजवर कार्य करू शकतात.

    GPU ट्वीक्स आणि ग्राफिक्स सुधारणा

    CUDA तंत्रज्ञानासाठी घोषित नवीन समर्थनातील Nvidia-सक्षम उपकरणाच्या स्वरूपात अॅड-ऑनचे भाषांतर अधिकृत Nvidia वेबसाइटवर दर्शविले आहे: CUDA-Enabled GPU उत्पादने (इंग्रजी).

    खरं तर, PC साठी हार्डवेअरच्या बाजारात या तासात, 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, /37/570, 3/580, /37/570 /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 9500MG
    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 *
    टेस्ला C2050/C2070
    टेस्ला M2050/M2070/M2090
    टेस्ला S2050
    टेस्ला S1070
    टेस्ला M1060
    टेस्ला C1060
    टेस्ला C870
    टेस्ला डी870
    टेस्ला S870
    डेस्कटॉपसाठी Nvidia Quadro
    क्वाड्रो 6000
    क्वाड्रो ५०००
    क्वाड्रो ४०००
    क्वाड्रो 2000
    क्वाड्रो ६००
    क्वाड्रोएफएक्स ५८००
    QuadroFX 5600
    QuadroFX4800
    Quadro FX 4700X2
    QuadroFX4600
    QuadroFX 3700
    QuadroFX 1700
    QuadroFX 570
    QuadroFX470
    Quadro FX 380 लो प्रोफाइल
    QuadroFX 370
    Quadro FX 370 लो प्रोफाइल
    क्वाड्रो सीएक्स
    क्वाड्रो NVS450
    Quadro NVS 420
    क्वाड्रो NVS 290
    Quadro Plex 2100 D4
    Quadro Plex 2200 D2
    Quadro Plex 2100 S4
    Quadro Plex 1000 मॉडेल IV
    मोबाइल संगणकांसाठी Nvidia Quadro
    Quadro 5010M
    Quadro 5000M
    Quadro 4000M
    क्वाड्रो 3000M
    क्वाड्रो 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.x

    जागतिक मेमरीमध्ये 32-बिट शब्द
    हाय तर

    ग्लोबल मेमरीमध्ये फ्लोटिंग पॉइंट मूल्ये
    पूर्णांक अणु कार्ये चालू आहेत
    सामायिक मेमरीमध्ये 32-बिट शब्द
    हाय तर
    atomicExch() 32-बिटवर कार्यरत आहे
    सामायिक मेमरीमध्ये फ्लोटिंग पॉइंट मूल्ये
    पूर्णांक अणु कार्ये चालू आहेत
    जागतिक मेमरीमध्ये 64-बिट शब्द
    वार्प मत कार्ये
    दुहेरी-परिशुद्धता फ्लोटिंग-पॉइंट ऑपरेशन्स हाय तर
    64-बिटवर चालणारी अणु कार्ये
    सामायिक मेमरीमध्ये पूर्णांक मूल्ये
    हाय तर
    फ्लोटिंग-पॉइंट अणू जोडणी चालू आहे
    जागतिक आणि सामायिक मेमरीमध्ये 32-बिट शब्द
    _मतपत्रिका()
    _थ्रेडफेन्स_सिस्टम()
    _syncthreads_count(),
    _syncthreads_and(),
    _syncthreads_or()
    पृष्ठभाग कार्ये
    थ्रेड ब्लॉकचा 3D ग्रिड
    तांत्रिक माहिती गणना क्षमता (आवृत्ती)
    1.0 1.1 1.2 1.3 2.x
    थ्रेड ब्लॉक्सच्या ग्रिडची कमाल परिमाणे 2 3
    थ्रेड ब्लॉक्सच्या ग्रिडचे कमाल x-, y- किंवा z-परिमाण 65535
    थ्रेड ब्लॉकची कमाल परिमाणे 3
    ब्लॉकचे कमाल x- किंवा y-परिमाण 512 1024
    ब्लॉकची कमाल z-परिमाण 64
    प्रति ब्लॉक थ्रेड्सची कमाल संख्या 512 1024
    ताना आकार 32
    प्रति मल्टीप्रोसेसर निवासी ब्लॉक्सची कमाल संख्या 8
    निवासी warps मल्टीप्रोसेसरची कमाल संख्या 24 32 48
    प्रति मल्टीप्रोसेसर निवासी थ्रेडची कमाल संख्या 768 1024 1536
    मल्टीप्रोसेसरसाठी 32-बिट नोंदणीची संख्या 8K 16K 32K
    प्रति मल्टीप्रोसेसर शेअर केलेल्या मेमरीची कमाल रक्कम 16KB 48KB
    सामायिक मेमरी बँकांची संख्या 16 32
    प्रति थ्रेड स्थानिक मेमरीची रक्कम 16KB 512KB
    सतत मेमरी आकार 64KB
    सतत मेमरीसाठी प्रति मल्टीप्रोसेसर कॅशे वर्किंग सेट 8KB
    टेक्सचर मेमरीसाठी प्रति मल्टीप्रोसेसर कॅशे वर्किंग सेट डिव्हाइस अवलंबून, 6 KB आणि 8 KB दरम्यान
    1D टेक्सचरसाठी कमाल रुंदी
    8192 32768
    1D टेक्सचरसाठी कमाल रुंदी
    रेषीय मेमरीला बांधलेला संदर्भ
    2 27
    कमाल रुंदी आणि स्तरांची संख्या
    1D स्तरित पोत संदर्भासाठी
    ८१९२x५१२ १६३८४x२०४८
    2D साठी कमाल रुंदी आणि उंची
    पोत संदर्भ बांधील
    रेखीय मेमरी किंवा CUDA अॅरे
    ६५५३६ x ३२७६८ ६५५३६ x ६५५३५
    कमाल रुंदी, उंची आणि संख्या
    2D स्तरित पोत संदर्भासाठी स्तरांचे
    ८१९२ x ८१९२ x ५१२ १६३८४ x १६३८४ x २०४८
    कमाल रुंदी, उंची आणि खोली
    3D टेक्सचर संदर्भासाठी रेषेशी बांधील आहे
    मेमरी किंवा CUDA अॅरे
    2048x2048x2048
    पोतांची कमाल संख्या की
    कर्नलला बांधले जाऊ शकते
    128
    1D पृष्ठभागासाठी कमाल रुंदी
    संदर्भ CUDA अॅरेशी बांधील आहे
    नाही
    समर्थित
    8192
    2D साठी कमाल रुंदी आणि उंची
    पृष्ठभाग संदर्भ CUDA अॅरेशी बांधील आहे
    ८१९२ x ८१९२
    पृष्ठभागांची कमाल संख्या की
    कर्नलला बांधले जाऊ शकते
    8
    प्रति निर्देशांची कमाल संख्या
    कर्नल
    2 दशलक्ष

    बट

    CudaArray* cu_array; पोत< float , 2 >टेक्स; // ऍरे वाटप करा cudaMalloc( & cu_array, cudaCreateChannelDesc< float>(), रुंदी उंची); // cudaMemcpy (cu_array, प्रतिमा, रुंदी* उंची, cudaMemcpyHostToDevice) अॅरेमध्ये प्रतिमा डेटा कॉपी करा; // अ‍ॅरेला टेक्सचरमध्ये बांधा cudaBindTexture( tex, cu_array); // कर्नल dim3 blockDim (16, 16, 1) चालवा; dim3 gridDim(रुंदी/blockDim.x, height/blockDim.y, 1); कर्नल<<< gridDim, blockDim, 0 >>> (d_odata, रुंदी, उंची); cudaUnbindTexture(tex); __global__ शून्य कर्नल (फ्लोट * ओडाटा, इंट उंची, इंट रुंदी) ( स्वाक्षरी न केलेले int x = blockIdx.x * blockDim.x + threadIdx.x ; स्वाक्षरी न केलेले int y = blockIdx.y * blockDim.y + threadIdx.y ; t float tex, x, y);odata[y* रुंदी+ x] = c;

    pycuda.driver आयात करा जसे drv import 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 ) .astype (numpy.float32 ) b = numpy.random .randn (400 ) .astype (numpy_float3) .आउट (dest) , drv.In (a) , drv.In (b) , block= (400 , 1 , 1 ) ) प्रिंट 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 UNIVITITIES, the MITENENTY UNIVITITITITIONALY ONISTITITIONALS. Bauman, RKhTU im. मेंडेलेव्ह, रशियन एकेडमी ऑफ सायन्सेसचे आंतरप्रादेशिक सुपर कॉम्प्युटर केंद्र, . याव्यतिरिक्त, 2009 च्या सुरूवातीस, रशियामधील पहिल्या वैज्ञानिक आणि प्रकाश केंद्राच्या कामाच्या सुरूवातीची घोषणा केली गेली होती “समांतर गणना”, जी दुबना शहरात आयोजित केली गेली होती.

    युक्रेनमध्ये, कीव इन्स्टिट्यूट फॉर सिस्टम अॅनालिसिसमध्ये CUDA वरील अभ्यासक्रम वाचले जातात.

    पोसिलन्या

    अधिकृत संसाधने

    • CUDA झोन (रशियन) - अधिकृत CUDA वेबसाइट
    • CUDA GPU संगणन (इंग्रजी) - CUDA गणनांना समर्पित अधिकृत वेब मंच

    अनधिकृत संसाधने

    टॉमचे हार्डवेअर
    • दिमित्रो चेकनोव्ह. nVidia CUDA: व्हिडिओ कार्डवरील शुल्क किंवा CPU मृत्यू? . टॉम्स हार्डवेअर (22 सप्टेंबर 2008).
    • दिमित्रो चेकनोव्ह. nVidia CUDA: मुख्य प्रवाहातील बाजारपेठेसाठी GPU चाचणी. टॉमचे हार्डवेअर (मंगळवार, 19, 2009).
    iXBT.com
    • ओलेक्सी बेरिलो. NVIDIA CUDA - ग्राफिक्स प्रोसेसरवर नॉन-ग्राफिकल संगणन. भाग 1. iXBT.com (सप्टेंबर 23, 2008). गेल्या 4 फेब्रुवारी 2012 रोजी संग्रहित. 20 सप्टेंबर 2009 रोजी सुधारित.
    • ओलेक्सी बेरिलो. NVIDIA CUDA - ग्राफिक्स प्रोसेसरवर नॉन-ग्राफिकल संगणन. भाग 2. iXBT.com (22 जुलै 2008). - NVIDIA CUDA पॅच लागू करा. गेल्या 4 फेब्रुवारी 2012 रोजी संग्रहित. 20 सप्टेंबर 2009 रोजी सुधारित.
    इतर संसाधने
    • बोरेस्कोव्ह ओलेक्सी विक्टोरोविच. CUDA ची मूलभूत तत्त्वे (20 सप्टें 2009). गेल्या 4 फेब्रुवारी 2012 रोजी संग्रहित. 20 सप्टेंबर 2009 रोजी सुधारित.
    • व्होलोडिमिर फ्रोलोव्ह. CUDA तंत्रज्ञानाचा परिचय. मेरेझेव्ही मासिक "संगणक ग्राफिक्स आणि मल्टीमीडिया" (डिसेंबर 19, 2008). गेल्या 4 फेब्रुवारी 2012 रोजी संग्रहित. 28 जून 2009 रोजी सुधारित.
    • इगोर ओस्कोलकोव्ह. NVIDIA CUDA हे मोठ्या संख्येच्या जगासाठी परवडणारे तिकीट आहे. संगणक (एप्रिल ३०, २००९). 3 मे 2009 रोजी पुनर्प्राप्त.
    • व्होलोडिमिर फ्रोलोव्ह. CUDA तंत्रज्ञानाचा परिचय (सप्टेंबर 1, 2009). गेल्या 4 फेब्रुवारी 2012 रोजी संग्रहित. 3 एप्रिल 2010 रोजी सुधारित.
    • GPGPU.ru. गणनासाठी Wikoristannya व्हिडिओकार्ड
    • . समांतर गणना केंद्र

    नोट्स

    दिव. तसेच



कॉपीराइट © २०२२ Stosunki बद्दल.