CUDA

**CUDA**  — Nvidia-ს პარალელური გამომთვლელი პლატფორმა და აპლიკაციის პროგრამული ინტერფეისი, რომელიც პროგრამისტს აძლევს საშუალებას გამოიყენოს ვიდეოდაფის პროცესორი, CUDA მხარდაჭერით. CUDA პლატფორმა პროგრამის ფენაა რომელიც პირდაპირ წვდომას გვაძლევს ვიდეოდაფის პროცესორის ვირტუალურ ინსტრუქციასთან.

CUDA პლატფორმა შეიქმნა პროგრამული ენებთან სამუშაოდ, როგორიცაა C, C++ და Fortran. ამ ფუნქციასთან წვდომა სპეციალისტებს უადვილებს პარალელური პროგრამირების გამოყენებას, ვიდეოდაფის პროცესორის რესურსებით. CUDA-ს აქვს პროგრამის ჩარჩოების OpenACC-ისა და OpenCL-ის მხარდაჭერა. როდესაც Nvidia-მ პირველად წარმოადგინა CUDA, იყენებდნენ *ერთიანი გამომთლელი ხელსაწყოს არქიტექტურის* აბრევიატურად, მაგრამ მოგვიანებით აბრევიატურად გამოყენება შეწყვიტეს.

## პროგრამირების შესაძლებლობები
მინი|1. ინფორმაციის გადატანა მთავარი მეხსიერებიდან ვიდეოდაფის პროცესორის მეხსიერებაზე; 2. ცენტრალური პროცესორი იწყებს ვიდეოდაფის პროცესორის გამომთვლელი ბირთვის ამუშავებას; 3. ვიდეოდაფის პროცესორის CUDA ბირთვები იწყებს გამოთვლას; 4. შედეგების გადატანა ვიდეოდაფის პროცესორიის მეხსიერებიდან მთავარ მეხსიერებაში.
პროგრამისტებს CUDA პლატფორმის გამოყენება სპეციალური ბიბლიოთეკებით შეუძლიათ, რომელის მხარდაჭერაც კომპიუტერულ ენებს, C, C++ და Fortran, მათ გარდა ამ ფუნქციის მხარდაჭრა Khronos Group-ს OpenCL-ს, Microsoft-ის DirectCompute-ს, OpenGL Compute Shader-ს, C++ AMP-სა და სხვა პროგრამურ ენებს აქვთ.

კომპიუტერული თამაშების ინდუსტრიაში, ვიდეო დაფის პროცესორები გამოიყენება გრაფიკული დამუშავებისთვის, და თამაშის ფიზიკების ისეთი ეფექტების გამოსათვლელად, როგორიცაა ნამსხვრევები,  კვამლი, ცეცხლი, სითხე, PhysX-ისა და Bullet-ის ჩათვლით. CUDA ასევე გამოიყენება არაგრაფიკული პროცესების ასაჩქარებლად კომპიუტერულ ბიოლოგიაში, კრიპტოგრაფიასა და სხვა პროცესებში.

CUDA წარმოქმნის ორივე, დაბალი და მაღალი ხარისხის აპლიკაციის პროგრამულ ინტერფეისს. CUDA პროგრამური უზრუნველყოფის შემუშავების ნაკრები შეიქმნა 2007 წლის 15 თებერვალს, Microsoft Windows-ისა და Linux-ისთვის. მოგვიანებით 2008 წლის 14 თებერვალს, CUDA-ს 2.0 ვერსიას დაემატა Mac OS X-ის მხარდაჭერაც. იგი Nvidia-ს G8x სერიების შემდეგ, ყველა ვიდეოდაფის პროცესორებზე მოქმედებს.

CUDA 8.0 მოყვება შემდეგი ბიბლიოთეკები:
* cuBLAS - CUDA-ზე დაფუძნებული ძირითადი წრფივი ალგებრა;
* CUDART - CUDA-ს ხანგრძლივობის ბიბლიოთეკა;
* cuFFT - CUDA-ს სწრაფად მთარგმნელი ბიბლიოთეკა;
* cuRAND - CUDA-ს შემთხვევითი რიცხვების წარმომქმნელი ბიბლიოთეკა;
* cuSOLVER - CUDA-ზე დაფუძნებული მკვრივი და იშვიათი გამომთვლელების ნაკრები;
* cuSPARSE - CUDA-ს იშვიათი მატრიქსის ბიბლიოთეკა;
* NPP - Nvidia-ს პრიმიტიული გამოსახულების ბიბლიოთეკა;
* nvGRAPH - Nvidia-ს გრაფიკული ანალიზის ბიბლიოთეკა;
* NVML - Nvidia-ს მენეჯმენტის ბიბლიოთეკა;
* NVRTC - Nvidia-ს კრებულის ხანგრძლივობის ბიბლიოთეკა, CUDA C++-ისთვის;
* nView - Nvidia-ს nView სამუშაო მაგიდის მართვის ბიბლიოთეკა;
* NVWMI -  Nvidia-ს საწარმოო მართვის ბიბლიოთეკა;
* GameWorks PhysX - მრავალპლატფორმიანი თამაშის ფიზიკის დამმუშავებელი.

CUDA 9.0-9.2-ს მოყვება დამატებითი ფუნქციებიც:
* CUTLASS 1.0 - შეცვლილი ხაზოვანი ალგებრის ალგორითმები;
* nvJPEG - ჰიბრიდული JPEG ფაილების წარმოქმნელი;

## უპირატესობები
CUDA-ს, იმ ვიდეოდაფის პროცესორებისგან განსხვავებით რომლებიც იყენებენ გრაფიკული აპლიკაციის პროგრამირების ინტერფეისს, ზოგად გამოთვლებში რამდენიმე უპირატესობა აქვს, მაგალითად:
* არასაჭირო ინფორმაციის კითხვა - კოდს შეუძლია გაარჩიოს თვითნებური ადრესის მქონე ინფორმაცია;
* ერთიანი ვირტუალური მეხსიერება;
* ერთიანი მეხსიერება;
* გაზიარებული ინფორმაცია - CUDA გამოავლენს სასწრაფოდ გასაზიარებელ მეხსიერების რეგიონს, რომელიც პროცესორის ძაფებს უნდა გაუზიარდეს.
* სწრაფი გადმოწერა და პასუხის დაბრუნება ვიდეოდაფის პროცესორისგან;
* სრული მხარდაჭერა მთელ და ნახევარ ოპერაციებზე.

## შეზღუდვები
* ჰოსტ კომპიუტერების ან ვიდეოდაფის პროცესორის მოწყობილობის გარდა, ყველა CUDA წყაროს კოდი დამუშავებულია C++ სინტაქსის წესების მიხედვით. მაგრამ ეს ყოველთვის ასე არ ყოფილა, CUDA-ს ადრინდელი ვერსიები დამყარებული იყო C-ს სინტაქსის წესებზე. ზოგადად თუ c კოდში გამოვიყენებთ C++-ის კოდირების ენას, მაშინ სასურველი მოქმედება არ განხორციელდება ან ისე არ იმუშვებს როგორც საჭიროა.
* დამუშავების ენებთან თავსებადობა, როგორიცაა OpenGL, რომელთანაც ახასიათებს ცალსახა თავსებადობა. OpenGL-ს აქვს წდომა CUDA-ს მეხსიერებასთან, მაგრამ CUDA-ს არ აქვს წვდომა OpenGL-ის მეხსიერებასთან.
* მეხსიერების გადატანა, ჰოსტსა და მოწყობილობის მეხსიერებას შორის, რაც ანელებს გადატანის პროცესს, რომელიც გამოწვეულია სალტეს გამტარობისგან.
* საუკეთესო შედეგის მისაღებად საჭიროა 32 პროცესორის ძაფის ერთდროულად მუშაობა, პროგრამული კოდები არ აძნელებს სამუშაოს. გათვალისწინებული 32 ძაფები ირჩევს შესრულების სხვადასხვა გზას; SIMD ტიპის შესრულების მოდელი კი არის მნიშვნელოვანი შეზღუდვა სხვადასხვა ამოცანებისთვის.
* OpenCL-ისგან განსხვავებით, ბირთვები რომელბსაც CUDA ფუნქცია გააჩნია ხელმისაწვდომია მხოლოდ Nvidia-სათვის.
* არ აქვს ემულატორი და უკან დაბრუნების ფუნქცია.

## CUDA ფუნქციის მქონე ვიდეოდაფის პროცესორები
CUDA-ს დონის მხარდაჭერა სხვადასხვა ვიდეოდაფის პროცესორებისთვის.
* CUDA SDK 1.0 დამხმარე გამოთვლის შესაძლებლობების 1.0 - 1.1 ვერსია (Tesla)
* CUDA SDK 1.1 დამხმარე გამოთვლის შესაძლებლობების 1.0 - 11+x (Tesla)
* CUDA SDK 2.0 დამხმარე გამოთვლის შესაძლებლობების 1.0 - 1.1+x (Tesla)
* CUDA SDK 2.1 - 2.3.1 დამხმარე გამოთვლის შესაძლებლობების 1.0 - 1.3 (Tesla)
* CUDA SDK 3.0 - 3.1 დამხმარე გამოთვლის შესაძლებლობების 1.0 - 2.0 (Tesla, Fermi)
* CUDA SDK 3.2 დამხმარე გამოთვლის შესაძლებლობების 1.0 - 2.1+x (Tesla, Fermi)
* CUDA SDK 4.0 - 4.2 დამხმარე გამოთვლის შესაძლებლობების (Tesla, Fermi)
* CUDA SDK 5.0 - 5.5 დამხმარე გამოთვლის შესაძლებლობების 1.0 - 2.1+x (Tesla, Fermi)
* CUDA SDK 6.0 დამხმარე გამოთვლის შესაძლებლობების 1.0 - 3.5 (Tesla, Fermi, Kepler)
* CUDA SDK 6.5 დამხმარე გამოთვლის შესაძლებლობების 1.1 - 5.x (Tesla, Fermi, Kepler, Maxwell)
* CUDA SDK 7.0 - 7.5 დამხმარე გამოთვლის შესაძლებლობების 2.0 - 5.x (Fermi, Kepler, Maxwell)
* CUDA SDK 8.0 დამხმარე გამოთვლის შესაძლებლობების 2.0 - 6.x (Fermi, Kepler, Maxwell, Pascal).
* CUDA SDK 9.0 - 9.2 დამხმარე გამოთვლის შესაძლებლობების 3.0 - 7.2 (Kepler, Maxwell, Pascal, Volta)
* CUDA SDK 10.0 - 10.1 დამხმარე გამოთვლის შესაძლებლობების 3.0 - 7.5 (Kepler, Maxwell, Pascal, Volta, Turing)

## ვერსიები და მახასიათებლები
## რესურსები ინტერნეტში
* https://developer.nvidia.com/cuda-zone

კატეგორია:ტექნოლოგია