Programowanie w systemie UNIX/CUDA

Wstęp do CUDA [1]

Porównanie wydajności CPU i GPU

InstalacjaEdytuj

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

sprzętEdytuj

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

lspci | grep -i nvidia

lub za pomocą komendy:

lspci | grep VGA


lub[7]

 nvidia-smi 


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

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

OSEdytuj

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


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 graficznejEdytuj

Sterownik [15]

sudo software-properties-gtk

lub:

nvidia-settings

gccEdytuj

Czy mamy odpowiednią[16] 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[17] :

 sudo sh cuda_8.0.44_linux.run --override

NVIDIA CUDA ToolkitEdytuj

Nvidia CUDA toolkit[18]

 dpkg -l | grep cuda-toolkit

lub

 nvcc --version

WynikEdytuj

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

UsuwanieEdytuj

 sudo ./uninstall_cuda_8.0.pl

GPUEdytuj

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 liczbEdytuj

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

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

nvcc --gpu-architecture sm_13 

lub

-arch=sm_13

lub [21]

--gpu-name sm_13

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

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.[23]
  
  
  

Struktura typowego programu CUDAEdytuj

  • 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[24]


Plik :[25]

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

ProgramowanieEdytuj

Pierwszy programEdytuj

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

    #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 ...

hello.cuEdytuj

LinkiEdytuj

bibliotekiEdytuj

SłownikEdytuj

  • API [34]
  • 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[35]
    • "funkcja wykonywana na karcie graficznej równolegle przez CUDA-wątki" [36]
  • nvcc - kompilator c firmy NVIDIA
  • wątek = obliczenie wykonywane na pojedynczym procesorze GPU

PomocEdytuj

OdnośnikiEdytuj

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