CUDA Moniydinohjelmointi 17.4.2012 Mikko Honkonen
Yleisesti Compute Unified Device Architecture Ideana GPGPU eli grafiikkaprosessorin käyttö yleiseen laskentaan. Nvidian täysin suljetusti kehittämä. Vuoden 2012 alusta avoin, kehittäjät voivat hakea Nvidialta pääsyä lähdekoodiin. Versio 1.0 julkisesti saatavilla helmikuussa 2007, viimeisin versio 4.1 tammikuussa 2012.
Yleisesti Vaatii Nvidian näytönohjaimen, vähintään Geforce 8-sarjaa. Käyttöjärjestelminä Windows, OS X ja Linux. Pääasiallisena kehityskielenä C tai C++, lisäksi bindingit mm. Javalle,.NETille, Pythonille. Runsaasti valmiita kirjastoja erityisesti tieteelliseen laskentaan. Kilpailijoita OpenCL ja DirectCompute. Toimivat myös muilla näytönohjaimilla, OpenCL:ssä myös CPU-fallback
Miksi? CUDA is NVIDIA s parallel computing architecture. It enables dramatic increases in computing performance by harnessing the power of the GPU.
Miksi? Intel i5 2500: 200, 25 GFLOPs Nvidia Geforce GTX 560: 200, 1075 GFLOPs Toki prosessori löytyy jokaisesta koneesta, CUDA-kykenevää näytönohjainta ei. Useita näytönohjaimia helppo käyttää rinnakkain. CUDAn käyttöönotto melko nopeaa ja vaivatonta.
Mihin? Optimaalinen tehtävä sisältää suuren joukon liukulukuja, jonka jokaiselle alkiolle suoritetaan jokin tietty operaatio. Erityisesti neliöjuuri, trigonometriset operaatiot yms. ovat nopeita. Koska laskenta tapahtuu prosessorin ulkopuolella, voi prosessori samaan aikaan tehdä jotain muuta.
Missä?
Termit Kernel: Näytönohjaimella suoritettava funktio. Thread/säie: Yksi kernelin instanssi. Warp: 32 säiettä, SIMD-tyylisesti suoritettava joukko samanlaisia säikeitä. Block/lohko: 1 1024 säiettä, joukko samanlaisia säikeitä jotka ajetaan samanaikaisesti. Grid: Joukko samanlaisia lohkoja, jotka ajetaan toisistaan riippumatta. Kun ajetaan useampia lohkoja, CUDA suorittaa samanaikaisesti niin monta lohkoa kuin kortille mahtuu.
Termit kuvana
Sovellusten kehittäminen CUDA toolkit (kääntäjä + muut työkalut) Ajurit (sovellusten ajaminen) GPU Computing SDK (sampleja yms.) Näytönohjaimella ajettava koodi (kernelit) C- pohjaista, myös C++:n ominaisuuksia. Sovellus käyttää CUDAa joko runtime- tai driverkutsujen avulla (ei molempia). CUDAa käyttävät tiedostot käännetään CUDAkääntäjällä. Mikäli käyttää C:tä tai C++:aa, voi koko sovelluksen halutessaan kääntää tällä.
Rajapinnat
Kernelit Avainsanalla global sovelluksesta kutsuttava kernel. vrt. device vain toisesta kernelistä Ei paluuarvoa. Kernelin sisällä käytössä tiettyjä säikeen yksilöiviä arvoja.
Runtimen käyttäminen
Datan siirto Tehtävästä riippuen datan siirto keskusmuistin ja näytönohjaimen välillä voi viedä moninkertaisesti aikaa verrattuna itse laskentaan. Tämän vuoksi hyvin yksinkertaisia tehtäviä ei kannata kortille siirtää. Kaikki kortit kykenevät samanaikaisesti suorittamaan kerneliä ja kopioimaan dataa kortin ja keskusmuistin välillä yhteen suuntaan. Lisäksi kehittyneemmät kortit kykenevät molemminsuuntaiseen kopiointiin.
Liukuhihnoittaminen MEM - GPU GPU CPU GPU - MEM Tyhmä sovellus: Optimaalinen sovellus:
Nopeus C = A + B Q6600 GTX 460 T8100 8600M 1 000 0 1 0 1 10 000 0 1 0 2 100 000 1 2 1 6 1 000 000 5 10 5 21 10 000 000 54 88 46 150 Ajat millisekunteja
Nopeus C = sqrt(sin(a) + cos(b)) Q6600 GTX 460 T8100 8600M 1 000 0 1 0 1 10 000 1 1 1 2 100 000 14 2 13 6 1 000 000 185 10 125 21 10 000 000 1340 89 1238 151 Ajat millisekunteja
Suoritusaika 10 000 000 alkiolla suoritusaika jakautui 8600Mnäytönohjaimella seuraavasti: A ja B kopiointi Laskenta C kopiointi C = A + B 72 ms 0 ms 64 ms C = sqrt(sin(a)+cos(b)) 72 ms 1 ms 64 ms Lisäksi sovelluksen ensimmäinen CUDA-kutsu alustaa laitteen käyttöön, johon kului aikaa n. 90 ms. Tätä ei otettu huomioon mittauksissa.
Yhteenveto GPGPU noin yleisesti varteenotettava teknologia. CUDAlla kehittämisen aloittaminen helppoa hyvän dokumentaation, esimerkkien ja kirjastojen vuoksi. OpenCL saattaa kuitenkin olla varmempi valinta yhteensopivuutensa vuoksi. Nvidian OpenCL-tuki melko heikkoa, joten jos aikoo käyttää Nvidiaa, on CUDA parempi (nopeampi).
Lähteet/linkkejä Kuvat: http://www.tomshardware.com/reviews/nvidia-cuda-gpu,1954.html http://developer.nvidia.com/category/zone/cuda-zone Lataa CUDA 4.1: http://developer.nvidia.com/cuda-toolkit-41