Programowanie w systemie UNIX/CUDA

Z Wikibooks, biblioteki wolnych podręczników.
Przejdź do nawigacji Przejdź do wyszukiwania
Porównanie wydajności CPU i GPU

Wstęp do CUDA cz. I autor: Szymon Zimnowoda[1]

Instalacja[edytuj]

Opis[2][3] [4][5]

sprzęt[edytuj]

Sprawdzamy jaką mamy kartę graficzną:[6]

lspci | grep -i nvidia

lub za pomocą komendy:

lspci | grep VGA


i czy jest ona na liście kompatybilnego sprzętu: [7]

https://developer.nvidia.com/cuda-gpus

OS[edytuj]

Wybieramy taką wersję OS dla której jest dostępny CUDA Toolkit[8]


Sprawdzamy aktualną wersję i typ OS:

uname -m && cat /etc/*release

otrzymujemy (przykładowy wynik):

x86_64
DISTRIB_ID=Ubuntu
DISTRIB_RELEASE=13.10
DISTRIB_CODENAME=saucy
DISTRIB_DESCRIPTION="Ubuntu 13.10"
NAME="Ubuntu"
VERSION="13.10, Saucy Salamander"
ID=ubuntu
ID_LIKE=debian
PRETTY_NAME="Ubuntu 13.10"
VERSION_ID="13.10"
HOME_URL="http://www.ubuntu.com/"
SUPPORT_URL="http://help.ubuntu.com/"
BUG_REPORT_URL="http://bugs.launchpad.net/ubuntu/"


Informacje o instalacji dla wersji:

Sterownik karty graficznej[edytuj]

Sterownik [14]

sudo software-properties-gtk

lub:

nvidia-settings

gcc[edytuj]

Czy mamy odpowiednią[15] wersję gcc ?

gcc --version

W przeciwnym razie pojawi się błąd w czasie instalacji :


 Error: unsupported compiler: 5.4.1. Use --override to override this check.


Rozwiązanie[16] :

 sudo sh cuda_8.0.44_linux.run --override

NVIDIA CUDA Toolkit[edytuj]

 nvcc --version

Wynik[edytuj]

Enter CUDA Samples Location
 [ default is /home/a ]: 

Installing the CUDA Toolkit in /usr/local/cuda-8.0 ...
Missing recommended library: libXmu.so

Installing the CUDA Samples in /home/a ...
Copying samples to /home/a/NVIDIA_CUDA-8.0_Samples now...
Finished copying samples.

===========
= Summary =
===========

Driver:   Not Selected
Toolkit:  Installed in /usr/local/cuda-8.0
Samples:  Installed in /home/a, but missing recommended libraries

Please make sure that
 -   PATH includes /usr/local/cuda-8.0/bin
 -   LD_LIBRARY_PATH includes /usr/local/cuda-8.0/lib64, or, add /usr/local/cuda-8.0/lib64 to /etc/ld.so.conf and run ldconfig as root

To uninstall the CUDA Toolkit, run the uninstall script in /usr/local/cuda-8.0/bin

Please see CUDA_Installation_Guide_Linux.pdf in /usr/local/cuda-8.0/doc/pdf for detailed information on setting up CUDA.

***WARNING: Incomplete installation! This installation did not install the CUDA Driver. A driver of version at least 361.00 is required for CUDA 8.0 functionality to work.
To install the driver using this installer, run the following command, replacing <CudaInstaller> with the name of this run file:
    sudo <CudaInstaller>.run -silent -driver

Logfile is /tmp/cuda_install_7699.log

Usuwanie[edytuj]

 sudo ./uninstall_cuda_8.0.pl

GPU[edytuj]

Procesor GPU składa się z:

  • multiprocesorów
  • pamięci głównej karty graficznej

Multiprocesor składa się z:

  • 8 lub 16 procesorów
  • pamięci multiprocesora (bardzo szybka, wspólna dla procesorów)

Typy liczb[edytuj]

  • zmiennoprzecinkowe[17]
    • podwójnej precyzji są dostępne dla GPU o potencjale obliczeniowym 1.3 i większym (ang. 1.3-capable card)
    • double-double [18]

Można wybrać potencjał obliczeniowy za pomocą opcji kompilatora:

nvcc --gpu-architecture sm_13 

lub

-arch=sm_13

lub [19]

--gpu-name sm_13

Lista dostępnych funkcji podwójnej precyzji w bibliotece CUDA[20]

Struktura obliczeń[edytuj]

Obliczenie K dzieli się na:

  • gridy g składające się z bloków,
  • bloki b, które dzielą się na wątki w.[21]
 
 
 

Struktura typowego programu CUDA[edytuj]

  • skopiować dane z pamięci komputera do pamięci karty graficznej
  • skopiować dane do pamięci multiprocesora
  • wykonać obliczenia na multiprocesorach
  • skopiować częściowe wyniki z multiprocesorów do pamięci głównej karty graficznej
  • skopiować końcowy wynik do pamięci komputera
Struktura programu CUDA

Jak zacząć[edytuj]

Co potrzebujemy wg Nvidia[22]


Plik :[23]

  • zapisujemy z rozszerzeniem cu
e.cu
  • kompilujemy kompilatorem firmy NVIDIA:
nvcc e.cu 
  • uruchamiamy:
./a.out

Programowanie[edytuj]

Pierwszy program[edytuj]

Przykładowy program pokazujący ilość dostępnych kart cuda[24]

    #include <stdio.h>
    #include <cuda.h>

    int main(void)
    {

       int nDevices;
       
       cudaGetDeviceCount(&nDevices);
       printf("Number of CUDA devices = %d\n", nDevices);
       
       return 0;
    }

Kompilacja:

gcc c.c -Wall

daje efekt:

c.c:2:22: fatal error: cuda.h: Nie ma takiego pliku ani katalogu


Szukamy cuda.h:

 udpatedb
 locate cuda.h

otrzymujemy:

/usr/include/linux/cuda.h
/usr/src/linux-headers-3.11.0-12/include/linux/cuda.h
/usr/src/linux-headers-3.11.0-12/include/uapi/linux/cuda.h
/usr/src/linux-headers-3.11.0-12-generic/include/linux/cuda.h
/usr/src/linux-headers-3.11.0-13/include/linux/cuda.h
/usr/src/linux-headers-3.11.0-13/include/uapi/linux/cuda.h
/usr/src/linux-headers-3.11.0-13-generic/include/linux/cuda.h
/usr/src/linux-headers-3.11.0-14/include/linux/cuda.h
/usr/src/linux-headers-3.11.0-14/include/uapi/linux/cuda.h
/usr/src/linux-headers-3.11.0-14-generic/include/linux/cuda.h
/usr/src/linux-headers-3.11.0-15/include/linux/cuda.h
/usr/src/linux-headers-3.11.0-15/include/uapi/linux/cuda.h
/usr/src/linux-headers-3.11.0-15-generic/include/linux/cuda.h

ale tu chodzi o katalog:

/usr/local/cuda/include/


który jest pusty ...



Linki[edytuj]

biblioteki[edytuj]

Słownik[edytuj]

  • API [32]
  • blok = suma wątków wykonywanych przez pojedynczy multiprocesor
  • device = (pl. urządzenie) = karta graficzna
  • grid = Wszystkie bloki pracujące nad jednym kernelem nazywamy gridem. Gridów może być maksymalnie tyle co multiprocesorów
  • host = CPU
  • GPU = procesor karty graficznej
  • CPU = procesor płyty głównej
  • kernel =
    • jądro kodu obliczeniowego
    • kod pojedynczego wątku CUDA[33]
    • "funkcja wykonywana na karcie graficznej równolegle przez CUDA-wątki" [34]
  • nvcc - kompilator c firmy NVIDIA
  • wątek = obliczenie wykonywane na pojedynczym procesorze GPU

Pomoc[edytuj]

Odnośniki[edytuj]

  1. Wstęp do CUDA cz. I autor: Szymon Zimnowoda
  2. instalacji : ask ubuntu
  3. | Instalacja CUDA Thomas Krenn Wiki
  4. Cuda HELP UBUNTU
  5. tutorials.ubuntu : gpu-data-processing-inside-lxd
  6. cuda-getting-started-guide-for-linux
  7. Lista GPU odpowiednich dla CUDA
  8. CUDA Toolkit
  9. askubuntu question: how-can-i-install-cuda-on-ubuntu-16-04
  10. devtalk.nvidia : cuda-8-0-toolkit-install-nvcc-not-found-ubuntu-16-04
  11. downloads
  12. Installing and testing CUDA in Ubuntu 14.04
  13. Yputube : Ubuntu 12.04 - Installing Nvidia CUDA Developer Driver [OUTDATED]
  14. Accelerated Linux Driver Set README and Installation Guide
  15. nvidia cuda-installation-guide-linux - table
  16. stackoverflow question : cuda-incompatible-with-my-gcc-version
  17. Increasing the float/double precision, how is this done?
  18. Double double precision arithmetic library for Cuda now available
  19. CUDA Support/Enabling double-precision from Computer Science Support Wiki
  20. Double Precision Mathematical Functions from NVIDIA CUDA Library Documentation 4.2
  21. W Śmietanka : Programowanie na platformie CUDA. Delta 448 (9/2011)
  22. NVIDIA GPU Computing Documentation
  23. [http://www.eti.pg.gda.pl/katedry/kask/dydaktyka/Przetwarzanie_Rownolegle_CUDA/CELL/01-cuda.pdf CUDA Programming Paweł Czarnul]
  24. na forum ubuntu - program użytkownika jablondyn
  25. Wykłady Wojciecha Kwedlo
  26. wykłady wydziału ETI Politechniki Gdańskiej
  27. Generowanie i wizualizacja zbioru Mandelbrota na CUDA - Paweł Nowak
  28. Why aren't we programming on the GPU?
  29. [Julia Set for the Complex Function f(z) = z^3 – 1, in C and CUDA by Stephen on March 4th, 2012]
  30. github gpuprec
  31. stackoverflow question : cuda-how-to-work-with-complex-numbers?
  32. Mirek SOcha : CUDA
  33. Programowanie na platformie CUDA - Wojciech Śmietanka. Delta 448 (9/2011)
  34. Wstęp do CUDA Cz. II autor: ZimnowodaSzymon