środa, 26 września 2012

New blog

I have started a new blog, where I am going to publish all new articles, not only about CUDA. Old posts are now moved to this new location I called Sys.B.Log. Enjoy new layout and posts organization :) Current CUDA-Wianki blog will be removed soon...

piątek, 10 lutego 2012

Eclipse with CUDA

Writing small programs in CUDA could be done simply in any text editor. But as I was working on slightly bigger application, I tried to find good IDE, which allows to develop applications with CUDA support. Unfortunately I was wrking on Ubuntu so I couldn't just use Parallel Nsight, which comes as a plugin for Visual Studio only. I tries different IDEs, but Eclipse was the most flexible. So here are the hints which may be useful when we want to use CUDA in Eclipse.

First of all we should install CUDA SDK and download Eclipse with C/C++ support. After downloading and setting all up properly we should create just empty C/C++ project in Eclipse or just use existing one. I always try to separate CUDA source files from ordinary C/C++ sources in project.

The next steps will set necessary global properties for our project. We should create some build variables (just select "Project"->"Properties") and make new variables for selected build configuration as presented below:


Four variables should be set:
  1. CUDA_INCLUDE - path for CUDA header files, which are installed with CUDA SDK
  2. CUDA_LIB - path for libraries installed with CUDA SDK. Notice that you should point to directory with libraries compiled for our system (in my case 64bit architecture)
  3. NVCC - CUDA compiler which will be used to compile our CUDA sources
  4. NVCC_ARCH - this one is for additional compiler flags. We don't have to set this one. I have used it for setting target compute architecture (double precision)
Next we should use above variables for setting default compiler and linker options. Following screens should guide you through the basics.




Next we should tell Eclipse, that our CUDA source should be considered as C source files.



Now everything is ready to use. When we create new file with *.cu extension, in which we put all CUDA specific code, we need to compile this sources with nvcc compiler. In order to do that, we should select "Properties" for that specific file and set custom build step.


The last figure shows how to set custom build step for integrate_2d_cuda.cu example file. This build step creates integrate_2d_cuda.o file, by using nvcc compiler, which then will be used by gcc/g++ linker to build application.

There is one thing we should do to prevent Eclipse from complaining about unknown keywords in CUDA source files. At the very beginning of each *.cu we just add following lines:

//Only for eclipse parsers
#ifdef __CDT_PARSER__
#define __global__
#define __device__
#define __shared__
#define __const__
#endif

That is all. Now we can develop application as ordinary C/C++ project. We should only remember that for each CUDA source file we have to set custom build step. Happy coding!

wtorek, 9 lutego 2010

Instalacja CUDA Ubuntu 9.04 AMD64

W końcu przemogłem się i postanowiłem napisać krótką instrukcję jak zainstalować CUDA na własnym sprzęcie.

Na początek może o konfiguracji, na jakiej przeprowadziłem instalację (pomijam kwestie sprzętowe):
  • Ubuntu 9.04 AMD64 (oczywiście może być i386)
  • gcc / g++ 4.3.3 (instalacja z paczek Ubuntu)
  • CUDA developer driver x86_64 190.42 (Pobierz)
  • CUDA Toolkit 2.3 (Pobierz)
  • CUDA SDK 2.3 (Pobierz)
  • glutg3-dev (instalacja z paczek Ubuntu, w moim przypadku była to wersja 3.7-25)
  • libxi-dev (instalacja z paczek Ubuntu, w moim przypadku była to wersja 2:1.2.0)
  • libxmu-dev (instalacja z paczek Ubuntu, w moim przypadku była to wersja 2:1.0.4-1)

Przy powyższej konfiguracji software udało się skompilować i uruchomić przykłady z paczki SDK. Możliwe, że drobne odstępstwa od tych konkretnych wersji podanych powyżej, są dozwolone i wszystko powinno działać. Osobiście testowałem instalację na Kubunut 9.10 AMD64 i Debianie Etch i Lenny, AMD64 oraz i386 i za każdym razem udawało się wszystko zainstalować.

A więc do dzieła...

1. Instalacja drivera

Instalacji drivera dokonujemy z trybu konsoli, przy wyłączonym serwerze X. Aby wyłączyć managera okien, najprostszym sposobem jest wydanie polecenia:

$ sudo /etc/init.d/gdm stop

lub w przypadku managera okien KDM:

$ sudo /etc/init.d/kdm stop

Po zatrzymaniu managera i zalogowaniu, uruchamiamy instalatora sterownika:

$sudo sh NVIDIA-Linux-x86_64-190.42-pkg2.run

Cała instalacja polega na wyborze "dalej, dalej", czyli przejściu prze domyślne opcje. Ważne jest by mieć zainstalowane w systemie odpowiednie paczki (z tzw. kernel headers), by poprawnie został skompilowany moduł sterownika. Tylko w Debianie musiałem dodatkowo instalować te pakiety.

Po poprawnym zainstalowaniu i restarcie systemu, powinniśmy mieć załadowany nasz sterownik. Możemy zatem przystąpić do instalacji samej biblioteki CUDA i narzędzi.

2. Instalacja bibliotek

Tym razem wszystkie polecenia możemy wywoływać w konsoli, przy włączonym trybie graficznym. Instalację narzędzi CUDA, możemy przeprowadzić w katalogu domowym użytkownika, bez sudo:

sh cudatoolkit_2.3_linux_64_ubuntu9.04.run

Instalator zapyta o ścieżkę docelową, w moim przypadku była to:

/home/adam

Docelowo instalator do podanej ścieżki doklei /cuda, zatem całość powinna się zainstalować w /home/adam/cuda.

Aby narzędzia CUDA były dostępne dla naszego użytkownika musimy wyedytować zmienną PATH:

$ vim ~/.bashrc

W powyższym pliku na samym końcu dodajemy linijkę

export PATH=$PATH:/home/adam/cuda/bin

i zapisujemy plik. Dzięki czemu zapiszemy sobie na stałe ścieżkę przeszukiwania i narzędzia cuda będą dostępne. Aby linker widział biblioteki CUDA, należy dodać odpowiednią ścieżkę w:

$ sudo vim /etc/ld.so.conf

W pliku tym dopisujemy na końcu linijkę:

/home/adam/cuda/lib64
w przypadku architektury AMD64. W przeciwnym razie wpisujemy po prostu

/home/adam/cuda/lib

Wystarczy teraz wydać polecenie:

$ sudo ldconfig

To w zasadzie wszystko. Możemy sprawdzić jaką wersję kompilatora mamy zainstalowaną:

$ nvcc --version

3. Instalacja CUDA SDK i kompilacja przykładów

Żeby rzeczywiście przetestować naszą instalację i rozpocząć zabawę z CUDA, najlepiej zainstalować pakiet SDK i skompilować zawarte w nim przykłady. Uruchamiamy instalację:

$ sh cudasdk_2.3_linux.run

Instalator powinien wykryć gdzie mamy zainstalowaną bibliotekę CUDA. Jeśli nie podajemy mu odpowiednią ścieżkę:

/home/adam/cuda

Po zainstalowaniu powinno być wszystko OK, ale w moim przypadku nie było. Jeśli nie kompilują się przykłady z SDK, należy najpierw sprawdzić, czy ścieżka do biblioteki została poprawnie ustawiona. Niestey u mnie tak nie było. W pliku:

$ vim ~/NVIDIA_GPU_Computing_SDK/C/common/common.mk

w linii 41, należy odpowiednio zmodyfikować zmienną CUDA_INSTALL_PATH:

CUDA_INSTALL_PATH=/home/adam/cuda

Nie wiedzieć czemu w moim przypadku instalator nie wyedytował automatycznie tej zmiennej.

Jeśli do tego momentu wszystko się udało, to znaczy, że można skompilować przykłady z SDK. Z katalogu ~/NVIDIA_GPU_Computing_SDK/C wydajemy polecenie:

~/NVIDIA_GPU_Computing_SDK/C $ make

Rozpocznie się kompilacja, która może chwilę potrwać. Po skompilowaniu, przykłady można znaleźć w katalogu ~/NVIDIA_GPU_Computing_SDK/C/bin/linux/release. Polecam na początek uruchomić test:

$ ~/NVIDIA_GPU_Computing_SDK/C/bin/linux/release/deviceQuery

W moim przypadku, na konsolę dostaję taką oto informację diagnostyczną:

CUDA Device Query (Runtime API) version (CUDART static linking)
There is 1 device supporting CUDA

Device 0: "GeForce GTX 260"
CUDA Driver Version: 2.30
CUDA Runtime Version: 2.30
CUDA Capability Major revision number: 1
CUDA Capability Minor revision number: 3
Total amount of global memory: 938803200 bytes
Number of multiprocessors: 27
Number of cores: 216
Total amount of constant memory: 65536 bytes
Total amount of shared memory per block: 16384 bytes
Total number of registers available per block: 16384
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: 1.35 GHz
Concurrent copy and execution: Yes
Run time limit on kernels: Yes
Integrated: No
Support host page-locked memory mapping: Yes
Compute mode: Default (multiple host threads can use this device simultaneously)

Test PASSED

Press ENTER to exit...


No i teraz, kto zgadnie jaką mam kartę ;) To tyle jeśli chodzi o instalację, prawdziwa zabawa zaczyna się dopiero teraz!