C ++

Programovanie GPU v C ++

Programovanie GPU v C ++

Prehľad

V tejto príručke preskúmame silu programovania GPU s procesorom C++. Vývojári môžu očakávať neuveriteľný výkon v prostredí C ++ a prístup k fenomenálnemu výkonu grafického procesora v jazyku nízkej úrovne môže priniesť jedny z najrýchlejších výpočtov, aké sú v súčasnosti k dispozícii.

Požiadavky

Aj keď akýkoľvek stroj schopný pracovať s modernou verziou Linuxu môže podporovať kompilátor C ++, budete potrebovať GPU založené na NVIDIA, aby ste mohli s týmto cvičením postupovať. Ak nemáte GPU, môžete roztočiť inštanciu napájanú GPU v Amazon Web Services alebo u iného poskytovateľa cloudu podľa vášho výberu.

Ak si vyberiete fyzický počítač, uistite sa, že máte nainštalované proprietárne ovládače NVIDIA. Pokyny k tomu nájdete tu: https: // linuxhint.com / install-nvidia-drivers-linux /

Okrem ovládača budete potrebovať sadu nástrojov CUDA. V tomto príklade použijeme Ubuntu 16.04 LTS, ale pre väčšinu hlavných distribúcií sú k dispozícii súbory na stiahnutie na nasledujúcej adrese URL: https: // vývojár.nvidia.com / cuda-na stiahnutie

Pre Ubuntu by ste vybrali .deb na stiahnutie. Stiahnutý súbor nebude mať .predvolene rozšírenie deb, takže ho odporúčam premenovať, aby malo .deb na konci. Potom môžete nainštalovať pomocou:

sudo dpkg -i názov balíka.deb

Pravdepodobne sa zobrazí výzva na inštaláciu kľúča GPG. Ak je to tak, postupujte podľa uvedených pokynov.

Keď to urobíte, aktualizujte svoje úložiská:

sudo apt-get aktualizácia
sudo apt-get nainštalovať cuda -y

Po dokončení odporúčam reštartovať počítač, aby ste sa uistili, že je všetko správne načítané.

Výhody vývoja GPU

CPU pracujú s mnohými rôznymi vstupmi a výstupmi a obsahujú široký sortiment funkcií nielen pre riešenie širokého sortimentu programových potrieb, ale aj pre správu rôznych hardvérových konfigurácií. Zaoberajú sa tiež pamäťou, ukladaním do pamäte cache, systémovou zbernicou, segmentáciou a funkciami IO, čo z nich robí jack všetkých obchodov.

GPU sú opakom - obsahujú veľa jednotlivých procesorov zameraných na veľmi jednoduché matematické funkcie. Z tohto dôvodu spracovávajú úlohy mnohokrát rýchlejšie ako CPU. Špecializáciou na skalárne funkcie (funkcia, ktorá prijíma jeden alebo viac vstupov, ale vracia iba jeden výstup), dosahujú extrémny výkon za cenu extrémnej špecializácie.

Vzorový kód

V ukážkovom kóde sčítame vektory. Pre porovnanie rýchlosti som pridal verziu kódu pre CPU a GPU.
príklad GPU.cpp obsah nižšie:

#include „cuda_runtime.h "
#include
#include
#include
#include
#include
typedef std :: chrono :: high_resolution_clock Clock;
#define ITER 65535
// CPU verzia funkcie pridania vektora
void vector_add_cpu (int * a, int * b, int * c, int n)
int i;
// Pridajte vektorové prvky a a b do vektora c
pre (i = 0; i < n; ++i)
c [i] = a [i] + b [i];


// GPU verzia funkcie pridania vektora
__global__ void vector_add_gpu (int * gpu_a, int * gpu_b, int * gpu_c, int n)
int i = threadIdx.X;
// Nie je potrebná slučka for, pretože runtime CUDA
// navlečie tento ITER krát
gpu_c [i] = gpu_a [i] + gpu_b [i];

int main ()
int * a, * b, * c;
int * gpu_a, * gpu_b, * gpu_c;
a = (int *) malloc (ITER * sizeof (int));
b = (int *) malloc (ITER * sizeof (int));
c = (int *) malloc (ITER * sizeof (int));
// Potrebujeme premenné prístupné GPU,
// takže tieto poskytuje cudaMallocManaged
cudaMallocManaged (& gpu_a, ITER * sizeof (int));
cudaMallocManaged (& gpu_b, ITER * sizeof (int));
cudaMallocManaged (& gpu_c, ITER * sizeof (int));
pre (int i = 0; i < ITER; ++i)
a [i] = i;
b [i] = i;
c [i] = i;

// Zavolajte funkciu CPU a načasujte ju
auto cpu_start = Hodiny :: teraz ();
vector_add_cpu (a, b, c, ITER);
auto cpu_end = Hodiny :: teraz ();
std :: cout << "vector_add_cpu: "
<< std::chrono::duration_cast(cpu_end - cpu_start).count ()
<< " nanoseconds.\n";
// Zavolajte funkciu GPU a načasujte ju
// Trojité uhlové brzdy sú behové rozšírenie CUDA, ktoré umožňuje
// parametre volania jadra CUDA, ktoré sa majú odovzdať.
// V tomto príklade odovzdávame jeden blok vlákien s vláknami ITER.
auto gpu_start = Hodiny :: teraz ();
vector_add_gpu <<<1, ITER>>> (gpu_a, gpu_b, gpu_c, ITER);
cudaDeviceSynchronize ();
auto gpu_end = Hodiny :: teraz ();
std :: cout << "vector_add_gpu: "
<< std::chrono::duration_cast(gpu_end - gpu_start).count ()
<< " nanoseconds.\n";
// Uvoľnite pridelenie pamäte založené na funkciách GPU
cudaFree (a);
cudaFree (b);
cudaFree (c);
// Uvoľnite pridelenie pamäte založené na funkciách CPU
zadarmo (a);
zadarmo (b);
zadarmo (c);
návrat 0;

Makefile obsah nižšie:

INC = -I / usr / local / cuda / include
NVCC = / usr / local / cuda / bin / nvcc
NVCC_OPT = -std = c ++ 11
všetky:
$ (NVCC) $ (NVCC_OPT) príklad gpu.cpp -o gpu-príklad
čistý:
-rm -f príklad gpu

Ak chcete spustiť príklad, kompilujte ho:

urobiť

Potom spustite program:

./ príklad GPU

Ako vidíte, verzia CPU (vector_add_cpu) beží podstatne pomalšie ako verzia GPU (vector_add_gpu).

Ak nie, možno budete musieť upraviť definíciu ITER v príklade gpu.cu na vyššie číslo. Je to spôsobené tým, že čas nastavenia GPU je dlhší ako v niektorých menších slučkách náročných na procesor. Našiel som 65535, že na mojom stroji funguje dobre, ale váš kilometrový výkon sa môže líšiť. Akonáhle však túto hranicu odstránite, GPU je dramaticky rýchlejší ako procesor.

Záver

Dúfam, že ste sa veľa naučili z nášho úvodu do programovania GPU pomocou jazyka C++. Vyššie uvedený príklad veľmi nedosahuje, ale demonštrované koncepty poskytujú rámec, ktorý môžete použiť na začlenenie svojich nápadov, aby ste uvoľnili výkon svojho GPU.

Hry Nainštalujte si najnovší Dolphin Emulator pre Gamecube a Wii na Linuxe
Nainštalujte si najnovší Dolphin Emulator pre Gamecube a Wii na Linuxe
Emulátor Dolphin vám umožní hrať vybrané hry Gamecube a Wii na osobných počítačoch Linux (PC). Emulátor Dolphin, ktorý je voľne dostupným emulátorom ...
Hry Ako používať GameConqueror Cheat Engine v Linuxe
Ako používať GameConqueror Cheat Engine v Linuxe
Tento článok obsahuje sprievodcu používaním cheatovacieho modulu GameConqueror v systéme Linux. Mnoho používateľov, ktorí hrajú hry v systéme Windows,...
Hry Najlepšie emulátory herných konzol pre systém Linux
Najlepšie emulátory herných konzol pre systém Linux
V tomto článku je uvedený zoznam populárneho softvéru na emuláciu herných konzol, ktorý je k dispozícii pre systém Linux. Emulácia je vrstva kompatibi...