Hlavní navigace

Úvod do technologie CUDA

20. 7. 2009
Doba čtení: 6 minut

Sdílet

Uplynulo již mnoho času od dob, kdy začaly GPU výkonnostně předhánět klasická CPU. Proto není divu, že vznikly iniciativy, aby GPU nebyly využívány jen pro zpracování 2D nebo 3D grafiky, ale pro celou škálu jiných, rovněž výkonnostně náročných aplikací a jejich potenciál, kterým je především kvalitní podpora pro paralelní výpočty na multiprocesorech, byl efektivně využit.

Z těchto iniciativ pak vznikly konkrétní technologie, jako Compute Unified Device Architecture (dále jen CUDA) společnosti nVidia nebo ATI Stream společnosti AMD/ATI či standard Open Computing Language (dále jen OpenCL) pod záštitou konsorcia Khronos (tvořená společnostmi jako AMD, Intel, nVidia, IBM, a dalších 100 společností), která rovněž udržuje dobře známý standard OpenGL. A jelikož není v českých končinách ani jedna z výše popisovaných technologií podrobněji popsána (snad jen kromě menších zpráviček a akademické půdy), rozhodl jsem se napsat seriál o základním popisu technologie CUDA z pohledu vývojáře (v budoucnu možná i o OpenCL). Postupně si probereme vše důležité pro vývoj CUDA programů, od základů architektury CUDA přes konkrétní příklady zdrojových kódů, až po optimalizace CUDA programů a také poradím, na co by si měl dát vývojář pozor.

Možná se ptáte, proč jsem si vybral zrovna technologii CUDA? Důvodů je více. CUDA je nejstarší zveřejněnou technologií pro paralelní výpočty na GPU, a proto je již dobře mezi vývojáři rozšířená. Má kvalitní API, dá se s ní pracovat na všech grafických akcelerátorech série G80 a vyšší. Drivery a SDK implementující standard OpenCL nejsou zatím veřejně dostupné (jen pro registrované vývojáře CUDA – v době psaní tohoto článku). CUDA se snadno učí (dá se emulovat i na klasickém CPU), a v neposlední řadě i proto, že prostě mám “GeForcku” ;-). 

Porovnání výkonu nVidia GPU s Intel CPU

Obr. 1.1: Porovnání výkonu nVidia GPU s Intel CPU

Instalace CUDA SDK

Než začneme pracovat s CUDA, je nutné si stáhnout a nainstalovat CUDA SDK (Software Development Kit), které je aktuálně dostupné ve verzi 2.2 (existuje verze 2.3 beta, ta je však dostupná jen registrovaným vývojářům CUDA, ovšem dá se sehnat přes jednu nejmenovanou pirátskou zátoku, ale pssst) na této adrese. Nejdříve si vybereme operační systém. V našem případě to bude (“doufám”) Linux, dále pak distribuci, což v mém případě je Ubuntu 8.10 (CUDA v2.3 již podporuje 9.04, ale její beta není prozatím veřejně dostupná). A poté stáhneme CUDA Driver (na svém systému můžete mít již driver podporující CUDA, ovšem doporučuji upgradovat na nejnovější verzi), CUDA Toolkit, CUDA SDK a CUDA Debugger. Všechny stažené soubory jsou *.run, takže změníme jejich příznak na spustitelný pomocí příkazu chmod a následně instalujeme jednotlivé části. Nejdříve začneme drivery a pak pokračujeme toolkitem, sdk a nakonec debuggerem. Například pokud budeme-li mít všechny stažené soubory v adresáři cuda našeho domovského adresáře, bude vypadat postup následovně (pro Ubuntu):

$ chmod +x *.run 

Než začneme instalovat CUDA driver, musíme nainstalovat nezbytné balíčky:

$ sudo apt-get install build-essential linux-headers-$('uname -r') 

Zazálohujeme Xorg.conf:

$ sudo cp /etc/X11/xorg.conf /etc/X11/xorg.conf.original
$ sudo dpkg-reconfigure -phigh xserver-xorg 

Dále musíme odstranit staré verze driverů nebo zakázat modul nv. První možnost:

$ sudo apt-get --purge remove $(dpkg -l | grep nvidia | awk '{print $2}') 

Druhá možnost: zakázat modul nv přidáním řádku DISABLED_MODU­LES=”nv” v linux- restricted-modules-common, tedy:

$ sudo gedit /etc/default/linux-restricted-modules-common 

Nyní se pomocí kombinace kláves ctrl+alt+F1 dostaneme do terminálu (musíme se přihlásit). Dále musíme vypnout GNOME (můžeme po následujícím příkazu ještě napsat sudo killall Xorg, pokud by Xka stále běžela):

$ sudo /etc/init.d/gdm stop 

Nyní nainstujeme CUDA Driver (spustí se instalátor, držte se instrukcí):

$ sudo ./NVIDIA-Linux-x86-185.18.14.pkg1.run 

Po úspěšné instalaci lze znovu zapnout desktop (při spuštění se objeví logo NVIDIA)

$ sudo /etc/init.d/gdm start 

Po opětovném nastartování GNOME a spuštění terminálu můžeme nainstalovat CUDA Toolkit, CUDA SDK a CUDA Debugger (opět se řídíme jednoduchých instrukcí):

$ sudo ./cudatoolkit_2.2_linux_32_ubuntu8.10.run
$ sudo ./cudasdk_2.21_linux.run
$ sudo ./cudagdb_2.2_linux_32_rhel5.3.run 

Jak vidíme, instalace je v celku jednoduchá, měl by ji zvládnout opravdu každý mírně pokročilý uživatel Linuxu. Největší rozdíl v instalaci CUDA SDK na jednotlivé distribuce spatřuji jen v mírně odlišné instalace driverů a debuggeru (viz. dále). V posledním kroku instalace musíme dát ve známost našemu prostředí, kde máme CUDA nainstalovanou. Pokud jste nechali přednastavené cesty, můžeme následovat takto:

$ echo "export PATH=/usr/local/cuda/bin:$PATH”>> ~/.bashrc
$ echo “export LD_LIBRARY_PATH=/usr/local/cuda/lib:$LD_LIBRARY_PATH” >> ~/.bashrc 

Po vypnutí a znovu zapnutí terminálu již máme nastavené všechny důležité cesty. Ještě zbývá nainstalovat libncurses5-dev, který není součástí systému, jinak bude po spuštění debuggeru (cuda- gdb) vypisovat hlášku, že mu chybí knihovna libtermcap.so.2. Je tomu tak proto, že oficiálně cuda debugger je podporován pouze na systému RHEL 5. Tedy: $ sudo apt-get install libncurses5-dev Po této instalaci balíčku by měl bez problému fungovat i debugger. Nyní máme CUDA SDK nainstalovanou a plně funkční.

Popis CUDA SDK

Pokud jste při instalaci SDK nechali přednastavenou cestu, bude CUDA SDK v adresáři ~/NVIDIA_CUDA_SDK. Zde se nachází pro nás několik důležitých adresářů:

*bin – zde v podadresáři linux/release budou zkompilované spustitelné soubory příkladů a našich projektů, common – tady se nachází v podadresáři inc hlavičkové soubory .h nutné pro kompilaci programů, projects – adresář s příklady CUDA a rovněž šablonou pro naše projekty (adresář template), tools – zde se nachází CUDA_Occupancy_cal­culator.xls, slouží k výpočtu optimalizace pro execution configuration (bude vysvětleno později).

Všechny příklady můžeme zkompilovat pomocí příkazu make v kořenovém adresáři CUDA SDK, tedy:

$ make 

A poté jednotlivé programy spouštět z adresáře $NVIDA_CUDA_SDK/bin/l­inux/release. Ještě bych chtěl zmínit jeden důležitý adresář a to je po instalaci CUDA Toolkitu adresář /usr/local/cuda, kde se nachází adresář doc s pdf a html soubory pro práci s SDK (Programming Guide, referenční příručka, dokumentace kompilátoru nvcc, apod.).

Základní popis architektury CUDA

A nyní si již konečně pojďme říct něco praktického o architektuře CUDA. Podívejme se na obrázek 1.2 popisující tuto architekturu. Je z něj patrné, že CUDA podporuje různé jazyky a API, jako Fortran, OpenCL, C nebo DirectX Compute. Ovšem v našem seriálu se omezíme pouze na jazyk C, který je jistě čtenářům dobře známý. Posuneme-li se o úroveň výše, vidíme, že CUDA je dostupná na všech nejpoužívanějších platformách, tedy nejen na Linuxu, ale i na OS X a Windows. V seriálu se zaměříme na platformu Linux, konkrétně si ukážeme instalaci CUDA SDK na distribuci Ubuntu. Rovněž je vhodné vyjmenovat všechna možná odvětví, kam se CUDA hodí, například věda, medicína, zpracování videa, film, offline rendering, apod.

Architekura CUDA

Obr 1.2: Architekura CUDA

A jak vypadá CUDA zevnitř (z pohledu GPU)? To už nám prozrazuje obr. 1.3, kde můžeme vidět, že celé zařízení je rozděleno na tyto části: multiprocesory (například GeForce 8800 GTS jich má 12) – každý multiprocesor má 8 procesorů instrukční jednotka procesory – 32-bitový procesor architektury SIMT (Single Instruction Multi-Thread vycházející z architektury SIMD) a jak bylo uvedeno výše, 8 procesorů tvoří jeden multiprocesor, registry – 32 bitové, 8192 registrů na G80, sdílená paměť – kešovaná, velikost 16KB na G80, paměť pro konstanty – kešovaná, paměť pro textury – kešovaná, globální paměť – paměť určená pro kopírování dat z RAM do GPU a naopak.

UX DAy - tip 2

CUDA architektura z pohledu GPU

Obr 1.3: CUDA architektura z pohledu GPU

Jak je vidět z dalšího obrázku (obr. 1.4), CUDA aplikace může přistupovat k jakékoliv části API CUDA. Ať už se jedná o knihovny CUBLAS (Basic Linear Algebra Subprograms) nebo CUFFT (Fast Fourier Transform), tak i runtime API nebo driver API. V dalších dílech se budeme zaměřovat na runtime API, pokud nebude řečeno jinak.

Přístup programu k API CUDA

Obr 1.4: Přístup programu k API CUDA

Závěr

Pro dnešní úvodní díl je to vše. V příštím díle seriálu si probereme terminologii CUDA (včetně execution model) a podíváme se na náš první program, který si podrobně vysvětlíme. Do té doby se můžete podívat například na Appendix A.1 General Specifications v CUDA 2.2 Programming Guide (dostupný zde nebo po instalaci CUDA Toolkitu v /usr/local/cu­da/doc), kde je uvedena přehledná tabulka grafických karet podporujících CUDA, a to včetně počtu multiprocesorů a verze Compute Capability (probereme v dalších dílech).

Použitá literatura:

  • [1] CUDA 2.2 Programming Guide
  • [2] CUDA 2.2 QuickStart Guide

Použité obrázky byly převzaty z těchto odkazů:

Byl pro vás článek přínosný?