tag:blogger.com,1999:blog-1173788957168433022024-03-13T20:39:09.267-07:00CUDA-WiankiAdam Wasiljewhttp://www.blogger.com/profile/04101436551560435770noreply@blogger.comBlogger3125tag:blogger.com,1999:blog-117378895716843302.post-61075099573586849352012-09-26T05:40:00.002-07:002012-09-26T05:40:16.573-07:00New blogI 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 <a href="http://awasiljew.blogspot.com/">Sys.B.Log</a>. Enjoy new layout and posts organization :)
Current <b>CUDA-Wianki</b> blog will be removed soon...Adam Wasiljewhttp://www.blogger.com/profile/04101436551560435770noreply@blogger.com0tag:blogger.com,1999:blog-117378895716843302.post-2431910975517681922012-02-10T12:14:00.000-08:002012-02-10T12:15:31.733-08:00Eclipse with CUDAWriting 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 <a href="http://developer.nvidia.com/nvidia-parallel-nsight">Parallel Nsight</a>, 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. <br />
<br />
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.<br />
<br />
The next steps will set necessary global properties for our project. We should create some build variables (just select <i>"Project"->"Properties"</i>) and make new variables for selected build configuration as presented below:<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="http://3.bp.blogspot.com/-nmsofSN1cIc/TzPspZXwCpI/AAAAAAAAAGY/YzYYPNsdkus/s1600/zrzut_ekranu.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="203" src="http://3.bp.blogspot.com/-nmsofSN1cIc/TzPspZXwCpI/AAAAAAAAAGY/YzYYPNsdkus/s320/zrzut_ekranu.png" width="320" /></a></div>
<br />
Four variables should be set:<br />
<ol>
<li><b>CUDA_INCLUDE</b> - path for CUDA header files, which are installed with CUDA SDK</li>
<li><b>CUDA_LIB</b> - 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)</li>
<li><b>NVCC</b> - CUDA compiler which will be used to compile our CUDA sources</li>
<li><b>NVCC_ARCH</b> - 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)</li>
</ol>
Next we should use above variables for setting default compiler and linker options. Following screens should guide you through the basics.<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
</div>
<div class="separator" style="clear: both; text-align: center;">
<a href="http://2.bp.blogspot.com/-ntjYRgIAS9s/TzPuN1QUMTI/AAAAAAAAAGg/9yfLX0qwkiQ/s1600/zrzut_ekranu-1.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="202" src="http://2.bp.blogspot.com/-ntjYRgIAS9s/TzPuN1QUMTI/AAAAAAAAAGg/9yfLX0qwkiQ/s320/zrzut_ekranu-1.png" width="320" /></a></div>
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="http://2.bp.blogspot.com/-2ae_VYMgihM/TzPuOUtLcJI/AAAAAAAAAGo/NrXqtwd0OSc/s1600/zrzut_ekranu-2.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="204" src="http://2.bp.blogspot.com/-2ae_VYMgihM/TzPuOUtLcJI/AAAAAAAAAGo/NrXqtwd0OSc/s320/zrzut_ekranu-2.png" width="320" /></a></div>
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="http://3.bp.blogspot.com/-Jcysu2FkTB8/TzPuPSUGzpI/AAAAAAAAAGs/aFEnd-K7cA4/s1600/zrzut_ekranu-3.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="204" src="http://3.bp.blogspot.com/-Jcysu2FkTB8/TzPuPSUGzpI/AAAAAAAAAGs/aFEnd-K7cA4/s320/zrzut_ekranu-3.png" width="320" /></a></div>
<br />
Next we should tell Eclipse, that our CUDA source should be considered as C source files.<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
</div>
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="http://4.bp.blogspot.com/-yB0qERO7TEA/TzPwHjauGrI/AAAAAAAAAG4/-IyQGstsa5A/s1600/cu_files_setup_eclipse.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="219" src="http://4.bp.blogspot.com/-yB0qERO7TEA/TzPwHjauGrI/AAAAAAAAAG4/-IyQGstsa5A/s320/cu_files_setup_eclipse.png" width="320" /></a></div>
<div class="separator" style="clear: both; text-align: center;">
</div>
<br />
Now everything is ready to use. When we create new file with <i>*.cu</i> extension, in which we put all CUDA specific code, we need to compile this sources with <b>nvcc</b> compiler. In order to do that, we should select "Properties" for that specific file and set custom build step.<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="http://1.bp.blogspot.com/-imENaW8iiHo/TzPxLuJ49II/AAAAAAAAAHA/nHkX7q0PUEU/s1600/zrzut_ekranu-4.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="187" src="http://1.bp.blogspot.com/-imENaW8iiHo/TzPxLuJ49II/AAAAAAAAAHA/nHkX7q0PUEU/s320/zrzut_ekranu-4.png" width="320" /></a></div>
<br />
The last figure shows how to set custom build step for <i>integrate_2d_cuda.cu</i> example file. This build step creates <i>integrate_2d_cuda.o</i> file, by using <b>nvcc</b> compiler, which then will be used by gcc/g++ linker to build application.<br />
<br />
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 <i>*.cu</i> we just add following lines:<br />
<br />
<pre class="brush: c">//Only for eclipse parsers
#ifdef __CDT_PARSER__
#define __global__
#define __device__
#define __shared__
#define __const__
#endif</pre>
<br />
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!<br />
<br />Adam Wasiljewhttp://www.blogger.com/profile/04101436551560435770noreply@blogger.com1tag:blogger.com,1999:blog-117378895716843302.post-76243897116764857192010-02-09T09:10:00.000-08:002010-02-09T09:54:40.370-08:00Instalacja CUDA Ubuntu 9.04 AMD64W końcu przemogłem się i postanowiłem napisać krótką instrukcję jak zainstalować CUDA na własnym sprzęcie.<br />
<br />
Na początek może o konfiguracji, na jakiej przeprowadziłem instalację (pomijam kwestie sprzętowe):<br />
<ul><li>Ubuntu 9.04 AMD64 (oczywiście może być i386)</li>
<li>gcc / g++ 4.3.3 (instalacja z paczek Ubuntu)</li>
<li>CUDA developer driver x86_64 190.42 (<a href="http://www.nvidia.com/object/linux_display_amd64_190.42.html">Pobierz</a>)</li>
<li>CUDA Toolkit 2.3 (<a href="http://www.nvidia.com/object/thankyou_linux.html?url=/compute/cuda/2_3/toolkit/cudatoolkit_2.3_linux_64_ubuntu9.04.run">Pobierz</a>)</li>
<li>CUDA SDK 2.3 (<a href="http://www.nvidia.com/object/thankyou_linux.html?url=/compute/cuda/2_3/sdk/cudasdk_2.3_linux.run">Pobierz</a>)</li>
<li>glutg3-dev (instalacja z paczek Ubuntu, w moim przypadku była to wersja 3.7-25)</li>
<li>libxi-dev (instalacja z paczek Ubuntu, w moim przypadku była to wersja 2:1.2.0)</li>
<li>libxmu-dev (instalacja z paczek Ubuntu, w moim przypadku była to wersja 2:1.0.4-1)</li>
</ul><br />
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ć.<br />
<br />
A więc do dzieła...<br />
<br />
<b>1. Instalacja drivera </b><br />
<br />
Instalacji drivera dokonujemy z trybu konsoli, przy wyłączonym serwerze X. Aby wyłączyć managera okien, najprostszym sposobem jest wydanie polecenia:<br />
<br />
<div style="border-style: solid; border-color: #FFFFFF; border-width: 1px;"><blockquote><i>$ sudo /etc/init.d/gdm stop</i></blockquote></div><br />
lub w przypadku managera okien KDM:<br />
<br />
<div style="border-style: solid; border-color: #FFFFFF; border-width: 1px;"><blockquote><i>$ sudo /etc/init.d/kdm stop</i></blockquote></div><br />
Po zatrzymaniu managera i zalogowaniu, uruchamiamy instalatora sterownika:<br />
<br />
<div style="border-style: solid; border-color: #FFFFFF; border-width: 1px;"><blockquote><i>$sudo sh NVIDIA-Linux-x86_64-190.42-pkg2.run</i></blockquote></div><br />
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.<br />
<br />
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.<br />
<br />
<b>2. Instalacja bibliotek</b><br />
<br />
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:<br />
<br />
<div style="border-style: solid; border-color: #FFFFFF; border-width: 1px;"><blockquote><i>sh cudatoolkit_2.3_linux_64_ubuntu9.04.run</i></blockquote></div><br />
Instalator zapyta o ścieżkę docelową, w moim przypadku była to:<br />
<br />
<div style="border-style: solid; border-color: #FFFFFF; border-width: 1px;"><blockquote><i>/home/adam</i></blockquote></div><br />
Docelowo instalator do podanej ścieżki doklei <i>/cuda</i>, zatem całość powinna się zainstalować w <i>/home/adam/cuda</i>.<br />
<br />
Aby narzędzia CUDA były dostępne dla naszego użytkownika musimy wyedytować zmienną <i>PATH</i>:<br />
<br />
<div style="border-style: solid; border-color: #FFFFFF; border-width: 1px;"><blockquote><i>$ vim ~/.bashrc</i></blockquote></div><br />
W powyższym pliku na samym końcu dodajemy linijkę<br />
<br />
<div style="border-style: solid; border-color: #FFFFFF; border-width: 1px;"><blockquote>export PATH=$PATH:/home/adam/cuda/bin</blockquote></div><br />
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:<br />
<br />
<div style="border-style: solid; border-color: #FFFFFF; border-width: 1px;"><blockquote><i>$ sudo vim /etc/ld.so.conf</i></blockquote></div><br />
W pliku tym dopisujemy na końcu linijkę:<br />
<br />
<div style="border-style: solid; border-color: #FFFFFF; border-width: 1px;"><blockquote>/home/adam/cuda/lib64</blockquote></div>w przypadku architektury AMD64. W przeciwnym razie wpisujemy po prostu<br />
<br />
<div style="border-style: solid; border-color: #FFFFFF; border-width: 1px;"><blockquote>/home/adam/cuda/lib</blockquote></div><br />
Wystarczy teraz wydać polecenie:<br />
<br />
<div style="border-style: solid; border-color: #FFFFFF; border-width: 1px;"><blockquote><i>$ sudo ldconfig</i></blockquote></div><br />
To w zasadzie wszystko. Możemy sprawdzić jaką wersję kompilatora mamy zainstalowaną:<br />
<br />
<div style="border-style: solid; border-color: #FFFFFF; border-width: 1px;"><blockquote><i>$ nvcc --version</i></blockquote></div><br />
<b>3. Instalacja CUDA SDK i kompilacja przykładów</b><br />
<br />
Żeby rzeczywiście przetestować naszą instalację i rozpocząć zabawę z CUDA, najlepiej zainstalować pakiet SDK i skompilować zawarte w nim przykłady. Uruchamiamy instalację:<br />
<br />
<div style="border-style: solid; border-color: #FFFFFF; border-width: 1px;"><blockquote><i>$ sh cudasdk_2.3_linux.run</i></blockquote></div><br />
Instalator powinien wykryć gdzie mamy zainstalowaną bibliotekę CUDA. Jeśli nie podajemy mu odpowiednią ścieżkę:<br />
<br />
<div style="border-style: solid; border-color: #FFFFFF; border-width: 1px;"><blockquote>/home/adam/cuda</blockquote></div><br />
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:<br />
<br />
<div style="border-style: solid; border-color: #FFFFFF; border-width: 1px;"><blockquote><i>$ vim ~/NVIDIA_GPU_Computing_SDK/C/common/common.mk</i></blockquote></div><br />
w linii 41, należy odpowiednio zmodyfikować zmienną <i>CUDA_INSTALL_PATH</i>:<br />
<br />
<div style="border-style: solid; border-color: #FFFFFF; border-width: 1px;"><blockquote>CUDA_INSTALL_PATH=/home/adam/cuda</blockquote></div><br />
Nie wiedzieć czemu w moim przypadku instalator nie wyedytował automatycznie tej zmiennej.<br />
<br />
Jeśli do tego momentu wszystko się udało, to znaczy, że można skompilować przykłady z SDK. Z katalogu <i>~/NVIDIA_GPU_Computing_SDK/C</i> wydajemy polecenie:<br />
<br />
<div style="border-style: solid; border-color: #FFFFFF; border-width: 1px;"><blockquote><i>~/NVIDIA_GPU_Computing_SDK/C $ make</i></blockquote></div><br />
Rozpocznie się kompilacja, która może chwilę potrwać. Po skompilowaniu, przykłady można znaleźć w katalogu <i>~/NVIDIA_GPU_Computing_SDK/C/bin/linux/release</i>. Polecam na początek uruchomić test:<br />
<br />
<div style="border-style: solid; border-color: #FFFFFF; border-width: 1px;"><blockquote><i>$ ~/NVIDIA_GPU_Computing_SDK/C/bin/linux/release/deviceQuery</i></blockquote></div><br />
W moim przypadku, na konsolę dostaję taką oto informację diagnostyczną:<br />
<br />
<div style="border-style: solid; border-color: #FFFFFF; border-width: 1px;"><blockquote>CUDA Device Query (Runtime API) version (CUDART static linking)<br />
There is 1 device supporting CUDA<br />
<br />
Device 0: "GeForce GTX 260"<br />
CUDA Driver Version: 2.30<br />
CUDA Runtime Version: 2.30<br />
CUDA Capability Major revision number: 1<br />
CUDA Capability Minor revision number: 3<br />
Total amount of global memory: 938803200 bytes<br />
Number of multiprocessors: 27<br />
Number of cores: 216<br />
Total amount of constant memory: 65536 bytes<br />
Total amount of shared memory per block: 16384 bytes<br />
Total number of registers available per block: 16384<br />
Warp size: 32<br />
Maximum number of threads per block: 512<br />
Maximum sizes of each dimension of a block: 512 x 512 x 64<br />
Maximum sizes of each dimension of a grid: 65535 x 65535 x 1<br />
Maximum memory pitch: 262144 bytes<br />
Texture alignment: 256 bytes<br />
Clock rate: 1.35 GHz<br />
Concurrent copy and execution: Yes<br />
Run time limit on kernels: Yes<br />
Integrated: No<br />
Support host page-locked memory mapping: Yes<br />
Compute mode: Default (multiple host threads can use this device simultaneously)<br />
<br />
Test PASSED<br />
<br />
Press ENTER to exit...<br />
<br />
</blockquote></div><br />
No i teraz, kto zgadnie jaką mam kartę ;) To tyle jeśli chodzi o instalację, prawdziwa zabawa zaczyna się dopiero teraz!Adam Wasiljewhttp://www.blogger.com/profile/04101436551560435770noreply@blogger.com0