CUDA na Gentoo
Jste-li alespoň trochu geek(yně) se zálibou v jazyce C, rozhodně vám doporučuji se podívat na věc jménem CUDA. V podstatě se jedná o využití procesoru na grafické kartě nVidia k libovolným paralelním výpočtům - a když říkám paralelní, nemám na mysli usmolená čtyři jádra, ale zhruba od 192 jader výše (právě tolik jich má GeForce GTS 450, rozumný základní model, ale další modely jich mají až 1024). Nejsem žádný CUDA guru, hraju si s tím pár dní, ale třeba vám moje zkušenosti pomohou s prvními kroky - zejména pokud používáte Gentoo jako já ...
Řekněme že jste kartu úspěšně nainstalovali do PCI-E slotu a nastartovali jste do Gentoo. Zkontrolujte že OS o grafické kartě ví, tj. že se objeví ve výpisu lspci:
$ lspci | grep -i 'vga .* nvidia'
Pokud se v něm objevilo něco jako
01:00.0 VGA compatible controller: nVidia Corporation Device 1245 ...
je všechno v nejlepším pořádku. Teď potřebujete nainstalovat několik balíčků - drivery, SDK a toolkit
- x11-drivers/nvidia-drivers
- dev-util/nvidia-cuda-sdk
- dev-util/nvidia-cuda-toolkit
Aktuální verze SDK a toolkitu je 4.0, v portage je ale stále zamaskována takže ji musíme odmaskovat (ne, skutečně nechci používat obstarožní verzi 2.x). Do /etc/portage/package.keywords tedy vložíme
dev-util/nvidia-cuda-sdk dev-util/nvidia-cuda-toolkit
Není nutné tam uvádět i nvidia-drivers, ale je dobré mít poslední stabilní verzi - s verzí 270.41.06 mi to nefungovalo, s verzí 270.41.19 už to šlape bez problémů.
No, a teď už můžeme instalovat, takže zadejte
emerge nvidia-cuda-sdk nvidia-cuda-toolkit
a pokud vše doběhne, jste na nejlepší cestě k funkční CUDA. Odzkoušejme tedy jestli to chodí. SDK mimo jiné do /opt/cuda/sdk/C/bin/linux/release nainstaluje sadu ukázkových programů. Program který chceme spustit je deviceQuery a musíte ho spustit s právy roota:
$ sudo /opt/cuda/sdk/C/bin/linux/release/deviceQuery
což by mělo vypsat informace o dostupných kartách podporujících CUDA. U mne to vypíše toto:
[deviceQuery] starting... ./deviceQuery Starting... CUDA Device Query (Runtime API) version (CUDART static linking) Found 1 CUDA Capable device(s) Device 0: "GeForce GTS 450" CUDA Driver Version / Runtime Version 4.0 / 4.0 CUDA Capability Major/Minor version number: 2.1 Total amount of global memory: 1024 MBytes (...) ( 4) Multiprocessors x (48) CUDA Cores/MP: 192 CUDA Cores GPU Clock Speed: 1.57 GHz Memory Clock rate: 1804.00 Mhz Memory Bus Width: 128-bit L2 Cache Size: 262144 bytes ...
a spoustu dalších informací.
Ten program ale automaticky dělá ještě jednu věc - vytváří potřebná zařízení v /dev, konkrétně
/dev/nvidiactl /dev/nvidia0
a případné další /dev/nvidiaX pro další karty. Já mám jednu takže se vytvoří jen /dev/nvidia0. Každopádně pokud byste ten program nespustili jako root ale jako obyčejný uživatel, dostanete tuto nicneříkající chybu
[deviceQuery] starting... ./deviceQuery Starting... CUDA Device Query (Runtime API) version (CUDART static linking) cudaGetDeviceCount returned 38 -> no CUDA-capable device is detected [deviceQuery] test results... FAILED Press ENTER to exit...
což prostě znamená "soubory v /dev neexistují a nemohu je vytvořit." To je samozřejmě trochu nepříjemné protože soubory po restartu zmizí a pro jejich vytvoření nestačí "modprobe nvidia." Je potřeba je skutečně vytvořit. Buď můžete po každém restartu spustit ./deviceQuery pod rootem, nebo můžete do /etc/local.d/ přidat tento skript
#!/bin/bash /sbin/modprobe nvidia if [ "$?" -eq 0 ]; then # Count the number of NVIDIA controllers found. NVDEVS=`lspci | grep -i NVIDIA` N3D=`echo "$NVDEVS" | grep "3D controller" | wc -l` NVGA=`echo "$NVDEVS" | grep "VGA compatible controller" | wc -l` N=`expr $N3D + $NVGA - 1` for i in `seq 0 $N`; do if [ ! -e "/dev/nvidia$i" ]; then mknod -m 666 /dev/nvidia$i c 195 $i fi done if [ ! -e "/dev/nvidiactl" ]; then mknod -m 666 /dev/nvidiactl c 195 255 fi else exit 1 fi
což je mírně modifikovaný skript z CUDA Getting Started Guide (před vytvořením kontroluje zda daný soubor již existuje). Nazvěte ho cuda.start a označte ho jako spustitelný.
Osobně používám také skript /etc/local.d/cuda.stop, který dělá přesný opak, tj. ruší soubory vytvořené v cuda.start a odstraňuje modul nvidia z jádra.
#!/bin/bash # check if there's a nvidia module mod=`lsmod | grep '^nvidia ' | wc -l` if [ "$mod" -eq "1" ]; then # Count the number of NVIDIA controllers found. NVDEVS=`lspci | grep -i NVIDIA` N3D=`echo "$NVDEVS" | grep "3D controller" | wc -l` NVGA=`echo "$NVDEVS" | grep "VGA compatible controller" | wc -l` N=`expr $N3D + $NVGA - 1` for i in `seq 0 $N`; do if [ -e "/dev/nvidia$i" ]; then rm /dev/nvidia$i fi done if [ -e "/dev/nvidiactl" ]; then rm /dev/nvidiactl fi rmmod nvidia else exit 1 fi
Potom by to mělo správně fungovat i při restartu služby /etc/init.d/local.
Nevím ale jestli to bude fungovat v případě že danou grafickou kartu používáte jako primární (tj. například pro Xka) - já většinou jedu přes integrovanou grafiku a Nvidii mám právě jenom pro CUDA.
Každopádně si myslím že by nebylo od věci přidat to přímo do nvidia-cuda-sdk, takže jsem na to založil tento enhancement bug.
Update: Podle informací v uvedeném bugu by soubory v /dev měly být vytvářeny automaticky po každém restartu. Nejsem si jist proč se to neděje na mém počítači, ale tipuji že je to tím že tu nVidia kartu používám jen na CUDA. Každopádně před vytvářením těch skriptů po restartu (a před spuštěním deviceQuery s rootovskými právy) zkontrolujte zda se uvedené /dev/nvidia* soubory existují - pokud ano, nemusíte se mazat s těmi start/stop skripty.
Jen pro úplnost - se staršími drivery (270.41.06) to házelo tuto chybu
[deviceQuery] starting... ./deviceQuery Starting... CUDA Device Query (Runtime API) version (CUDART static linking) cudaGetDeviceCount returned 3 -> initialization error [deviceQuery.exe] test results... FAILED Press ENTER to exit...
ale instalací novější verze to vyřešilo.




