wtorek, 20 października 2009

CUDA NVidia

Niedawno otrzymałem zadanie wykorzystania CUDA w algorytmie optymalizacji polegającym na przeszukiwaniu przestrzeni rozwiązań za pomocą "roju". Zaletą CUDA jest wykorzystanie procesora graficznego do przeprowadzania równoległych obliczeń na wielu zmiennych (przynajmniej w tej chwili tak to rozumiem).
Pomyślałem, że mogę wykonać ten projekt na Ubuntu 8.04.
Udałem się na stronę NVIDIA, gdzie w tej chwili znajdują się sterowniki w wersji 185 oraz CUDA Toolkit 2.2.
Niestety poniosłem porażkę - nie umiałem zainstalować sterowników. Po każdej instalacji Xy wstawały w trybie niskiej jakości grafiki. Doczytałem w internecie, że envyNG instaluje sterowniki NVIDIA wraz z biblioteką libcuda. Za pomocą tego programu udało mi się zainstalować sterowniki w wersji 173. Następnie zainstalowałem CUDA Toolkit oraz CUDA SDK. Zacząłem budować przykładowe projekty. Po wykonaniu make dostałem informację, że nie można znaleźć bibliotek libglut, więc zainstalowałem ją z repozytorium - `sudo apt-get install libglut3 libglut3-dev`. Następnym problemem okazał się projekt threadMigration - tutaj po prostu zmieniłem nazwę Makefile na Makefile-renamed i tego projektu nie uda mi się odpalić. W końcu wszystkie projekty zbudowane i wchodzę do katalogu /home/daniel/NVIDIA_CUDA_SDK/bin/linux/release/. Tutaj najpierw uruchamiam ./deviceQuery z następującym rezultatem:
CUDA Device Query (Runtime API) version (CUDART static linking)
There is 1 device supporting CUDA

Device 0: "GeForce 8400M GS"
CUDA Capability Major revision number: 1
CUDA Capability Minor revision number: 1
Total amount of global memory: 267714560 bytes
Number of multiprocessors: 16
Number of cores: 128
Total amount of constant memory: 65536 bytes
Total amount of shared memory per block: 16384 bytes
Total number of registers available per block: 8192
Warp size: 32
Maximum number of threads per block: 512
Maximum sizes of each dimension of a block: 512 x 512 x 64
Maximum sizes of each dimension of a grid: 65535 x 65535 x 1
Maximum memory pitch: 262144 bytes
Texture alignment: 256 bytes
Clock rate: 0.80 GHz
Concurrent copy and execution: Yes
Run time limit on kernels: No
Integrated: Yes
Support host page-locked memory mapping: Yes
Compute mode: Default (multiple host threads can use this device simultaneously)

Test PASSED

Press ENTER to exit...

Co oznacza, że mam urządzenie "CUDA Capable". Następny test na porozumiewanie się urządzenia z systemem: ./bandwidthTest
Running on......
device 0:GeForce 8400M GS
Quick Mode
Host to Device Bandwidth for Pageable memory
.
Transfer Size (Bytes) Bandwidth(MB/s)
33554432 856.9

Quick Mode
Device to Host Bandwidth for Pageable memory
.
Transfer Size (Bytes) Bandwidth(MB/s)
33554432 895.4

Quick Mode
Device to Device Bandwidth
.
Transfer Size (Bytes) Bandwidth(MB/s)
33554432 4214.5

&&&& Test PASSED

Press ENTER to exit...


Zatem teoretycznie wszystko dobrze, ale nie mogę uruchomić żadnego przykładu. Najczęstszym błędem jest "cudaSafeCall() Runtime API error in file , line 51 : feature is not yet implemented." Wynika z tego, że CUDA 2.2 nie da rady działać na obecnych sterownikach i będę musiał walczyć z tymi ściągniętymi ze strony NVIDIA.

EDIT:
Z ostatniej chwili: udało mi się zainstalować sterowniki na XP. Pomogło wybranie sterowników dla notebooków. Pozwala to wykorzystywać CUDA w wersji 2.2.