166
Multiprocesorski sistemi Compute Unified Device Architecture (CUDA) Marko Mišić 13S114MUPS, 13E114MUPS 2017/2018.

Multiprocesorski sistemi Compute Unified ... - mups.etf.rsmups.etf.rs/vezbe/MPS - CUDA.pdf · Uvod u GPU računarstvo (1) Grafički procesori (Graphics Processing Unit, GPU) su prvobitno

  • Upload
    others

  • View
    19

  • Download
    0

Embed Size (px)

Citation preview

Page 1: Multiprocesorski sistemi Compute Unified ... - mups.etf.rsmups.etf.rs/vezbe/MPS - CUDA.pdf · Uvod u GPU računarstvo (1) Grafički procesori (Graphics Processing Unit, GPU) su prvobitno

Multiprocesorski sistemi

Compute Unified Device Architecture(CUDA)

Marko Mišić

13S114MUPS, 13E114MUPS

2017/2018.

Page 2: Multiprocesorski sistemi Compute Unified ... - mups.etf.rsmups.etf.rs/vezbe/MPS - CUDA.pdf · Uvod u GPU računarstvo (1) Grafički procesori (Graphics Processing Unit, GPU) su prvobitno

Uvod u GPU računarstvo (1)

Grafički procesori (Graphics Processing Unit, GPU) su prvobitno bili namenjeni za obradu grafike

Specijalizovani za računski intenzivne, grafičke algoritme

Narastajuća industrija video igara, kao i potreba u komercijalnim aplikacijama je izvršila veliki pritisak na razvoj grafičkih procesora

3D grafika (početkom ‘90ih)

Vremenom su ovi procesori evoluirali u paralelne i viskoprogramabilne procesore

Orijentisani su ka obradi velike količine podataka

ETF Beograd::Multiprocesorski sistemi 2/166

Page 3: Multiprocesorski sistemi Compute Unified ... - mups.etf.rsmups.etf.rs/vezbe/MPS - CUDA.pdf · Uvod u GPU računarstvo (1) Grafički procesori (Graphics Processing Unit, GPU) su prvobitno

Uvod u GPU računarstvo (2)

Grafički procesori se koriste za računanja opšte namene u poslednjih nekoliko godina

Taj trend se zove računanje opšte namene korišćenjem grafičkih procesorskih jedinica General-Purpose computation on GPUs (GPGPU)

Heterogeno računarstvo Korišćenje računskih resursa koji najbolje odgovaraju poslu

ETF Beograd::Multiprocesorski sistemi 3/166

Latency CoresThroughput

Cores

DSP Cores

HW IPs

ConfigurableLogic/Cores

On-chip Memories

Page 4: Multiprocesorski sistemi Compute Unified ... - mups.etf.rsmups.etf.rs/vezbe/MPS - CUDA.pdf · Uvod u GPU računarstvo (1) Grafički procesori (Graphics Processing Unit, GPU) su prvobitno

Uvod u GPU računarstvo (3)

Širok spektar primena Fizičke simulacije (computational physics) Hemijske simulacije (computational chemistry) Biološke simulacije (life sciences) Finansijska izračunavanja (computational finance) Računarska vizija (computer vision) Obrada signala Geometrija i matematika Baze podataka

ETF Beograd::Multiprocesorski sistemi 4/166

Financial Analysis

Scientific Simulation

Engineering Simulation

Data Intensive Analytics

Medical Imaging

Digital Audio Processing

Computer Vision

Digital Video Processing

Biomedical Informatics

Electronic Design

Automation

Statistical Modeling

Ray Tracing Rendering

Interactive Physics

Numerical Methods

Page 5: Multiprocesorski sistemi Compute Unified ... - mups.etf.rsmups.etf.rs/vezbe/MPS - CUDA.pdf · Uvod u GPU računarstvo (1) Grafički procesori (Graphics Processing Unit, GPU) su prvobitno

CUDA performanse za različite aplikacije

CUDA

Prednost

Rigid Body

Physics

Solver

10x

20x

47x

197x

Matrix

Numerics

BLAS1:

60+ GB/s

BLAS3:

100+ GFLOPS

Wave

Equation

FDTD:

1.2 Gcells/s

FFT:

52 GFLOPS(GFLOPS as defined by benchFFT)

Biological

Sequence

Match

SSEARCH:

5.2 Gcells/s

Finance

Black Scholes:

4.7 GOptions/s

ETF Beograd::Multiprocesorski sistemiETF Beograd::Multiprocesorski sistemi 5/166

Page 6: Multiprocesorski sistemi Compute Unified ... - mups.etf.rsmups.etf.rs/vezbe/MPS - CUDA.pdf · Uvod u GPU računarstvo (1) Grafički procesori (Graphics Processing Unit, GPU) su prvobitno

Zašto koristiti grafičke procesore?

Grafički procesori su postali vrlo fleksibilni i dostupni Računska snaga: 1 TFLOPS vs. 100 GFLOPS Propusni opseg: ~10x veći Nalaze se u gotovo svakom računaru

Figure 1.1. Enlarging Performance Gap between GPUs and CPUs.

Multi-core CPU

Many-core GPU

Courtesy: John OwensETF Beograd::Multiprocesorski sistemi 6/166

Page 7: Multiprocesorski sistemi Compute Unified ... - mups.etf.rsmups.etf.rs/vezbe/MPS - CUDA.pdf · Uvod u GPU računarstvo (1) Grafički procesori (Graphics Processing Unit, GPU) su prvobitno

Chip

Core

Local Cache

Registers

SIMD Unit

Co

ntro

l

Chip

Compute UnitCache/Local Mem

Registers

SIMD Unit

Th

rea

din

g

CPU vs. GPU (1)

Fundamentalna razlika između centralnog i grafičkog procesora je u njihovom dizajnu CPU je orijentisan

ka tradicionalnom izvršenju poslova

GPU je orijentisan ka obradi podataka Mnogo više tranzistora je namenjeno obradi podataka

nego keširanju i kontroli toka

CPU GPU

ETF Beograd::Multiprocesorski sistemi 7/166

Page 8: Multiprocesorski sistemi Compute Unified ... - mups.etf.rsmups.etf.rs/vezbe/MPS - CUDA.pdf · Uvod u GPU računarstvo (1) Grafički procesori (Graphics Processing Unit, GPU) su prvobitno

CPU vs. GPU (2)

Centralni procesor je orijentisan ka smanjenju kašnjenja (latency)

Hijerarhija keš memorija

L1, L2, L3...

Sofisticirana kontrola toka

Predviđanje skokova

Prosleđivanje podataka

Manji broj procesora

Moćne ALU jedinice

Operacije se izvršavaju veoma brzo

Pipeline veličine 20 - 30 faza

Cache

ALUControl

ALU

ALU

ALU

DRAM

ETF Beograd::Multiprocesorski sistemi 8/166

Chip

Core

Local Cache

Registers

SIMD Unit

Con

trol

Page 9: Multiprocesorski sistemi Compute Unified ... - mups.etf.rsmups.etf.rs/vezbe/MPS - CUDA.pdf · Uvod u GPU računarstvo (1) Grafički procesori (Graphics Processing Unit, GPU) su prvobitno

CPU vs. GPU (3)

Grafički procesori su orijentisani ka povećanju propusnog opsega (throughput) Veliki broj procesnih jedinica

Energetski efikasnije ALU jedinice

Veoma male keš memorije

Instrukcijski keš

Jednostavna kontrola toka

Nema predviđanja skokova

Nema prosleđivanja podataka

Potreban veliki broj niti da bi se sakrila kašnjenja!

DRAM

ETF Beograd::Multiprocesorski sistemi 9/166

Chip

Compute UnitCache/Local Mem

Registers

SIMD Unit

Th

rea

din

g

Page 10: Multiprocesorski sistemi Compute Unified ... - mups.etf.rsmups.etf.rs/vezbe/MPS - CUDA.pdf · Uvod u GPU računarstvo (1) Grafički procesori (Graphics Processing Unit, GPU) su prvobitno

Za šta je GPU pogodan? (1)

Grafički procesor je specijalizovan za računski intenzivna, paralelna izračunavanja Pogodan za računanja data-parallel tipa

Isti skup instrukcija se izvršava nad velikim brojem podataka istovremeno

Smanjena je potreba za sofisticiranom kontrolom toka

Veliki broj izračunavanja se odigrava u odnosu na jedan pristup memoriji

Sva kašnjenja prilikom pristupa memoriji se mogu sakriti intenzivnim izračunavanjem umesto velikim keševima podataka

ETF Beograd::Multiprocesorski sistemi 10/166

Page 11: Multiprocesorski sistemi Compute Unified ... - mups.etf.rsmups.etf.rs/vezbe/MPS - CUDA.pdf · Uvod u GPU računarstvo (1) Grafički procesori (Graphics Processing Unit, GPU) su prvobitno

Za šta je GPU pogodan? (2)

Centralni i grafički procesor se najbolje koriste u režimu koprocesiranja

Centralni procesor treba koristiti za sekvencijalni deo aplikacije, gde je bitno kašnjenje CPU je najmanje red veličine brži od GPU

prilikom izvršavanja sekvencijalnog koda Ulaz, izlaz, priprema podataka...

Grafički procesor treba koristiti za delove koda koji troše najviše vremena Tipično za ubrzanje kritičnih operacija

koje obrađuju veliku količinu podataka

ETF Beograd::Multiprocesorski sistemi 11/166

Page 12: Multiprocesorski sistemi Compute Unified ... - mups.etf.rsmups.etf.rs/vezbe/MPS - CUDA.pdf · Uvod u GPU računarstvo (1) Grafički procesori (Graphics Processing Unit, GPU) su prvobitno

Istorijat GPU programiranja

Grafički procesori su postali programabilni početkom 2000-ih sa pojavom programabilnih shader-a

Programiranje je vršeno kroz grafičke API-je

OpenGL, DirectX...

Mnoga ograničenja

Hardverska i softverska (pristup memoriji, API overhead...)

Jezik Brook (Stanford, 2004) je prvi doneo GPGPU programiranje

Ograničeni dometi

Zavisnost od grafičkih API-ja

NVIDIA CUDA (2007)

AMD/ATI pokušaji (Brook+, FireStream, Close-To-Metal)

Microsoft DirectCompute (DirectX 10/DirectX 11)

OpenCompute Language, OpenCL (2009)

Otvoreni standard koji je podržala grupa kompanija

OpenACC (2011) i OpenMP 4.0 (2013) podrška za paralelizaciju direktivama

ETF Beograd::Multiprocesorski sistemi 12/166

Page 13: Multiprocesorski sistemi Compute Unified ... - mups.etf.rsmups.etf.rs/vezbe/MPS - CUDA.pdf · Uvod u GPU računarstvo (1) Grafički procesori (Graphics Processing Unit, GPU) su prvobitno

CUDA pregled (1)

Compute Unified Device Architecture (CUDA) Nova hardverska i softverska arhitektura

za upravljanje izračunavanjem opšte namene na grafičkim procesorskim jedinicama

Dostupna na grafičkim karticama serije 8000 i novije

Opštenamenski programski model SIMD / SPMD

Korisnik pokreće grupe niti na grafičkom procesoru Programer eksplicitno izražava data-parallel model

kroz izvršavanje pomoću niti (DLP via TLP)

Eksplicitno upravljanje memorijom

ETF Beograd::Multiprocesorski sistemi 13/166

Page 14: Multiprocesorski sistemi Compute Unified ... - mups.etf.rsmups.etf.rs/vezbe/MPS - CUDA.pdf · Uvod u GPU računarstvo (1) Grafički procesori (Graphics Processing Unit, GPU) su prvobitno

CUDA pregled (2)

Prati je odgovarajuća softverska podrška Drajver i odgovarajući API

Ekstenzija jezika C za lakše programiranje

Alati Prevodilac, debager, profajler

Gotov softver i biblioteke GPU Computing SDK

CUFFT, CUBLAS...

Nezavisni proizvođači

GPU

CPU

CUDA Runtime

CUDA Libraries

(FFT, BLAS)

CUDA Driver

Application

ETF Beograd::Multiprocesorski sistemi 14/166

Page 15: Multiprocesorski sistemi Compute Unified ... - mups.etf.rsmups.etf.rs/vezbe/MPS - CUDA.pdf · Uvod u GPU računarstvo (1) Grafički procesori (Graphics Processing Unit, GPU) su prvobitno

Programski model (1)

Grafički procesor se posmatra kao koprocesor (uređaj, compute device) u odnosu na centralni procesor (domaćin, host) Izvršava računski intenzivan deo aplikacije

Izvršava jako veliki broj niti u paraleli

Poseduje svoju sopstvenu DRAM memoriju

Deo aplikacije koji vrši obradu nad podacima izvršava se u vidu jezgra (kernel) koristeći veliki broj niti GPU niti su lake (lightweight)

Imaju veoma mali režijski trošak prilikom stvaranja

GPU su potrebne hiljade niti za punu efikasnost

Višejezgarnom procesoru je potrebno samo nekoliko

ETF Beograd::Multiprocesorski sistemi 15/166

Page 16: Multiprocesorski sistemi Compute Unified ... - mups.etf.rsmups.etf.rs/vezbe/MPS - CUDA.pdf · Uvod u GPU računarstvo (1) Grafički procesori (Graphics Processing Unit, GPU) su prvobitno

Programski model (2)

CUDA program čine integrisani delovi koda za centralni i grafički procesor

Serial Code (host)

. . .

. . .

Parallel Kernel (device)

KernelA<<< nBlk, nTid >>>(args);

Serial Code (host)

Parallel Kernel (device)

KernelB<<< nBlk, nTid >>>(args);

ETF Beograd::Multiprocesorski sistemi 16/166

Page 17: Multiprocesorski sistemi Compute Unified ... - mups.etf.rsmups.etf.rs/vezbe/MPS - CUDA.pdf · Uvod u GPU računarstvo (1) Grafički procesori (Graphics Processing Unit, GPU) su prvobitno

Izvršni model (1)

CUDA jezgro se izvršava pomoću niza niti raspoređenih u odgovarajuću rešetku (grid) Sve niti izvršavaju isti kod

SIMD/SPMD/SIMT model izvršavanja Svaka nit ima jedinstveni identifikator (indeks) koji koristi

da bi vršila pristup memoriji i donosila odluke

76543210

float x = input[threadID];

float y = func(x);

output[threadID] = y;

threadID

ETF Beograd::Multiprocesorski sistemi 17/166

Page 18: Multiprocesorski sistemi Compute Unified ... - mups.etf.rsmups.etf.rs/vezbe/MPS - CUDA.pdf · Uvod u GPU računarstvo (1) Grafički procesori (Graphics Processing Unit, GPU) su prvobitno

Izvršni model (2)

Niti unutar rešetke su podeljene u nezavisne blokove

Svaki blok ima jedinstven identifikator unutar rešetke

Niti unutar istog bloka mogu da sarađuju

Koristeći sinhronizaciju, atomske operacije i deljenu memoriju

Niti iz različitih blokova ne mogu da sarađuju

float x =

input[threadID];

float y = func(x);

output[threadID] = y;

threadID

Thread Block 0

……

float x =

input[threadID];

float y = func(x);

output[threadID] = y;

Thread Block 1

float x =

input[threadID];

float y = func(x);

output[threadID] = y;

Thread Block N - 1

76543210 76543210 76543210

ETF Beograd::Multiprocesorski sistemi 18/166

Page 19: Multiprocesorski sistemi Compute Unified ... - mups.etf.rsmups.etf.rs/vezbe/MPS - CUDA.pdf · Uvod u GPU računarstvo (1) Grafički procesori (Graphics Processing Unit, GPU) su prvobitno

Izvršni model (3)

Jezgro se konfiguriše prilikom svakog poziva

Zadaju se dimenzije bloka i rešetke

Blok i rešetka mogu biti višedimenzionalni

1D, 2D ili 3D

Niti i blokovi imaju identifikatore (indekse)

Tako da mogu da odluče nad kojim podacima da rade

Host

Kernel

1

Kernel

2

Device

Grid 1

Block

(0, 0)

Block

(1, 0)

Block

(2, 0)

Block

(0, 1)

Block

(1, 1)

Block

(2, 1)

Grid 2

Block (1, 1)

Thread

(0, 1)

Thread

(1, 1)

Thread

(2, 1)

Thread

(3, 1)

Thread

(4, 1)

Thread

(0, 2)

Thread

(1, 2)

Thread

(2, 2)

Thread

(3, 2)

Thread

(4, 2)

Thread

(0, 0)

Thread

(1, 0)

Thread

(2, 0)

Thread

(3, 0)

Thread

(4, 0)

ETF Beograd::Multiprocesorski sistemi 19/166

Page 20: Multiprocesorski sistemi Compute Unified ... - mups.etf.rsmups.etf.rs/vezbe/MPS - CUDA.pdf · Uvod u GPU računarstvo (1) Grafički procesori (Graphics Processing Unit, GPU) su prvobitno

Izvršni model (4)

Za svaki blok se može odrediti indeks unutar rešetke Block ID: 1D, 2D, 3D

blockIdx promenljiva

Za svaku nit se može odrediti indeks unutar bloka Thread ID: 1D, 2D, 3D

threadIdx promenljiva

Pojednostavljuje pristup memoriji pri obradi višedimenzionalnih struktura Obrada slika i sl.

Device

Grid 1

Block

(0, 0)

Block

(1, 0)

Block

(2, 0)

Block

(0, 1)

Block

(1, 1)

Block

(2, 1)

Block (1, 1)

Thread

(0, 1)

Thread

(1, 1)

Thread

(2, 1)

Thread

(3, 1)

Thread

(4, 1)

Thread

(0, 2)

Thread

(1, 2)

Thread

(2, 2)

Thread

(3, 2)

Thread

(4, 2)

Thread

(0, 0)

Thread

(1, 0)

Thread

(2, 0)

Thread

(3, 0)

Thread

(4, 0)

ETF Beograd::Multiprocesorski sistemi 20/166

Page 21: Multiprocesorski sistemi Compute Unified ... - mups.etf.rsmups.etf.rs/vezbe/MPS - CUDA.pdf · Uvod u GPU računarstvo (1) Grafički procesori (Graphics Processing Unit, GPU) su prvobitno

Primer sabiranja dva vektora (1)

Tradicionalni sekvencijalni C kod:

// Compute vector sum C = A+B

void vecAdd(float* A, float* B, float* C, int n){

for (i = 0, i < n, i++)

C[i] = A[i] + B[i];

}

int main(){

// Memory allocation for h_A, h_B, and h_c

// I/O to read h_A and _B

vecAdd(h_A, h_B, h_C, N);

}

ETF Beograd::Multiprocesorski sistemi 21/166

Page 22: Multiprocesorski sistemi Compute Unified ... - mups.etf.rsmups.etf.rs/vezbe/MPS - CUDA.pdf · Uvod u GPU računarstvo (1) Grafički procesori (Graphics Processing Unit, GPU) su prvobitno

Primer sabiranja dva vektora (2)

Na grafičkom procesoru, svaka nit će biti zadužena za izračunavanje jednog elementa rezultujućeg vektora

A[0] A[1] A[2] ... A[n]

B[0] B[1] B[2] ... B[n]

C[0] C[1] C[2] ... C[n]

+ + + +

ETF Beograd::Multiprocesorski sistemi 22/166

Page 23: Multiprocesorski sistemi Compute Unified ... - mups.etf.rsmups.etf.rs/vezbe/MPS - CUDA.pdf · Uvod u GPU računarstvo (1) Grafički procesori (Graphics Processing Unit, GPU) su prvobitno

Primer sabiranja dva vektora (3)

Kod koji će izvršavati centralni procesor mora biti restrukturiran:

void vecAdd(float* A, float* B, float* C, int n){

intsize = n* sizeof(float);

float* devA, devB, devC;

1. // Allocate device memory for A, B, and C

2. // copy A and B to device memory

3. // Kernel launch code – to have the device

// to perform the actual vector addition

4. // Copy vector C from the device memory

5. // Free device vectors

}

ETF Beograd::Multiprocesorski sistemi 23/166

Page 24: Multiprocesorski sistemi Compute Unified ... - mups.etf.rsmups.etf.rs/vezbe/MPS - CUDA.pdf · Uvod u GPU računarstvo (1) Grafički procesori (Graphics Processing Unit, GPU) su prvobitno

Svaka nit može da: Čita/piše po registrima

dodeljenim na nivou niti

Čita/piše po lokalnoj (privatnoj) memoriji na nivou niti

Čita/piše po deljenoj memoriji na nivou bloka

Čita/piše po globalnoj memoriji na nivou uređaja

Čita konstantnu memoriju na nivou uređaja

Čita memoriju za teksture na nivou uređaja

Grid

Constant

Memory

Texture

Memory

Global

Memory

Block (0, 0)

Shared Memory

Local

Memory

Thread (0, 0)

Registers

Local

Memory

Thread (1, 0)

Registers

Block (1, 0)

Shared Memory

Local

Memory

Thread (0, 0)

Registers

Local

Memory

Thread (1, 0)

Registers

Host

Memorijski model (1)

ETF Beograd::Multiprocesorski sistemi 24/166

Page 25: Multiprocesorski sistemi Compute Unified ... - mups.etf.rsmups.etf.rs/vezbe/MPS - CUDA.pdf · Uvod u GPU računarstvo (1) Grafički procesori (Graphics Processing Unit, GPU) su prvobitno

Memorijski model (2)

Centralni procesor može da čita/piše po globalnoj, konstantnoj i memoriji za teksture grafičkog procesora Sve su smeštene u DRAM

Sadržaj globalne memorije je dostupan svim nitima Pristup ima

veliko kašnjenje

Device

Global Memory (DRAM)

Block (0, 0)

Shared Memory

Thread (0, 0)

Registers

Thread (1, 0)

Registers

Block (1, 0)

Shared Memory

Thread (0, 0)

Registers

Thread (1, 0)

Registers

Host

Global Memory (DRAM)

ETF Beograd::Multiprocesorski sistemi 25/166

Page 26: Multiprocesorski sistemi Compute Unified ... - mups.etf.rsmups.etf.rs/vezbe/MPS - CUDA.pdf · Uvod u GPU računarstvo (1) Grafički procesori (Graphics Processing Unit, GPU) su prvobitno

Memorijski model (3)

Deljena memorija se može koristiti na nivou bloka niti Male veličine (16/48 KB) Za red veličine brži pristup

od globalne memorije Niti su zadužene da

eksplicitno učitaju podatke

Deljena memorija omogućava da podaci budu bliži ALU jedinicama Smanjuje potrebu

za pristup globalnoj memoriji Smeštanje međurezultata

sa malim kašnjenjem Povećava intenzitet računanja time

što su podaci bliže procesorima Povećava

memorijski propusni opseg

SharedMemory

ThreadExecutionManager

ALU

Control

ALU

Control

ALU

Control

ALU

DRAM

P1

P2

P3

P4

P5

Shared

DataPn’=P1+P2+P3+P4

Pn’=P1+P2+P3+P4

Pn’=P1+P2+P3+P4

ETF Beograd::Multiprocesorski sistemi 26/166

Page 27: Multiprocesorski sistemi Compute Unified ... - mups.etf.rsmups.etf.rs/vezbe/MPS - CUDA.pdf · Uvod u GPU računarstvo (1) Grafički procesori (Graphics Processing Unit, GPU) su prvobitno

Alokacija memorije (1)

Vrši se putem odgovarajućih poziva API funkcija Postoje različite varijante, u zavisnosti od načina

smeštanja podataka u memoriju

cudaMalloc()

Alocira objekat u globalnoj memoriji uređaja

Zahteva dva parametra Adresu pointera na alocirani objekat

Veličinu alociranog objekta u bajtovima

cudaFree()

Oslobađa objekat iz memorije uređaja

Zahteva pointer na objekat

ETF Beograd::Multiprocesorski sistemi 27/166

Page 28: Multiprocesorski sistemi Compute Unified ... - mups.etf.rsmups.etf.rs/vezbe/MPS - CUDA.pdf · Uvod u GPU računarstvo (1) Grafički procesori (Graphics Processing Unit, GPU) su prvobitno

Alokacija memorije (2)

Alokacija memorije na strani domaćina se vrši statički ili standardnim C pozivima

Primer alokacije memorije za sabiranje dva vektora:#define N 256

...

int A[N], B[N], C[N];

int size = N*sizeof(int);

int *devA, *devB, *devC;

...

cudaMalloc( (void**)&devA, size) );

cudaMalloc( (void**)&devB, size );

cudaMalloc( (void**)&devC, size );

...

// Memory transfers and kernel launch

...

cudaFree(devA);

cudaFree(devB);

cudaFree(devC);

ETF Beograd::Multiprocesorski sistemi 28/166

Page 29: Multiprocesorski sistemi Compute Unified ... - mups.etf.rsmups.etf.rs/vezbe/MPS - CUDA.pdf · Uvod u GPU računarstvo (1) Grafički procesori (Graphics Processing Unit, GPU) su prvobitno

Memorijski transferi (1)

Za prenos podataka između domaćina i uređaja, kao i unutar samog uređaja postoje odgovarajući pozivi Različite varijante, u zavisnosti od organizacije podataka Sinhroni/asinhroni i blokirajući/neblokirajući transferi

cudaMemcpy()

Obavlja memorijske transfere Zahteva četiri parametra

Pokazivač na odredište Pokazivač na izvor Veličinu podataka koji se prenose u bajtovima Tip transfera

Tipovi transfera Host to Host (cudaMemcpyHostToHost) Host to Device (cudaMemcpyHostToDevice) Device to Host (cudaMemcpyDeviceToHost) Device to Device (cudaMemcpyDeviceToDevice)

ETF Beograd::Multiprocesorski sistemi 29/166

Page 30: Multiprocesorski sistemi Compute Unified ... - mups.etf.rsmups.etf.rs/vezbe/MPS - CUDA.pdf · Uvod u GPU računarstvo (1) Grafički procesori (Graphics Processing Unit, GPU) su prvobitno

Memorijski transferi (2)

Primer memorijskih transfera prilikom sabiranja dva vektora:#define N 256

...

int A[N], B[N], C[N];

int size = N*sizeof(int);

int *devA, *devB, *devC;

...

// Device memory allocation

...

cudaMemcpy( devA, a, size, cudaMemcpyHostToDevice);

cudaMemcpy( devB, b, size, cudaMemcpyHostToDevice);

...

// Kernel launch

...

cudaMemcpy( C, devC, size, cudaMemcpyDeviceToHost);

...

// Free device memory

ETF Beograd::Multiprocesorski sistemi 30/166

Page 31: Multiprocesorski sistemi Compute Unified ... - mups.etf.rsmups.etf.rs/vezbe/MPS - CUDA.pdf · Uvod u GPU računarstvo (1) Grafički procesori (Graphics Processing Unit, GPU) su prvobitno

Deklaracija CUDA jezgra

Kod koji se izvršava na grafičkom procesoru se piše u vidu odgovarajuće funkcije – jezgra__global__

void vecAdd(int *devA, int *devB, int *devC, int n);

Funkcije - jezgra imaju sledeće osobine Definišu se kvalifikatorom __global__

Moraju biti void funkcije

Parametri jezgra mogu biti skalarni podaci ili pokazivači na podatke alocirane na uređaju

ETF Beograd::Multiprocesorski sistemi 31/166

Page 32: Multiprocesorski sistemi Compute Unified ... - mups.etf.rsmups.etf.rs/vezbe/MPS - CUDA.pdf · Uvod u GPU računarstvo (1) Grafički procesori (Graphics Processing Unit, GPU) su prvobitno

Pozivanje CUDA jezgra (1)

Jezgro mora biti pozvano pomoću odgovarajuće izvršne konfiguracije

Zadaje se pomoću sintaksne ekstenzije jezika C, pomoću trostrukih zagrada <<< i >>>

myKernel<<< n, m >>>(arg1, … );

Parametri n i m definišu organizaciju

blokova niti na nivou rešetke i niti na nivou bloka

Postoje još dva opciona parametra

Za eksplicitno rezervisanje deljene memorije na nivou bloka

Za upravljanje tokovima (streams)

Svaki poziv jezgru je asinhron

Kontrola se odmah vraća centralnom procesoru

ETF Beograd::Multiprocesorski sistemi 32/166

Page 33: Multiprocesorski sistemi Compute Unified ... - mups.etf.rsmups.etf.rs/vezbe/MPS - CUDA.pdf · Uvod u GPU računarstvo (1) Grafički procesori (Graphics Processing Unit, GPU) su prvobitno

Pozivanje CUDA jezgra (2)

Primer poziva jezgra:

Dvodimenzionalna rešetka 64x128

Dvodimenzionalni blok 32x8

__global__ void KernelFunc(...);

dim3 DimGrid(64, 128); // 8192 thread blocks

dim3 DimBlock(32, 8); // 256 threads per block

KernelFunc<<< DimGrid, DimBlock >>>(...);

Tip dim3 je ugrađeni CUDA tip

Unutar kernela svaka nit određuje podatke nad kojima će raditi pomoću ugrađenih promenljivih threadIdx i blockIdx

ETF Beograd::Multiprocesorski sistemi 33/166

Page 34: Multiprocesorski sistemi Compute Unified ... - mups.etf.rsmups.etf.rs/vezbe/MPS - CUDA.pdf · Uvod u GPU računarstvo (1) Grafički procesori (Graphics Processing Unit, GPU) su prvobitno

Primer sabiranje dva vektora (4)

Kompletan program

#define N 1024

void vecAdd(float* A, float* B, float* C, int n);

int main (int argc, char **argv ) {

int size = N *sizeof( int);

int A[N], B[N], C[N];

// Load arrays

vecAdd(A, B, C, N);

// Process results

return 0;

}

ETF Beograd::Multiprocesorski sistemi 34/166

Page 35: Multiprocesorski sistemi Compute Unified ... - mups.etf.rsmups.etf.rs/vezbe/MPS - CUDA.pdf · Uvod u GPU računarstvo (1) Grafički procesori (Graphics Processing Unit, GPU) su prvobitno

Primer sabiranje dva vektora (5)

void vecAdd(float* A, float* B, float* C, int n){

int size = n * sizeof(float);

float *devA, *devB, *devC;

cudaMalloc((void **) &devA, size);

cudaMemcpy(devA, A, size, cudaMemcpyHostToDevice);

cudaMalloc((void **) &devB, size);

cudaMemcpy(devB, B, size, cudaMemcpyHostToDevice);

cudaMalloc((void **) &devC, size);

// Run ceil(N/256) blocks of 256 threads each

vecAddKernel<<<ceil(N/256), 256>>>(devA, devB, devC, n);

cudaMemcpy(C, devC, size, cudaMemcpyDeviceToHost);

cudaFree(devA); cudaFree(devB); cudaFree(devC);

}

ETF Beograd::Multiprocesorski sistemi 35/166

Page 36: Multiprocesorski sistemi Compute Unified ... - mups.etf.rsmups.etf.rs/vezbe/MPS - CUDA.pdf · Uvod u GPU računarstvo (1) Grafički procesori (Graphics Processing Unit, GPU) su prvobitno

Primer sabiranje dva vektora (6)

__global__ void vecAddKernel

(float* devA, float* devB, float* devC, int n){

int idx =

blockIdx.x * blockDim.x + threadIdx.x ;

if(idx < n)

devC[idx] = devA[idx] + devB[idx];

}

Svaka nit računa indeks rezultujućeg elementa koji treba da izračuna Na osnovu blockDim.x i blockIdx.x određuje pomeraj bloka

u odnosu na početak niza

Na osnovu threadIdx.x određuje “globalni ID” konkretnog elementa koji treba da obradi

ETF Beograd::Multiprocesorski sistemi 36/166

Page 37: Multiprocesorski sistemi Compute Unified ... - mups.etf.rsmups.etf.rs/vezbe/MPS - CUDA.pdf · Uvod u GPU računarstvo (1) Grafički procesori (Graphics Processing Unit, GPU) su prvobitno

Primer sabiranje dva vektora (7)

Primer sabiranja dva niza od 32 elementa: Jednodimenzionalni blok i rešetka

gridDim(4, 1, 1)

blockDim(8, 1, 1)

Indeks konkretnog elementa koji svaka nit treba da obradi se dobija kao:idx = blockDim.x * blockIdx.x + threadIdx.x

Za konkretnu nit 2 u bloku 3:idx = 3*8 + 2 = 26

threadIdx.x threadIdx.x threadIdx.x threadIdx.x

0 1 2 3 4 5 6 7 0 1 2 3 4 5 6 7 0 1 2 3 4 5 6 7 0 1 2 3 4 5 6 7

blockIdx.x = 0 blockIdx.x = 1 blockIdx.x = 2 blockIdx.x = 3

Global ID 26

ETF Beograd::Multiprocesorski sistemi 37/166

Page 38: Multiprocesorski sistemi Compute Unified ... - mups.etf.rsmups.etf.rs/vezbe/MPS - CUDA.pdf · Uvod u GPU računarstvo (1) Grafički procesori (Graphics Processing Unit, GPU) su prvobitno

CUDA API

CUDA aplikativni programabilni interfejs (API) je ekstenzija ANSI standarda jezika C

Ekstenzija se sastoji od proširenja jezika C i izvršne biblioteke (runtime)

Proširenja su načinjene za delove koda namenjene izvršavanju na grafičkom procesoru

Za određene funkcionalnosti postoji podrška u hardveru

Izvršna biblioteka implementira:

Podskup C funkcija koje mogu da se izvršavaju i na sistemu domaćinu i na uređaju

Skup funkcija za upravljanje i kontrolu uređaja

Skup funkcija specifičnih za uređaj (intrinsics)

ETF Beograd::Multiprocesorski sistemi 38/166

Page 39: Multiprocesorski sistemi Compute Unified ... - mups.etf.rsmups.etf.rs/vezbe/MPS - CUDA.pdf · Uvod u GPU računarstvo (1) Grafički procesori (Graphics Processing Unit, GPU) su prvobitno

CUDA funkcije (1)

CUDA deklaracije funkcija Jezgra moraju imati kvalifikator __global__

Kvalifikator __host__ označava funkcije

koje se izvršavaju samo na strani domaćina

Kvalifikator __device__ označava funkcije

koje se izvršavaju samo na strani uređaja

Kvalifikatori __host__ i __device__ se mogu koristiti zajedno

Izvršava: Poziva:

__device__ float deviceFunc() uređaj uređaj

__global__ void kernelFunc() uređaj domaćin

__host__ float hostFunc() domaćin domaćin

ETF Beograd::Multiprocesorski sistemi 39/166

Page 40: Multiprocesorski sistemi Compute Unified ... - mups.etf.rsmups.etf.rs/vezbe/MPS - CUDA.pdf · Uvod u GPU računarstvo (1) Grafički procesori (Graphics Processing Unit, GPU) su prvobitno

CUDA funkcije (2)

Ograničenja CUDA funkcija __device__ funkcijama se ne može uzeti adresa

One se najčešće implementiraju kao inline funkcije

Za funkcije koje se izvršavaju na uređaju: Ograničeno dozvoljena rekurzija

Hardversko ograničenje – stek u deljenoj memoriji

Od Fermi arhitekture GPU-ova

Nije dozvoljeno deklarisanje statičkih promenljivih unutar funkcije

Nisu dozvoljene funkcije sa varijabilnim brojem argumenata Funkcije poput printf(...)

ETF Beograd::Multiprocesorski sistemi 40/166

Page 41: Multiprocesorski sistemi Compute Unified ... - mups.etf.rsmups.etf.rs/vezbe/MPS - CUDA.pdf · Uvod u GPU računarstvo (1) Grafički procesori (Graphics Processing Unit, GPU) su prvobitno

CUDA kvalifikatori promenljivih

Automatske promenljive bez kvalifikatora se smeštaju u registre Osim velikih struktura i statičkih nizova koji se smeštaju u lokalnu memoriju

Pokazivači mogu da pokazuju samo na objekte iz globalne memorije: Alocirane na strani domaćina i prosleđene jezgru

__global__ void KernelFunc(float* ptr);

Statički deklarisane objekte na strani uređaja

float* ptr = &globalVar;

Kvalifikator __device__ je opcion ako su navedeni kvalifikatori __shared__ ili __constant__

Memorija Opseg Životni vek

__device__ __shared__ int SharedVar; deljena blok blok

__device__ int GlobalVar; globalna grid aplikacija

__device__ __constant__ int ConstantVar; konstantna grid aplikacija

ETF Beograd::Multiprocesorski sistemi 41/166

Page 42: Multiprocesorski sistemi Compute Unified ... - mups.etf.rsmups.etf.rs/vezbe/MPS - CUDA.pdf · Uvod u GPU računarstvo (1) Grafički procesori (Graphics Processing Unit, GPU) su prvobitno

Ugrađeni tipovi

Izvršna biblioteka obezbeđuje određene ugrađene tipove podataka [u]char[1..4], [u]short[1..4],

[u]int[1..4], [u]long[1..4], float[1..4]

To su strukture koje imaju x, y, z, w polja:uint4 param;

int y = param.y;

Ugrađeni tip dim3

Zasnovan na uint3

Koristi se za zadavanje dimenzija

ETF Beograd::Multiprocesorski sistemi 42/166

Page 43: Multiprocesorski sistemi Compute Unified ... - mups.etf.rsmups.etf.rs/vezbe/MPS - CUDA.pdf · Uvod u GPU računarstvo (1) Grafički procesori (Graphics Processing Unit, GPU) su prvobitno

Ugrađene promenljive

dim3 gridDim;

Dimenzije rešetke u broju blokova (1D, 2D ili 3D)

Maskimalne dimenzije 65535 x 65535 x 65535

dim3 blockDim;

Dimenzije bloka u broju niti (1D, 2D ili 3D)

Maksimalne dimenzije

Tesla arhitektura 512 niti (512 x 512 x 64)

Kasnije arhitekture 1024 niti (1024 x 1024 x 64)

dim3 blockIdx;

Indeks bloka unutar rešetke

dim3 threadIdx;

Indeks niti unutar bloka

Maksimalne vrednosti pojedinih parametara su hardverski zavisne

Mogu biti podložne promenama u budućnosti

ETF Beograd::Multiprocesorski sistemi 43/166

Page 44: Multiprocesorski sistemi Compute Unified ... - mups.etf.rsmups.etf.rs/vezbe/MPS - CUDA.pdf · Uvod u GPU računarstvo (1) Grafički procesori (Graphics Processing Unit, GPU) su prvobitno

Ugrađene matematičke funkcije

Izvršna biblioteka obezbeđuje određeni skup matematičkih funkcija pow, sqrt, cbrt, hypot

exp, exp2, expm1

log, log2, log10, log1p

sin, cos, tan, asin, acos, atan, atan2

sinh, cosh, tanh, asinh, acosh, atanh

ceil, floor, trunc, round

Kada se izvršavaju na strani domaćina, koriste se implementacije iz standardne C biblioteke Podržane samo za skalarne tipove Varijante koje imaju slovo f u nastavku imena, poput sinf rade sa

podacima jednostruke preciznosti (float)

Postoje i brže, ali manje precizne varijante ovih funkcija, koje se mogu izvršavati samo na strani uređaja __sin, __cos, __tan

ETF Beograd::Multiprocesorski sistemi 44/166

Page 45: Multiprocesorski sistemi Compute Unified ... - mups.etf.rsmups.etf.rs/vezbe/MPS - CUDA.pdf · Uvod u GPU računarstvo (1) Grafički procesori (Graphics Processing Unit, GPU) su prvobitno

Prevođenje CUDA programa (1)

Bilo koji izvorni kod koji sadrži CUDA ekstenzije mora se prevesti pomoću nvcc prevodioca

NVCC je prevodilac-omotač (compiler driver) Radi tako što poziva sve nepohodne alate i prevodioce

cudacc, g++, cl, ...

Izlazi NVCC prevodioca su: C kod koji se izvršava na strani domaćina (CPU kod) i koji se

mora dalje prevesti odgovarajućim prevodiocem PTX (Parallel Thread eXecution) kod

Predstavlja neku vrstu međukoda za grafički procesor

Bilo koji program koji sadrži CUDA pozive, zahteva sledeće dve dinamičke bilioteke: CUDA runtime biblioteku (cudart) CUDA core biblioteku (cuda)

ETF Beograd::Multiprocesorski sistemi 45/166

Page 46: Multiprocesorski sistemi Compute Unified ... - mups.etf.rsmups.etf.rs/vezbe/MPS - CUDA.pdf · Uvod u GPU računarstvo (1) Grafički procesori (Graphics Processing Unit, GPU) su prvobitno

Prevođenje CUDA programa (2)

G80 … GV100

NVCC

C/C++ CUDA

Application

PTX to Target

Compiler

Target code

PTX Code

CPU Code

ETF Beograd::Multiprocesorski sistemi 46/166

Page 47: Multiprocesorski sistemi Compute Unified ... - mups.etf.rsmups.etf.rs/vezbe/MPS - CUDA.pdf · Uvod u GPU računarstvo (1) Grafički procesori (Graphics Processing Unit, GPU) su prvobitno

Prevođenje CUDA programa (3)

NVCC

C/C++ CUDA

Application

PTX to Target

Compiler

G80 … GV100

Target code

PTX CodeVirtual

Physical

ETF Beograd::Multiprocesorski sistemi 47/166

Page 48: Multiprocesorski sistemi Compute Unified ... - mups.etf.rsmups.etf.rs/vezbe/MPS - CUDA.pdf · Uvod u GPU računarstvo (1) Grafički procesori (Graphics Processing Unit, GPU) su prvobitno

NVCC i PTX virtualna mašina

EDG preprocesor

Razdvaja GPU od CPU koda

Open64

Generiše GPU PTX asemblerski kod

PTX kod

Just-in-time prevođenje

Omogućava izvršavanje na različitim ISA(Instruction Set Architecture)

EDG

C/C++ CUDA

Application

CPU Code

Open64

PTX Code

ld.global.v4.f32 {$f1,$f3,$f5,$f7}, [$r9+0];mad.f32 $f1, $f5, $f3, $f1;

float4 me = gx[gtid];me.x += me.y * me.z;

ETF Beograd::Multiprocesorski sistemi 48/166

Page 49: Multiprocesorski sistemi Compute Unified ... - mups.etf.rsmups.etf.rs/vezbe/MPS - CUDA.pdf · Uvod u GPU računarstvo (1) Grafički procesori (Graphics Processing Unit, GPU) su prvobitno

Studija slučaja – množenje matrica (1)

Potrebno je pomnožiti dve matrice Zbog jednostavnosti

pretpostavimo kvadratne

Jedna nit će biti zadužena za računanje jednogelementa Svaka nit će

pristupati WIDTH puta elementima matrica M i N

49

M

N

P

WID

TH

WID

TH

WIDTH WIDTH

ETF Beograd::Multiprocesorski sistemi 49/166

Page 50: Multiprocesorski sistemi Compute Unified ... - mups.etf.rsmups.etf.rs/vezbe/MPS - CUDA.pdf · Uvod u GPU računarstvo (1) Grafički procesori (Graphics Processing Unit, GPU) su prvobitno

Studija slučaja – množenje matrica (2)

Tradicionalni sekvencijalni kod:

void MatrixMulOnHost(float* M, float* N, float* P, int Width) {

for (int i = 0; i < Width; ++i)

for (int j = 0; j < Width; ++j) {

float sum = 0;

for (int k = 0; k < Width; ++k) {

float a = M[i * width + k];

float b = N[k * width + j];

sum += a * b;

}

P[i * Width + j] = sum;

}

}

ETF Beograd::Multiprocesorski sistemi 50/166

Page 51: Multiprocesorski sistemi Compute Unified ... - mups.etf.rsmups.etf.rs/vezbe/MPS - CUDA.pdf · Uvod u GPU računarstvo (1) Grafički procesori (Graphics Processing Unit, GPU) su prvobitno

M0,2

M1,1

M0,1M0,0

M1,0

M0,3

M1,2 M1,3

M0,2M0,1M0,0 M0,3 M1,1M1,0 M1,2 M1,3 M2,1M2,0 M2,2 M2,3

M2,1M2,0 M2,2 M2,3

M3,1M3,0 M3,2 M3,3

M3,1M3,0 M3,2 M3,3

M

Smeštanje matrica u C-u

Matrice se u C-u smeštaju po vrstama Matrica će uređaju biti preneta linearizovana

Svaka nit će proračunati adresu elementa kome treba da pristupi

ETF Beograd::Multiprocesorski sistemi 51/166

Page 52: Multiprocesorski sistemi Compute Unified ... - mups.etf.rsmups.etf.rs/vezbe/MPS - CUDA.pdf · Uvod u GPU računarstvo (1) Grafički procesori (Graphics Processing Unit, GPU) su prvobitno

Studija slučaja – množenje matrica (3)

CUDA program na strani domaćina:

void MatrixMulOnDevice (float* M, float* N, float* P, int Width) {

int size = Width * Width * sizeof(float);

float *Md, *Nd, *Pd;

1. // Allocate and Load M, N to device memory

cudaMalloc(&Md, size);

cudaMemcpy(Md, M, size, cudaMemcpyHostToDevice);

cudaMalloc(&Nd, size);

cudaMemcpy(Nd, N, size, cudaMemcpyHostToDevice);

// Allocate P on the device

cudaMalloc(&Pd, size);

2. //Kernel invocation code – to be shown later

3. // Read P from the device

cudaMemcpy(P, Pd, size, cudaMemcpyDeviceToHost);

// Free device matrices

cudaFree(Md); cudaFree(Nd); cudaFree (Pd);

}

ETF Beograd::Multiprocesorski sistemi 52/166

Page 53: Multiprocesorski sistemi Compute Unified ... - mups.etf.rsmups.etf.rs/vezbe/MPS - CUDA.pdf · Uvod u GPU računarstvo (1) Grafički procesori (Graphics Processing Unit, GPU) su prvobitno

Studija slučaja – množenje matrica (4)

Jezgro:__global__ void MatrixMulKernel

(float* Md, float* Nd, float* Pd, int Width) {

// Pvalue is used to store the element of the matrix

// that is computed by the thread

float Pvalue = 0;

for (int k = 0; k < Width; ++k) {

float Melement = Md[threadIdx.y * Width + k];

float Nelement = Nd[k * Width + threadIdx.x];

Pvalue += Melement * Nelement;

}

Pd[threadIdx.y * Width + threadIdx.x] = Pvalue;

}

ETF Beograd::Multiprocesorski sistemi 53/166

Page 54: Multiprocesorski sistemi Compute Unified ... - mups.etf.rsmups.etf.rs/vezbe/MPS - CUDA.pdf · Uvod u GPU računarstvo (1) Grafički procesori (Graphics Processing Unit, GPU) su prvobitno

Studija slučaja – množenje matrica (5)

Jezgro pokreće sledeći kod:// Setup the execution configuration

dim3 dimGrid(1, 1);

dim3 dimBlock(Width, Width);

// Launch the device computation threads!

MatrixMulKernel<<<dimGrid, dimBlock>>>(Md, Nd, Pd, Width);

54

Nd

Md Pd

WID

TH

WID

TH

WIDTH WIDTH

ty

tx

ty

tx

k

k

ETF Beograd::Multiprocesorski sistemi 54/166

Page 55: Multiprocesorski sistemi Compute Unified ... - mups.etf.rsmups.etf.rs/vezbe/MPS - CUDA.pdf · Uvod u GPU računarstvo (1) Grafički procesori (Graphics Processing Unit, GPU) su prvobitno

Nedostaci predloženog rešenja (1)

Koristi se samo jedan blok niti

Matrice mogu biti samo ograničene veličine

Grid 1

Block 1

3 2 5 4

2

4

2

6

48

Thread

(2, 2)

WIDTH

Md Pd

Nd

ETF Beograd::Multiprocesorski sistemi 55/166

Page 56: Multiprocesorski sistemi Compute Unified ... - mups.etf.rsmups.etf.rs/vezbe/MPS - CUDA.pdf · Uvod u GPU računarstvo (1) Grafički procesori (Graphics Processing Unit, GPU) su prvobitno

Nedostaci predloženog rešenja (2)

Jedan blok niti računa matricu Pd

Svaka nit računa jedan element Pd i pritom: Učitava vrstu matrice Md

Učitava kolonu matrice Nd

Izvršava jedno množenje i sabiranje za svaki par elementa iz matrica Md i Nd

Odnos između računanja i pristupa (sporoj) globalnoj memoriji je mali (oko 1:1)

2 operacije

2 pristupa globalnoj memoriji

Veličina matrice ograničena brojem niti dozvoljenom unutar jednog bloka niti Ogranično arhitekturom (512/1024 niti)

ETF Beograd::Multiprocesorski sistemi 56/166

Page 57: Multiprocesorski sistemi Compute Unified ... - mups.etf.rsmups.etf.rs/vezbe/MPS - CUDA.pdf · Uvod u GPU računarstvo (1) Grafički procesori (Graphics Processing Unit, GPU) su prvobitno

Studija slučaja –množenje matrica (6)

Rešenje – podeliti matricu na podmatrice (tiles) koje će obraditi zasebni blokovi niti Svaka nit računa jedan element

Veličina bloka niti će biti jednaka veličini podmatrice

Md

Nd

Pd

Pdsub

TILE_WIDTH

WIDTHWIDTH

tx01 TILE_WIDTH-12

0 1 2

by ty210

TILE_WIDTH-1

2

1

0

TIL

E_

WID

TH

E

WID

TH

WID

TH

bx

ETF Beograd::Multiprocesorski sistemi 57/166

Page 58: Multiprocesorski sistemi Compute Unified ... - mups.etf.rsmups.etf.rs/vezbe/MPS - CUDA.pdf · Uvod u GPU računarstvo (1) Grafički procesori (Graphics Processing Unit, GPU) su prvobitno

Studija slučaja – množenje matrica (7)

Primer množenja matrice 4x4, korišćenjem blokova niti dimenzija 2x2 niti

P1,0P0,0

P0,1

P2,0 P3,0

P1,1

P0,2 P2,2 P3,2P1,2

P3,1P2,1

P0,3 P2,3 P3,3P1,3

Block(0,0) Block(1,0)

Block(1,1)Block(0,1)

TILE_WIDTH = 2 Pd1,0Md2,0

Md1,1

Md1,0Md0,0

Md0,1

Md3,0

Md2,1

Pd0,0

Md3,1 Pd0,1

Pd2,0Pd3,0

Nd0,3Nd1,3

Nd1,2

Nd1,1

Nd1,0Nd0,0

Nd0,1

Nd0,2

Pd1,1

Pd0,2 Pd2,2Pd3,2Pd1,2

Pd3,1Pd2,1

Pd0,3 Pd2,3Pd3,3Pd1,3

ETF Beograd::Multiprocesorski sistemi 58/166

Page 59: Multiprocesorski sistemi Compute Unified ... - mups.etf.rsmups.etf.rs/vezbe/MPS - CUDA.pdf · Uvod u GPU računarstvo (1) Grafički procesori (Graphics Processing Unit, GPU) su prvobitno

Studija slučaja – množenje matrica (8)

Jezgro:__global__ void MatrixMulKernel

(float* Md, float* Nd, float* Pd, int Width) {

// Calculate the row index of the Pd element and M

int Row = blockIdx.y * TILE_WIDTH + threadIdx.y;

// Calculate the column index of Pd and N

int Col = blockIdx.x * TILE_WIDTH + threadIdx.x;

float Pvalue = 0;

// Each thread computes one element of the block submatrix

for (int k = 0; k < Width; ++k)

Pvalue += Md[Row * Width + k] * Nd[k * Width + Col];

Pd[Row * Width + Col] = Pvalue;

}

ETF Beograd::Multiprocesorski sistemi 59/166

Page 60: Multiprocesorski sistemi Compute Unified ... - mups.etf.rsmups.etf.rs/vezbe/MPS - CUDA.pdf · Uvod u GPU računarstvo (1) Grafički procesori (Graphics Processing Unit, GPU) su prvobitno

Grafički procesor se može posmatrati kao skup multiprocesora

Svaki multiprocesor je skup 32-bitnih skalarnih procesora SIMD arhitekture

U svakom taktu, svaki procesor unutar multiprocesora izvršava istu instrukciju

Uključujući skokove (grananja)

Ovakav način izvršavanja je skalabilan

Dodavanjem novih multiprocesora popravljaju se performanse

Device

Multiprocessor N

Multiprocessor 2

Multiprocessor 1

Instruction

Unit

Processor 1

Processor 2

Processor M

Hardverska implementacija (1)

ETF Beograd::Multiprocesorski sistemi 60/166

Page 61: Multiprocesorski sistemi Compute Unified ... - mups.etf.rsmups.etf.rs/vezbe/MPS - CUDA.pdf · Uvod u GPU računarstvo (1) Grafički procesori (Graphics Processing Unit, GPU) su prvobitno

Hardverska implementacija (2)

Niti se izvršavaju na skalarnim procesorima

Blokovi niti se izvršavaju na pojedinačnim multiprocesorima Blokovi ne mogu da migriraju

Nekoliko blokova niti može da se izvršava na jednom multiprocesoru U zavisnosti

od potreba za resursima

Registrima

Deljenom memorijom

ETF Beograd::Multiprocesorski sistemi 61/166

Page 62: Multiprocesorski sistemi Compute Unified ... - mups.etf.rsmups.etf.rs/vezbe/MPS - CUDA.pdf · Uvod u GPU računarstvo (1) Grafički procesori (Graphics Processing Unit, GPU) su prvobitno

Hardverska implementacija (3)

Tipična arhitektura (GT200 grafički procesor)

240 skalarni procesora (SP) izvršava niti jezgra

30 streaming multiprocesora (SM) sadrži:

8 skalarnih procesora

Deljenu memoriju za saradnju na nivou bloka

1 jedinicu za rad u pokretnom zarezu dvostruke preciznosti

2 jedinice specijalne namene (SFU)

ETF Beograd::Multiprocesorski sistemi 62/166

Page 63: Multiprocesorski sistemi Compute Unified ... - mups.etf.rsmups.etf.rs/vezbe/MPS - CUDA.pdf · Uvod u GPU računarstvo (1) Grafički procesori (Graphics Processing Unit, GPU) su prvobitno

Primer G80 arhitekture (1)

Grafički režim

L2

FB

SP SP

L1

TF

Th

rea

d P

roc

es

so

r

Vtx Thread Issue

Setup / Rstr / ZCull

Geom Thread Issue Pixel Thread Issue

Input Assembler

Host

SP SP

L1

TF

SP SP

L1

TF

SP SP

L1

TF

SP SP

L1

TF

SP SP

L1

TF

SP SP

L1

TF

SP SP

L1

TF

L2

FB

L2

FB

L2

FB

L2

FB

L2

FB

ETF Beograd::Multiprocesorski sistemi 63/166

Page 64: Multiprocesorski sistemi Compute Unified ... - mups.etf.rsmups.etf.rs/vezbe/MPS - CUDA.pdf · Uvod u GPU računarstvo (1) Grafički procesori (Graphics Processing Unit, GPU) su prvobitno

Primer G80 arhitekture (2)

Režim za opštenamenska izračunavanja

Load/store

Global Memory

Thread Execution Manager

Input Assembler

Host

Texture Texture Texture Texture Texture Texture Texture TextureTexture

Parallel Data

Cache

Parallel Data

Cache

Parallel Data

Cache

Parallel Data

Cache

Parallel Data

Cache

Parallel Data

Cache

Parallel Data

Cache

Parallel Data

Cache

Load/store Load/store Load/store Load/store Load/store

ETF Beograd::Multiprocesorski sistemi 64/166

Page 65: Multiprocesorski sistemi Compute Unified ... - mups.etf.rsmups.etf.rs/vezbe/MPS - CUDA.pdf · Uvod u GPU računarstvo (1) Grafički procesori (Graphics Processing Unit, GPU) su prvobitno

Izvršavanje blokova niti (1)

Hardver raspoređuje blokove niti procesorima slobodno, bez ikakvih ograničenja Jezgra su skalabilna nezavisno od broja procesora

na kojima se izvršavaju Svaki blok se može izvršiti u bilo kome relativnom poretku

u odnosu na druge blokove

Device

Block 0 Block 1

Block 2 Block 3

Block 4 Block 5

Block 6 Block 7

Kernel grid

Block 0 Block 1

Block 2 Block 3

Block 4 Block 5

Block 6 Block 7

Device

Block 0 Block 1 Block 2 Block 3

Block 4 Block 5 Block 6 Block 7vreme

ETF Beograd::Multiprocesorski sistemi 65/166

Page 66: Multiprocesorski sistemi Compute Unified ... - mups.etf.rsmups.etf.rs/vezbe/MPS - CUDA.pdf · Uvod u GPU računarstvo (1) Grafički procesori (Graphics Processing Unit, GPU) su prvobitno

Izvršavanje blokova niti (2)

Niti se multiprocesorima dodeljuju na nivou bloka Najviše 8 blokova, ukoliko resursi dozvoljavaju Na G80 arhitekturi, najviše 768 niti se može izvršavati na jednom SM-u Na novim arhitekturama, najviše 2048 niti se može izvršavati

na jednom multiprocesoru Primer: 2 bloka po 1024 niti ili 4 bloka po 512 niti

Multiprocesor je zadužen za upravljanje i raspoređivanje niti za izvršavanje

Multiprocesor održava blockID i threadID za svaku nit

t0 t1 t2 … tm

Blocks

SP

SharedMemory

MT IU

SP

SharedMemory

MT IU

t0 t1 t2 … tm

Blocks

SM 1SM 0

ETF Beograd::Multiprocesorski sistemi 66/166

Page 67: Multiprocesorski sistemi Compute Unified ... - mups.etf.rsmups.etf.rs/vezbe/MPS - CUDA.pdf · Uvod u GPU računarstvo (1) Grafički procesori (Graphics Processing Unit, GPU) su prvobitno

Raspoređivanje i izvršavanje niti (1)

Niti iz bloka se na SM-u izvršavaju u jedinicama koje se nazivaju warp-ovi 1 warp = 32 niti

Warp je jedinica za raspoređivanje na SM-u

Implementaciona odluka

Ako se na SM-u izvršava 3 bloka od po 256 niti: Svaki blok se deli na

256 / 32 = 8 warp-ova

Na SM-u ukupno 8 * 3 = 24 warp-ova za izvršavanje

…t0 t1 t2 … t31

…t0 t1 t2 … t31

…Block 1 Warps Block 2 Warps

SP

SP

SP

SP

SFU

SP

SP

SP

SP

SFU

Instruction Fetch/Dispatch

Instruction L1

Streaming Multiprocessor

Shared Memory

…t0 t1 t2 … t31

…Block N Warps

ETF Beograd::Multiprocesorski sistemi 67/166

Page 68: Multiprocesorski sistemi Compute Unified ... - mups.etf.rsmups.etf.rs/vezbe/MPS - CUDA.pdf · Uvod u GPU računarstvo (1) Grafički procesori (Graphics Processing Unit, GPU) su prvobitno

Raspoređivanje i izvršavanje niti (2)

Blokovi niti se u warp-ove dele na sledeći način: Indeksi niti unutar bloka su rastući i uzastopni

Warp-ovi se formiraju počevši od niti sa indeksom 0

Podela se uvek radi na isti način To znanje se može iskoristiti kod kontrole toka

Redosled izvršavanja warp-ova ne mora biti jednoznačan Ukoliko postoje zavisnosti među nitima

unutar jednog bloka, mora se vršiti sinhronizacija

Ugrađena funkcija syncthreads() se koristi za sinhronizaciju niti na nivou bloka

ETF Beograd::Multiprocesorski sistemi 68/166

Page 69: Multiprocesorski sistemi Compute Unified ... - mups.etf.rsmups.etf.rs/vezbe/MPS - CUDA.pdf · Uvod u GPU računarstvo (1) Grafički procesori (Graphics Processing Unit, GPU) su prvobitno

Raspoređivanje i izvršavanje niti (3)

Na SM-ovima je implementirana “zero-overhead” politika raspoređivanja warp-ova U jednom trenutku samo jedan warp

se izvršava na SM-u Raspoloživi za izvršavanje su

samo oni warp-ovi kod kojih su svi operandi dostupni za isvršavanje u narednoj instrukciji

Warp-ovi se biraju za izvršavanje na osnovu prioriteta Round robin + aging

Sve niti unutar warp-a izvršavaju istu instrukciju kada su izabrane

warp 8 instruction 11

SM multithreadedWarp scheduler

warp 1 instruction 42

warp 3 instruction 95

warp 8 instruction 12

...

time

warp 3 instruction 96

ETF Beograd::Multiprocesorski sistemi 69/166

Page 70: Multiprocesorski sistemi Compute Unified ... - mups.etf.rsmups.etf.rs/vezbe/MPS - CUDA.pdf · Uvod u GPU računarstvo (1) Grafički procesori (Graphics Processing Unit, GPU) su prvobitno

Raspoređivanje i izvršavanje niti (4)

Prosečno vreme pristupa globalnoj memoriji je oko 200 ciklusa procesora

Na G80, 4 ciklusa su potrebna da bi se instrukcija poslala svim nitima na izvršenje u warp-u Ako, u proseku, svaka četvrta instrukcija zahteva

pristup memoriji:

Potrebno je najmanje 13 warp-ova na jednom SM-u da bi se u potpunosti tolerisalo kašnjenje

4 * 4 * 13 = 208

TB1

W1

TB = Thread Block, W = Warp

TB2

W1

TB3

W1

TB2

W1

TB1

W1

TB3

W2

TB1

W2

TB1

W3

TB3

W2

Time

TB1, W1 stallTB3, W2 stallTB2, W1 stall

Instruction: 1 2 3 4 5 6 1 2 1 2 3 41 2 7 8 1 2 1 2 3 4

ETF Beograd::Multiprocesorski sistemi 70/166

Page 71: Multiprocesorski sistemi Compute Unified ... - mups.etf.rsmups.etf.rs/vezbe/MPS - CUDA.pdf · Uvod u GPU računarstvo (1) Grafički procesori (Graphics Processing Unit, GPU) su prvobitno

Kontrola toka

Problem prilikom izvršavanja mogu biti warp-ovi kod kojih postoje uslovna grananja “Branch divergence” Deo niti unutar warp-a izvršava jednu putanju koda,

a deo niti izvršava drugu putanju

SM-ovi su SIMD arhitekture Sve niti moraju izvršavati isti kod Grananja se izvršavaju

tako što sve niti izvrše sve moguće putanje Alternativno, vrši se predikatsko (spekulativno) izvršavanje Instrukcije pod predikatom mora da ubaci prevodilac

Zatim se u zavisnosti od uslova grananja, odbacuju/ne upisuju rezultati putanja koje nisu aktivne

Ovakav način izvršavanja može dovesti do značajnih usporenja

ETF Beograd::Multiprocesorski sistemi 71/166

Page 72: Multiprocesorski sistemi Compute Unified ... - mups.etf.rsmups.etf.rs/vezbe/MPS - CUDA.pdf · Uvod u GPU računarstvo (1) Grafički procesori (Graphics Processing Unit, GPU) su prvobitno

Granularnost blokova

Dimenzije blokova niti treba pažljivo odabrati Na primeru množenja matrica na G80 procesoru,

da li treba koristiti 8x8, 16x16 ili 32x32 blokove?

Za blok dimenzija 8x8, izvršava se 64 niti po bloku Svaki SM može da izvršava do 768 niti, što daje 768 / 64 = 12 blokova Svaki SM može da prihvati samo 8 blokova na izvršenje

Samo 512 niti će se izvršavati na svakom SM-u

Za blok dimenzija 16x16, izvršava se 256 niti po bloku Maksimalno 768 niti / 256 niti po bloku = 3 bloka niti Iskorišćava se pun kapacitet pojedinačnog multiprocesora

Osim ako potreba za drugim resursima ne onemogući izvršavanje ovakve konfiguracije

Za blok dimenzija 32x32, ukupno bi se izvršavalo 1024 niti po bloku Ne može da stane na SM arhitekture G80

Odluka o granularnosti blokova dosta zavisi od eksperimentisanja! Nameće korišćenje profajlera i sličnih alatki CUDA Occupancy calculator

ETF Beograd::Multiprocesorski sistemi 72/166

Page 73: Multiprocesorski sistemi Compute Unified ... - mups.etf.rsmups.etf.rs/vezbe/MPS - CUDA.pdf · Uvod u GPU računarstvo (1) Grafički procesori (Graphics Processing Unit, GPU) su prvobitno

Alokacija registara (1)

Svaki multiprocesor poseduje registarski fajl

Registri se dinamički dodeljuju blokovima koji se izvršavaju na pojedinačnom multiprocesoru

Na G80 procesoru postoji 8192 registra na svakom SMu

Niti iz drugih blokova ne mogu pristupati registrima dodeljenim jednom bloku niti

Svaka niti pristupa samo registrima koji su joj dodeljeni

Broj blokova koji se izvršava na jednom SM-u direktno zavisi od njihovih potreba za registrima

Što može dovesti do slabog iskorišćenja resursa

ETF Beograd::Multiprocesorski sistemi 73/166

Page 74: Multiprocesorski sistemi Compute Unified ... - mups.etf.rsmups.etf.rs/vezbe/MPS - CUDA.pdf · Uvod u GPU računarstvo (1) Grafički procesori (Graphics Processing Unit, GPU) su prvobitno

Alokacija registara (2)

Pretpostavimo da se jezgro izvršava u blokovima veličine 16x16 i da svaka nit koristi 10 registara: Za izvršavanje svakog bloka je potrebno

256 * 10 = 2560 registara 2560 * 3 = 7680 < 8192

Na SM-u se može izvršavati 3 bloka niti, što se tiče alokacije registara

Ukoliko se broj registara po niti poveća samo za jedan: Za izvršavanje svakog bloka će biti potrebno

256 * 11 = 2816 registara 2816 * 3 = 8448 > 8192

Samo dva bloka će moći da se izvrše na SM-u 2816 * 2 = 5632 << 8192 Redukcija paralelizma skoro 1/3!

ETF Beograd::Multiprocesorski sistemi 74/166

Page 75: Multiprocesorski sistemi Compute Unified ... - mups.etf.rsmups.etf.rs/vezbe/MPS - CUDA.pdf · Uvod u GPU računarstvo (1) Grafički procesori (Graphics Processing Unit, GPU) su prvobitno

Paralelna memorijska arhitektura (1)

Kod paralelne mašine, veliki broj niti pristupa memoriji Memorija je preklopljena i podeljena u banke

I globalna i deljena memorija

Vrlo bitno za postizanje velikog propusnog opsega

Svaka memorijska banka može da usluži jedan zahtev u jednom ciklusu Celokupna memorija može simultano da usluži

onoliko pristupa koliko ima memorijskih banki

Više simultanih pristupa istoj banki dovodi do konflikta Konfliktni pristupi se serijalizuju

Bank 15

Bank 7

Bank 6Bank 5

Bank 4

Bank 3Bank 2

Bank 1Bank 0

ETF Beograd::Multiprocesorski sistemi 75/166

Page 76: Multiprocesorski sistemi Compute Unified ... - mups.etf.rsmups.etf.rs/vezbe/MPS - CUDA.pdf · Uvod u GPU računarstvo (1) Grafički procesori (Graphics Processing Unit, GPU) su prvobitno

Paralelna memorijska arhitektura (2)

Na novim procesorima, memorija je podeljena u 32 banke Uzastopne 32-bitne reči se dodeljuju

uzastopnim memorijskim bankama

Pristup memoriji na CUDA se kombinuje u transakcije Najbolje performanse se dobijaju kada

sve niti unutar warp-a pristupaju uzastopnim memorijskim lokacijama

Tada nema konflikata

Konflikti su mogući jedino unutar warp-a

32

Global Memory

Warp

32

Shared Memory

Warp

ETF Beograd::Multiprocesorski sistemi 76/166

Page 77: Multiprocesorski sistemi Compute Unified ... - mups.etf.rsmups.etf.rs/vezbe/MPS - CUDA.pdf · Uvod u GPU računarstvo (1) Grafički procesori (Graphics Processing Unit, GPU) su prvobitno

Primeri pristupa memoriji (1)

Nema konflikata

Linearno adresiranje

stride = 1

Nema konflikata

Slučajan pristup memoriji

Bank 15

Bank 7

Bank 6Bank 5

Bank 4

Bank 3Bank 2

Bank 1Bank 0

Thread 15

Thread 7

Thread 6Thread 5

Thread 4

Thread 3Thread 2

Thread 1Thread 0

Bank 15

Bank 7

Bank 6Bank 5

Bank 4

Bank 3Bank 2

Bank 1Bank 0

Thread 15

Thread 7

Thread 6Thread 5

Thread 4

Thread 3Thread 2

Thread 1Thread 0

ETF Beograd::Multiprocesorski sistemi 77/166

Page 78: Multiprocesorski sistemi Compute Unified ... - mups.etf.rsmups.etf.rs/vezbe/MPS - CUDA.pdf · Uvod u GPU računarstvo (1) Grafički procesori (Graphics Processing Unit, GPU) su prvobitno

Primeri pristupa memoriji (2)

Thread 11

Thread 10

Thread 9Thread 8

Thread 4

Thread 3Thread 2

Thread 1Thread 0

Bank 15

Bank 7

Bank 6Bank 5

Bank 4

Bank 3Bank 2

Bank 1Bank 0

Thread 15

Thread 7

Thread 6Thread 5

Thread 4

Thread 3Thread 2

Thread 1Thread 0

Bank 9Bank 8

Bank 15

Bank 7

Bank 2

Bank 1Bank 0

x8

x8

8-struki konflikt Linearno adresiranje

stride = 8

Dvostruki konflikt Linearno adresiranje

stride = 2

ETF Beograd::Multiprocesorski sistemi 78/166

Page 79: Multiprocesorski sistemi Compute Unified ... - mups.etf.rsmups.etf.rs/vezbe/MPS - CUDA.pdf · Uvod u GPU računarstvo (1) Grafički procesori (Graphics Processing Unit, GPU) su prvobitno

Pristup memoriji u transakcijama (1)

Md Nd

WID

TH

WIDTH

Nit 1Nit 2

Nema spajanja

(not coalesced)

Ima spajanja

(coalesced)

Najbolje performanse se dobijaju kada sve niti unutar warp-apristupaju uzastopnim memorijskim lokacijama Spojeni/sjedinjeni pristup memoriji (memory coalescing)

Primer pristupa matricama prilikom množenja matrica

ETF Beograd::Multiprocesorski sistemi 79/166

Page 80: Multiprocesorski sistemi Compute Unified ... - mups.etf.rsmups.etf.rs/vezbe/MPS - CUDA.pdf · Uvod u GPU računarstvo (1) Grafički procesori (Graphics Processing Unit, GPU) su prvobitno

M0,2

M1,1

M0,1M0,0

M1,0

M0,3

M1,2 M1,3

M0,2M0,1M0,0 M0,3 M1,1M1,0 M1,2 M1,3 M2,1M2,0 M2,2 M2,3

M2,1M2,0 M2,2 M2,3

M3,1M3,0 M3,2 M3,3

M3,1M3,0 M3,2 M3,3

M

Smeštanje matrica u C-u (podsetnik)

Matrice se u C-u smeštaju po vrstama

Matrica se uređaju najčešće prenosi linearizovana

ETF Beograd::Multiprocesorski sistemiETF Beograd::Multiprocesorski sistemi 80/166

Page 81: Multiprocesorski sistemi Compute Unified ... - mups.etf.rsmups.etf.rs/vezbe/MPS - CUDA.pdf · Uvod u GPU računarstvo (1) Grafički procesori (Graphics Processing Unit, GPU) su prvobitno

Pristup memoriji u transakcijama (2)

Ne postoji kombinovanje u transakciju: Niti ne pristupaju

uzastopnim lokacijama u jednom trenutku

Non-coalesced access

M2,0

M1,1

M1,0M0,0

M0,1

M3,0

M2,1 M3,1

M2,0M1,0M0,0 M3,0 M1,1M0,1 M2,1 M3,1 M1,2M0,2 M2,2 M3,2

M1,2M0,2 M2,2 M3,2

M1,3M0,3 M2,3 M3,3

M1,3M0,3 M2,3 M3,3

M

T1 T2 T3 T4

Trenutak 1

T1 T2 T3 T4

Trenutak 2 …

Niti:

ETF Beograd::Multiprocesorski sistemi 81/166

Page 82: Multiprocesorski sistemi Compute Unified ... - mups.etf.rsmups.etf.rs/vezbe/MPS - CUDA.pdf · Uvod u GPU računarstvo (1) Grafički procesori (Graphics Processing Unit, GPU) su prvobitno

Pristup memoriji u transakcijama (3)

Postoji kombinovanje u transakciju: Niti pristupaju

uzastopnim lokacijama u svakom trenutku

Coalesced access

M2,0

M1,1

M1,0M0,0

M0,1

M3,0

M2,1 M3,1

M1,2M0,2 M2,2 M3,2

M1,3M0,3 M2,3 M3,3

Smer pristupa

u kodu jegra

M2,0M1,0M0,0 M3,0 M1,1M0,1 M2,1 M3,1 M1,2M0,2 M2,2 M3,2 M1,3M0,3 M2,3 M3,3

M

T1 T2 T3 T4

Time Period 1

T1 T2 T3 T4

Time Period 2…

Niti:

ETF Beograd::Multiprocesorski sistemi 82/166

Page 83: Multiprocesorski sistemi Compute Unified ... - mups.etf.rsmups.etf.rs/vezbe/MPS - CUDA.pdf · Uvod u GPU računarstvo (1) Grafički procesori (Graphics Processing Unit, GPU) su prvobitno

Konstantna memorija

Region konstantne memorije se nalazi u DRAM-u Međutim, pristup konstantnoj memoriji je

keširan radi bržeg pristupa

Svaki SM ima svoj L1 keš

Pojedinačna vrednost iz konstantne memorije može biti objavljena svim nitima unutar warp-a Broadcast mehanizam

Efikasan način za pristup vrednosti koja je zajednička za sve niti unutar bloka

Pogodno koristiti kada god pristup podacima podrazumeva samo čitanje

I$L1

MultithreadedInstruction Buffer

RF

C$L1

SharedMem

Operand Select

MAD SFU

ETF Beograd::Multiprocesorski sistemi 83/166

Page 84: Multiprocesorski sistemi Compute Unified ... - mups.etf.rsmups.etf.rs/vezbe/MPS - CUDA.pdf · Uvod u GPU računarstvo (1) Grafički procesori (Graphics Processing Unit, GPU) su prvobitno

Za efikasno deljenje podataka na nivou bloka niti može se koristiti deljena memorija

Omogućava veliku uštedu memorijskog propusnog opsega

Nalazi se na čipu svakog SM-a

Efikasan pristup, 3-4 ciklusa procesora

DRAM

ALU

Shared

memory

Control

CacheALU ALU ...

d0 d1 d2 d3

d0 d1 d2 d3

ALU

Shared

memory

Control

CacheALU ALU ...

d4 d5 d6 d7

d4 d5 d6 d7

ETF Beograd::Multiprocesorski sistemi

Deljena memorija (1)

84/166

Page 85: Multiprocesorski sistemi Compute Unified ... - mups.etf.rsmups.etf.rs/vezbe/MPS - CUDA.pdf · Uvod u GPU računarstvo (1) Grafički procesori (Graphics Processing Unit, GPU) su prvobitno

Deljena memorija (2)

Deljena memorija se može smatrati kao neka vrsta keša upravljanog od strane korisnika User managed cache/scratchpad

Svaki SM ima ograničenu veličinu deljene morije Tesla arhitektura – 16KB

Novije arhitekture do 64KB

Deljena memorija je podeljena u 16 banki sastavljenih od 32bitnih reči Niti iz istog bloka mogu slobodno

da čitaju i pišu

I$L1

MultithreadedInstruction Buffer

RF

C$L1

SharedMem

Operand Select

MAD SFU

ETF Beograd::Multiprocesorski sistemi 85/166

Page 86: Multiprocesorski sistemi Compute Unified ... - mups.etf.rsmups.etf.rs/vezbe/MPS - CUDA.pdf · Uvod u GPU računarstvo (1) Grafički procesori (Graphics Processing Unit, GPU) su prvobitno

Deljena memorija (3)

Pristup deljenoj memoriji će biti brz skoro kao pristup registrima, ukoliko nema konflikata prilikom pristupa memorijskim bankama

Brz pristup deljenoj memoriji: Ako sve niti iz warp-a pristupaju različitim memorijskim bankama,

nema konflikta Ako sve niti iz warp-a pristupaju istoj adresi, nema konflikta

Koristi se broadcast mehanizam

Spor pristup deljenoj memoriji: Konlikt prilikom pristupa se dešava kada više niti iz warp-a

pristupaju istoj memorijskoj banci Ne nužno i istoj lokaciji

Pristupi se tada serijalizuju

ETF Beograd::Multiprocesorski sistemi 86/166

Page 87: Multiprocesorski sistemi Compute Unified ... - mups.etf.rsmups.etf.rs/vezbe/MPS - CUDA.pdf · Uvod u GPU računarstvo (1) Grafički procesori (Graphics Processing Unit, GPU) su prvobitno

Deljena memorija (4)

Deljena memorija se unutar jezgra zadaje ključnom rečju __shared__

Može se zadati eksplicitno (statički)__shared__ float DynamicSharedMem[BLOCK_SIZE];

Može se specificirati prilikom poziva jezgra unutar izvršne konfiguracije Takva memorija se alocira u promenljive deklarisane kaoextern __shared__ float DynamicSharedMem[];

Primer pozivanja takvog jezgra:

__global__ void KernelFunc(...);

...

size_t SharedMemBytes = 64; // 64 bytes of shared memory

KernelFunc<<< DimGrid, DimBlock, SharedMemBytes >>>(...);

ETF Beograd::Multiprocesorski sistemi 87/166

Page 88: Multiprocesorski sistemi Compute Unified ... - mups.etf.rsmups.etf.rs/vezbe/MPS - CUDA.pdf · Uvod u GPU računarstvo (1) Grafički procesori (Graphics Processing Unit, GPU) su prvobitno

Tipična strategija programiranja

Globalna memorija se nalazi u memoriji uređaja (DRAM) Mnogo sporiji pristup nego kod deljene memorije

Uobičajena strategija za sprovođenje izračunavanja podrazumeva podelu podataka na podblokove (tiles) Koristi se prednost brze deljene memorije

Podaci se dele na podblokove koji mogu da stanu u deljenu memoriju

Svaki podblok se obrađuje jednim blokom niti

Podblok se učitava iz globalne u deljenu memoriju od strane niti iz bloka, kako bi se omogućilo kombinovano čitanje

Vrši se obrada podbloka u deljenoj memoriji

Svaka nit može efikasno da pristupi svakom podatku iz podbloka

Rezultati se kopiraju nazad iz deljene memorije u globalnu

ETF Beograd::Multiprocesorski sistemi 88/166

Page 89: Multiprocesorski sistemi Compute Unified ... - mups.etf.rsmups.etf.rs/vezbe/MPS - CUDA.pdf · Uvod u GPU računarstvo (1) Grafički procesori (Graphics Processing Unit, GPU) su prvobitno

Množenje matrica - podsetnik

Jezgro:__global__ void MatrixMulKernel

(float* Md, float* Nd, float* Pd, int Width) {

// Calculate the row index of the Pd element and M

int Row = blockIdx.y * TILE_WIDTH + threadIdx.y;

// Calculate the column index of Pd and N

int Col = blockIdx.x * TILE_WIDTH + threadIdx.x;

float Pvalue = 0;

// Each thread computes one element of the block submatrix

for (int k = 0; k < Width; ++k)

Pvalue += Md[Row * Width + k] * Nd[k * Width + Col];

Pd[Row * Width + Col] = Pvalue;

}

ETF Beograd::Multiprocesorski sistemiETF Beograd::Multiprocesorski sistemi 89/166

Page 90: Multiprocesorski sistemi Compute Unified ... - mups.etf.rsmups.etf.rs/vezbe/MPS - CUDA.pdf · Uvod u GPU računarstvo (1) Grafički procesori (Graphics Processing Unit, GPU) su prvobitno

Množenje matrica – deljena memorija (1)

Svaki ulazni element će biti učitan WIDTH puta Svaka nit će pristupati WIDTH puta

elementima matrica M i N

Ideja je da se svaki element učita u deljenu memoriju Više niti će koristiti lokalnu verziju podatka

da uštede propusni opseg memorije

90

M

N

P

WID

TH

WID

TH

WIDTH WIDTH

ty

tx

ETF Beograd::Multiprocesorski sistemi 90/166

Page 91: Multiprocesorski sistemi Compute Unified ... - mups.etf.rsmups.etf.rs/vezbe/MPS - CUDA.pdf · Uvod u GPU računarstvo (1) Grafički procesori (Graphics Processing Unit, GPU) su prvobitno

Množenje matrica –deljena memorija (2)

Izvršavanje jezgra se deli na faze

Pristup podacima u jednoj fazi se odvija na nivou jednog podbloka matrica Md i Nd

WID

TH

ETF Beograd::Multiprocesorski sistemi

91

Md

Nd

Pd

Pdsub

TILE_WIDTH

WIDTHWIDTH

TILE_WIDTHTILE_WIDTH

bx

tx01 TILE_WIDTH-12

0 1 2

byty

210

TILE_WIDTH-1

2

1

0

TIL

E_

WID

TH

TIL

E_

WID

TH

TIL

E_

WID

TH

E

WID

TH

WID

TH

ETF Beograd::Multiprocesorski sistemi 91/166

Page 92: Multiprocesorski sistemi Compute Unified ... - mups.etf.rsmups.etf.rs/vezbe/MPS - CUDA.pdf · Uvod u GPU računarstvo (1) Grafički procesori (Graphics Processing Unit, GPU) su prvobitno

Množenje matrica – deljena memorija (3)

Primer izračunavanja jednog podbloka rezultujuće matrice

Matrica dimenzija 4x4

Podblokovi dimenzija 2x2

Pd1,0Md2,0

Md1,1

Md1,0Md0,0

Md0,1

Md3,0

Md2,1

Pd0,0

Md3,1 Pd0,1

Pd2,0Pd3,0

Nd0,3Nd1,3

Nd1,2

Nd1,1

Nd1,0Nd0,0

Nd0,1

Nd0,2

Pd1,1

Pd0,2 Pd2,2Pd3,2Pd1,2

Pd3,1Pd2,1

Pd0,3 Pd2,3Pd3,3Pd1,3

ETF Beograd::Multiprocesorski sistemi 92/166

Page 93: Multiprocesorski sistemi Compute Unified ... - mups.etf.rsmups.etf.rs/vezbe/MPS - CUDA.pdf · Uvod u GPU računarstvo (1) Grafički procesori (Graphics Processing Unit, GPU) su prvobitno

Množenje matrica – deljena memorija (4)

Svaki element matrica Md i Nd se koristi tačno dva puta prilikom izračunavanja podbloka matrice Pd

P0,0

thread0,0

P1,0

thread1,0

P0,1

thread0,1

P1,1

thread1,1

M0,0 * N0,0 M0,0 * N1,0 M0,1 * N0,0 M0,1 * N1,0

M1,0 * N0,1 M1,0 * N1,1 M1,1 * N0,1 M1,1 * N1,1

M2,0 * N0,2 M2,0 * N1,2 M2,1 * N0,2 M2,1 * N1,2

M3,0 * N0,3 M3,0 * N1,3 M3,1 * N0,3 M3,1 * N1,3

Redosled

pristupa

ETF Beograd::Multiprocesorski sistemi 93/166

Page 94: Multiprocesorski sistemi Compute Unified ... - mups.etf.rsmups.etf.rs/vezbe/MPS - CUDA.pdf · Uvod u GPU računarstvo (1) Grafički procesori (Graphics Processing Unit, GPU) su prvobitno

Množenje matrica – deljena memorija (4)

Izračunavanje matrice se deli na faze

Najpre se podblokovi matrica Md i Nd učitaju u deljenu memoriju

Zatim se izračuna deo podbloka matrice Pd

Svaka faza koristi jedan deo

Pd1,0Md2,0

Md1,1

Md1,0Md0,0

Md0,1

Md3,0

Md2,1

Pd0,0

Md3,1 Pd0,1

Pd2,0Pd3,0

Nd0,3Nd1,3

Nd1,2

Nd1,1

Nd1,0Nd0,0

Nd0,1

Nd0,2

Pd1,1

Pd0,2 Pd2,2Pd3,2Pd1,2

Pd3,1Pd2,1

Pd0,3 Pd2,3Pd3,3Pd1,3

ETF Beograd::Multiprocesorski sistemi 94/166

Page 95: Multiprocesorski sistemi Compute Unified ... - mups.etf.rsmups.etf.rs/vezbe/MPS - CUDA.pdf · Uvod u GPU računarstvo (1) Grafički procesori (Graphics Processing Unit, GPU) su prvobitno

Množenje matrica – deljena memorija (5)

Faza 1 Faza 2

T0,0 Md0,0

↓ Mds0,0

Nd0,0

Nds0,0

PValue0,0 += Mds0,0*Nds0,0 + Mds1,0*Nds0,1

Md2,0

Mds0,0

Nd0,2

Nds0,0

PValue0,0 += Mds0,0*Nds0,0 + Mds1,0*Nds0,1

T1,0 Md1,0

↓ Mds1,0

Nd1,0

Nds1,0

PValue1,0 += Mds0,0*Nds1,0 + Mds1,0*Nds1,1

Md3,0

Mds1,0

Nd1,2

Nds1,0

PValue1,0 += Mds0,0*Nds1,0 + Mds1,0*Nds1,1

T0,1 Md0,1

↓ Mds0,1

Nd0,1

Nds0,1

PdValue0,1 += Mds0,1*Nds0,0 + Mds1,1*Nds0,1

Md2,1

Mds0,1

Nd0,3

Nds0,1

PdValue0,1 += Mds0,1*Nds0,0 + Mds1,1*Nds0,1

T1,1 Md1,1

↓ Mds1,1

Nd1,1

Nds1,1

PdValue1,1 += Mds0,1*Nds1,0 + Mds1,1*Nds1,1

Md3,1

Mds1,1

Nd1,3

Nds1,1

PdValue1,1 += Mds0,1*Nds1,0 + Mds1,1*Nds1,1

vremeETF Beograd::Multiprocesorski sistemi 95/166

Page 96: Multiprocesorski sistemi Compute Unified ... - mups.etf.rsmups.etf.rs/vezbe/MPS - CUDA.pdf · Uvod u GPU računarstvo (1) Grafički procesori (Graphics Processing Unit, GPU) su prvobitno

Sinhronizacija na barijeri

Sinhronizacija na barijeri je moguća samo na nivou bloka niti

Koristi se API funkcija __syncthreads()

Može biti pozvana samo unutar jezgra

Jednom kada sve niti dostignu sinhronizacionu tačku, izvršavanje se nastavlja normalno

Poziv treba koristiti da bi se izbegli RAW / WAR / WAW hazardi pristupa deljenoj ili globalnoj memoriji

Koristi se često u “tiled” algoritmima:

Obezbeđuje da svi elementi podbloka budu učitani

Obezbeđuje da svi elementi podbloka budu konzumirani pre naredne faze algoritma

Mora se pažljivo koristiti unutar uslovnih grananja

Sve niti unutar bloka moraju izvršavati istu granu

ETF Beograd::Multiprocesorski sistemi 96/166

Page 97: Multiprocesorski sistemi Compute Unified ... - mups.etf.rsmups.etf.rs/vezbe/MPS - CUDA.pdf · Uvod u GPU računarstvo (1) Grafički procesori (Graphics Processing Unit, GPU) su prvobitno

Množenje matrica – deljena memorija (6)

Kompletan kod:

// Setup the execution configuration

dim3 dimBlock(TILE_WIDTH, TILE_WIDTH);

dim3 dimGrid(Width / TILE_WIDTH, Width / TILE_WIDTH);

// Launch the device computation threads!

MatrixMulKernel<<<dimGrid, dimBlock>>> (Md, Nd, Pd, Width);

ETF Beograd::Multiprocesorski sistemi 97/166

Page 98: Multiprocesorski sistemi Compute Unified ... - mups.etf.rsmups.etf.rs/vezbe/MPS - CUDA.pdf · Uvod u GPU računarstvo (1) Grafički procesori (Graphics Processing Unit, GPU) su prvobitno

Množenje matrica – deljena memorija (7)

__global__ void MatrixMulKernel

(float* Md, float* Nd, float* Pd, int Width) {

__shared__float Mds[TILE_WIDTH][TILE_WIDTH];

__shared__float Nds[TILE_WIDTH][TILE_WIDTH];

int bx = blockIdx.x; int by = blockIdx.y;

int tx = threadIdx.x; int ty = threadIdx.y;

//Identify the row and column of the

//Pd element to work on

int Row = by * TILE_WIDTH + ty;

int Col = bx * TILE_WIDTH + tx;

float Pvalue = 0;

ETF Beograd::Multiprocesorski sistemi 98/166

Page 99: Multiprocesorski sistemi Compute Unified ... - mups.etf.rsmups.etf.rs/vezbe/MPS - CUDA.pdf · Uvod u GPU računarstvo (1) Grafički procesori (Graphics Processing Unit, GPU) su prvobitno

Množenje matrica – deljena memorija (8)

// Loop over the Md and Nd tiles required to compute

//the Pd element

for (int m = 0; m < Width/TILE_WIDTH; ++m) {

// Coolaborative loading of Md and Nd tiles

// into shared memory

Mds[ty][tx] = Md[Row*Width + (m*TILE_WIDTH + tx)];

Nds[ty][tx] = Nd[Col + (m*TILE_WIDTH + ty)*Width];

__syncthreads();

for (int k = 0; k < TILE_WIDTH; ++k)

Pvalue += Mds[ty][k] * Nds[k][tx];

__syncthreads();

}

Pd[Row*Width+Col] = Pvalue;

}

ETF Beograd::Multiprocesorski sistemi 99/166

Page 100: Multiprocesorski sistemi Compute Unified ... - mups.etf.rsmups.etf.rs/vezbe/MPS - CUDA.pdf · Uvod u GPU računarstvo (1) Grafički procesori (Graphics Processing Unit, GPU) su prvobitno

Množenje matrica –deljena memorija (9)

Svaki blok niti računa jednu kvadratnu podmatricu Pdsub

veličine TILE_WIDTH

Svaka nit računa jedan element podmatrice Pdsub

Md

Nd

Pd

Pdsub

TILE_WIDTH

WIDTHWIDTH

TILE_WIDTHTILE_WIDTH

bx

tx01 TILE_WIDTH-12

0 1 2

byty

210

TILE_WIDTH-1

2

1

0

TIL

E_

WID

TH

TIL

E_

WID

TH

TIL

E_

WID

TH

E

WID

TH

WID

TH

m

kbx

by

k

m

ETF Beograd::Multiprocesorski sistemi 100/166

Page 101: Multiprocesorski sistemi Compute Unified ... - mups.etf.rsmups.etf.rs/vezbe/MPS - CUDA.pdf · Uvod u GPU računarstvo (1) Grafički procesori (Graphics Processing Unit, GPU) su prvobitno

Množenje matrica – performanse (1)

Prednosti korišćenja deljene memorije: Svaki blok niti treba da ima veliki broj niti TILE_WIDTH ne bi trebalo da bude manje od 16

16 x 16 = 256 niti po bloku

Treba da bude veliki broj blokova niti Rezultujuća matrica veličine 1024 x 1024 daje

64 x 64 = 4096 blokova niti

U takvom slučaju, svaki blok niti radi 2 x 256 = 512 pristupa (čitanja) iz globalne memorije

Zatim se vrši 256 x (2 x 16) = 8192 operacija množenja i sabiranja

U takvom slučaju memorijski propusni opseg više nije limitirajući faktor Broja računskih operacija mnogo veći od broja pristupa memoriji 8192 >> 512

ETF Beograd::Multiprocesorski sistemi 101/166

Page 102: Multiprocesorski sistemi Compute Unified ... - mups.etf.rsmups.etf.rs/vezbe/MPS - CUDA.pdf · Uvod u GPU računarstvo (1) Grafički procesori (Graphics Processing Unit, GPU) su prvobitno

Množenje matrica – performanse (2)

Svaki SM na G80 procesoru ima 16KB deljene memorije: Veličina zavisna od arhitekture Za TILE_WIDTH = 16, svaki blok niti koristi 2 x 256 x 4B = 2KB

deljene memorije Potencijalno 8 blokova niti se može izvršavati istovremeno

Ovo omogućava 8 x 2 x 256 = 4096 čitanja 2 po jednoj niti, 256 niti po jednom bloku

Sledeća veličina TILE_WIDTH = 32 bi zahtevala 2 x 32 x 32 x 4B= 8KB deljene memorije po bloku niti, dozvoljavajući izvršavanje samo dva bloka niti istovremeno

Koristeći dimenziju podbloka 16 x 16, broj pristupa globalnoj memoriji se smanjuje 16 puta Maksimalni propusni opseg je 86.4B/s Sada može da podrži (86.4/4)*16 = 347.6 GFLOPS!

ETF Beograd::Multiprocesorski sistemi 102/166

Page 103: Multiprocesorski sistemi Compute Unified ... - mups.etf.rsmups.etf.rs/vezbe/MPS - CUDA.pdf · Uvod u GPU računarstvo (1) Grafički procesori (Graphics Processing Unit, GPU) su prvobitno

Množenje matrica – performanse (3)G

FL

OP

S

0

10

20

30

40

50

60

70

80

90

100

tile

d

on

ly

tile

d &

un

rolle

d

tile

d

on

ly

tile

d &

un

rolle

d

tile

d

on

ly

tile

d &

un

rolle

d

tile

d

on

ly

tile

d &

un

rolle

d

no t tiled 4x4 tile s 8x8 tile s 1 2x1 2 tile s 1 6 x1 6 tile s

ETF Beograd::Multiprocesorski sistemi 103/166

Page 104: Multiprocesorski sistemi Compute Unified ... - mups.etf.rsmups.etf.rs/vezbe/MPS - CUDA.pdf · Uvod u GPU računarstvo (1) Grafički procesori (Graphics Processing Unit, GPU) su prvobitno

CUDA izvršni (runtime) API pruža razne mogućnosti za upravljanje uređajem i izvršavanjem programa

Postoje funkcije za: Upravljanje uređajem

Sa podrškom za više grafičkih procesora na jednom sistemu(Multi-GPU)

Upravljanje memorijom Upravljanje teksturama Saradnju sa OpenGL i DirectX API Upravljanje greškama Upravljanje događajima

CUDA sistem se automatski inicijalizuje kada se prvi put pozove neka funkcionalnost

ETF Beograd::Multiprocesorski sistemi

Dodatne CUDA API funkcionalnosti

104/166

Page 105: Multiprocesorski sistemi Compute Unified ... - mups.etf.rsmups.etf.rs/vezbe/MPS - CUDA.pdf · Uvod u GPU računarstvo (1) Grafički procesori (Graphics Processing Unit, GPU) su prvobitno

Upravljanje uređajem je omogućeno putem odgovarajućih funkcija Dohvatanje ukupnog broja uređaja u sistemu

cudaGetDeviceCount()

Dohvatanje karakteristika uređaja cudaGetDeviceProperties()

Izbor uređaja: Eksplicitno postavljanje aktivnog uređaja

cudaSetDevice()

Izbor uređaja koji najbolje zadovoljava zadate uslove cudaChooseDevice()

ETF Beograd::Multiprocesorski sistemi

Upravljanje uređajem

105/166

Page 106: Multiprocesorski sistemi Compute Unified ... - mups.etf.rsmups.etf.rs/vezbe/MPS - CUDA.pdf · Uvod u GPU računarstvo (1) Grafički procesori (Graphics Processing Unit, GPU) su prvobitno

Upravljanje memorijom (1)

Dva tipa memorijskih objekata Linearna memorija

Pristupa joj se pomoću 32-bitnih pokazivača

CUDA nizovi Specifični, netransparentni objekti koji se koriste za smeštanje i

čitanje tekstura

Alokacija memorije na uređaju Linearna memorija (1D) cudaMalloc(), cudaFree()

Linearna memorija sa padding-om (2D, 3D)cudaMallocPitch(), cudaMalloc3D Parametar pitch govori o načinu poravnanja nizova u memoriji

kako bi se zadovoljili uslovi sa kombinovani/sjedinjeni pristup

Alokacija CUDA nizova cudaMallocArray(), cudaFreeArray()

ETF Beograd::Multiprocesorski sistemi 106/166

Page 107: Multiprocesorski sistemi Compute Unified ... - mups.etf.rsmups.etf.rs/vezbe/MPS - CUDA.pdf · Uvod u GPU računarstvo (1) Grafički procesori (Graphics Processing Unit, GPU) su prvobitno

Upravljanje memorijom (2)

Alokacija page-locked memorije

Brži pristup kada se ne dozvoljava zamena stranicacudaHostAlloc(), cudaMallocHost(), cudaFreeHost()

Memorijski transferi sa domaćina na uređaj, uređaja na domaćina i unutar samog uređaja

Sinhorni i asinhroni transferi

Asinhrone funkcije nastavak Async u imenu

cudaMemcpy(), cudaMemcpy2D(), cudaMemcpyToArray(), cudaMemcpyFromArray(), cudaMemcpyToSymbol(), cudaMemcpyFromSymbol()

Dohvatanje adrese simbolacudaGetSymbolAddress()

ETF Beograd::Multiprocesorski sistemi 107/166

Page 108: Multiprocesorski sistemi Compute Unified ... - mups.etf.rsmups.etf.rs/vezbe/MPS - CUDA.pdf · Uvod u GPU računarstvo (1) Grafički procesori (Graphics Processing Unit, GPU) su prvobitno

Upravljanje teksturama

Teksture se na CUDA mogu vezati za: CUDA nizove

Optimizovan pristup

1D linearnu memoriju, uz ograničenja

Funkcije za rad sa teksturama:cudaBindTexture(), cudaUnbindTexture()

Teksturama se pristupa pomoću posebne hardverske jedinice i ugrađenih funkcija jezgra tex1D(), tex2D(), tex3D()float u, v; // Coordinates

float4 value = tex2D(myTexRef, u, v);

ETF Beograd::Multiprocesorski sistemi 108/166

Page 109: Multiprocesorski sistemi Compute Unified ... - mups.etf.rsmups.etf.rs/vezbe/MPS - CUDA.pdf · Uvod u GPU računarstvo (1) Grafički procesori (Graphics Processing Unit, GPU) su prvobitno

Saradnja sa drugim API

CUDA može da sarađuje sa OpenGL i DirectX (Direct3D) API

OpenGL Direct3D baferi se mogu direktno mapirati u CUDA adresni prostor Podaci se mogu čitati i obrađivati

Podaci se mogu upisati i proslediti dalje na obradu

Funkcije:cudaGLMapBufferObject(),

cudaGLUnmapBufferObject()

cudaD3D9MapVertexBuffer(),

cudaD3D9UnmapVertexBuffer()

ETF Beograd::Multiprocesorski sistemi 109/166

Page 110: Multiprocesorski sistemi Compute Unified ... - mups.etf.rsmups.etf.rs/vezbe/MPS - CUDA.pdf · Uvod u GPU računarstvo (1) Grafički procesori (Graphics Processing Unit, GPU) su prvobitno

Upravljanje greškama

Sve funkcije koje su deo CUDA runtime vraćaju strukturu cudaError_t sa opisom greške

Postoji oko 25 različitih kodova grešaka

Poslednji kod greške koji je proizveo neki od poziva se može dobiti sa: cudaGetLastError()

Greške asinhronih poziva se dohvataju ovom funkcijom ili prilikom poziva neke druge CUDA funkcije

String koji opisuje odgovarajuću grešku se može dobiti pozivom: cudaGetErrorString()

ETF Beograd::Multiprocesorski sistemi 110/166

Page 111: Multiprocesorski sistemi Compute Unified ... - mups.etf.rsmups.etf.rs/vezbe/MPS - CUDA.pdf · Uvod u GPU računarstvo (1) Grafički procesori (Graphics Processing Unit, GPU) su prvobitno

Konkurentno izvršavanje

Kako bi se omogućilo konkurentno izvršavanje i na domaćinu i na uređaju, određeni broj poziva je asinhron

Pozivi jezgru

Memorijski transferi unutar uređaja

Memorijski transferi označeni Async funkcijama

Po potrebi, sinhronizacija se može obaviti funkcijama:cudaDeviceSynchronize(), cudaThreadSynchronize()

Takođe, konkurentnost se može postići:

Preklapanjem memorijskih transfera i izvršavanja jezgra korišćenjem koncepta tokova (streams)

Paralelnim izvršavanjem jezgara na uređajima koji to dozvoljavaju (Fermi arhitektura)

ETF Beograd::Multiprocesorski sistemi 111/166

Page 112: Multiprocesorski sistemi Compute Unified ... - mups.etf.rsmups.etf.rs/vezbe/MPS - CUDA.pdf · Uvod u GPU računarstvo (1) Grafički procesori (Graphics Processing Unit, GPU) su prvobitno

Upravljanje događajima

CUDA podržava koncept događaja

Koriste se za praćenje napretka asinhronih događaja

Događaj se beleži onda kada se izvrše sve komande zadate tokom komandi

Događaji se predstavalju tipom cudaEvent_t,

a koriste se funkcije: cudaEventCreate(), cudaEventRecord(), cudaEventSynchronize(), cudaEventElapsedTime(), cudaEventDestroy()

Vreme na uređaju se može meriti pomoću funkcija koje rade sa CUDA događajima

Koriste se precizni GPU tajmeri

ETF Beograd::Multiprocesorski sistemi 112/166

Page 113: Multiprocesorski sistemi Compute Unified ... - mups.etf.rsmups.etf.rs/vezbe/MPS - CUDA.pdf · Uvod u GPU računarstvo (1) Grafički procesori (Graphics Processing Unit, GPU) su prvobitno

CUDA biblioteke (1)

CUBLAS CUDA Basic Linear Algebra Subprograms (BLAS) Implementacija BLAS standarda na CUDA Kompatibilna sa FORTRAN aplikacijama Uključuje se zaglavljem cublas.h

CUFFT CUDA Fast Fourier Transform (FFT) Uključuje implementaciju najvažnijih i najkorišćenijih CUDA

algoritama Uključuje se zaglavljem cufft.h

CURAND Implementira generisanje slučajnih brojeva na uređaju Uključuje se zaglavljem curand.h i curand_kernel.h

ETF Beograd::Multiprocesorski sistemi 113/166

Page 114: Multiprocesorski sistemi Compute Unified ... - mups.etf.rsmups.etf.rs/vezbe/MPS - CUDA.pdf · Uvod u GPU računarstvo (1) Grafički procesori (Graphics Processing Unit, GPU) su prvobitno

CUDA biblioteke (2)

NVIDIA Performance Primitives (NPP)

Implementira veliki broj gotovih algoritama za obradu slike i video signala

CUSPARSE

Implementira algoritme za rad sa retkim matricama

Thrust biblioteka

Thrust je biblioteka CUDA šablona za C++ bazirana na Standard Template Library (STL).

Thrust dozvoljavam programeru da implementira HPC aplikacije sa minimalnim programerskim naporom

Implementiran je API visokog nivoa

Memorijski transferi su sakriveni od korisnika i sl.

ETF Beograd::Multiprocesorski sistemi 114/166

Page 115: Multiprocesorski sistemi Compute Unified ... - mups.etf.rsmups.etf.rs/vezbe/MPS - CUDA.pdf · Uvod u GPU računarstvo (1) Grafički procesori (Graphics Processing Unit, GPU) su prvobitno

Multiprocesorski sistemi

Paralelni algoritmi na CUDA

Page 116: Multiprocesorski sistemi Compute Unified ... - mups.etf.rsmups.etf.rs/vezbe/MPS - CUDA.pdf · Uvod u GPU računarstvo (1) Grafički procesori (Graphics Processing Unit, GPU) su prvobitno

Paralelni algoritmi na grafičkom procesoru (1)

Grafički procesor je data-parallel orijentisan Vise hiljada niti se izvršava u paraleli

Vise hiljada elemenata se obrađuje

Sve podatke obrađuje isti program

SPMD model izvršavanja

Kontrast u odnosu na task-parallel model i paralelizam na nivou instrukcije (ILP)

Način razmišljanja mora biti drugačiji i orijentisan ka podacima: Algoritmi se moraju dizajnirati za paralelizam na nivou podataka

Potrebno je koristiti data-parallel primitive kao gradivne elemente za efikasno programiranje

Potrebno je razumeti složenost paralelnih algoritama

ETF Beograd::Multiprocesorski sistemi 116/166

Page 117: Multiprocesorski sistemi Compute Unified ... - mups.etf.rsmups.etf.rs/vezbe/MPS - CUDA.pdf · Uvod u GPU računarstvo (1) Grafički procesori (Graphics Processing Unit, GPU) su prvobitno

Paralelni algoritmi na grafičkom procesoru (2)

Ključni koraci u paralelnom programiranju:

Pronaći konkurentnost u problemu

Strukturirati algoritam tako da se konkurentnost prevede u performanse

Implementirati algoritam u pogodonom programskom okruženju

Izvršiti program i podesiti performanse koda na stvarnom paralelnom sistemu

Na žalost, ovi koraci nisu podeljeni u nivoe apstrakcije kojima bi mogli da se bavimo nezavisno jednim od drugih

ETF Beograd::Multiprocesorski sistemi 117/166

Page 118: Multiprocesorski sistemi Compute Unified ... - mups.etf.rsmups.etf.rs/vezbe/MPS - CUDA.pdf · Uvod u GPU računarstvo (1) Grafički procesori (Graphics Processing Unit, GPU) su prvobitno

Problemi paralelnih algoritama

Performanse mogu biti drastično umanjeno zbog velikog broja faktora:

Režijskog vremena potrebnog za sprovođenje paralelnog procesiranja

Disbalansa u opterećenju među procesnim elementima

Neefikasnim obrascima deljenja podataka

Zasićenja kritičnih resursa

Kao što je memorijski propusni opseg

Pronalaženje i iskorišćavanje paralelizma često zahteva razmatranje problema iz ugla koji nije očigledan na prvi pogled

“Computational thinking”

ETF Beograd::Multiprocesorski sistemi 118/166

Page 119: Multiprocesorski sistemi Compute Unified ... - mups.etf.rsmups.etf.rs/vezbe/MPS - CUDA.pdf · Uvod u GPU računarstvo (1) Grafički procesori (Graphics Processing Unit, GPU) su prvobitno

Paralelni algoritmi na GPU (1)

Tipična operacija koja se javlja u paralelnim algoritmima je operacija redukcije Redukcija prodrazumeva svođenje niza vrednosti

na jednu skalarnu vrednost

Računanje zbira, proizvoda, makismuma, minimuma, logičko I/ILI nad svim elementima strukture i sl.

Podrazumeva se da je operator koji se upotrebljava u redukciji asocijativan Tehnički, to ne mora biti tačno za aritmetiku u pokretnom zarezu

Radukcije se koriste u velikom broju primena, mada ne obavezno u paralelnoj formi Kod množenja matrice, pojedinačna nit je vršila redukciju

prilikom računanja skalarnog proizvoda vrste i kolone matrice

ETF Beograd::Multiprocesorski sistemi 119/166

Page 120: Multiprocesorski sistemi Compute Unified ... - mups.etf.rsmups.etf.rs/vezbe/MPS - CUDA.pdf · Uvod u GPU računarstvo (1) Grafički procesori (Graphics Processing Unit, GPU) su prvobitno

Paralelna redukcija (1)

Neefikasan način da se ovo obavi predstavlja sledeći kod:

Nit 0 sabira elemente sekvencijalno

Ostale niti ne rade ništa

if (threadID == 0) {

float sum = 0;

for (int t = 0; t < n; ++t)

sum += array[t];

}

ETF Beograd::Multiprocesorski sistemi 120/166

Page 121: Multiprocesorski sistemi Compute Unified ... - mups.etf.rsmups.etf.rs/vezbe/MPS - CUDA.pdf · Uvod u GPU računarstvo (1) Grafički procesori (Graphics Processing Unit, GPU) su prvobitno

Paralelna redukcija (2)

Da bismo izvršili redukciju u paraleli, možemo koristiti princip stabla

Redukcija N elemenata će biti izvršena od strane N/2 niti

4 7 5 9

11 14

25

3 1 7 0 4 1 6 3

ETF Beograd::Multiprocesorski sistemi 121/166

Page 122: Multiprocesorski sistemi Compute Unified ... - mups.etf.rsmups.etf.rs/vezbe/MPS - CUDA.pdf · Uvod u GPU računarstvo (1) Grafički procesori (Graphics Processing Unit, GPU) su prvobitno

Paralelna redukcija (3)

Primer sumiranja elemenata vektora

Pretpostavimo da se vektor nalazi u globalnoj memoriji uređaja

Koristi se deljena memorija za smeštanje međurezultata

U svakoj iteraciji dobija se vektor parcijalnih suma

U svakom koraku smo bliži konačnom rezultatu

Finalni rezultat se smešta u element 0 u deljenoj memoriji

ETF Beograd::Multiprocesorski sistemi 122/166

Page 123: Multiprocesorski sistemi Compute Unified ... - mups.etf.rsmups.etf.rs/vezbe/MPS - CUDA.pdf · Uvod u GPU računarstvo (1) Grafički procesori (Graphics Processing Unit, GPU) su prvobitno

0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15

10 1 8 -1 0 -2 3 5 -2 -3 2 7 0 11 0 2

Indeksi

Vrednosti

0 1 2 3 4 5 6 7

11 1 7 -1 -2 -2 8 5 -5 -3 9 7 11 11 2 2Vrednosti

0 1 2 3

18 1 7 -1 6 -2 8 5 4 -3 9 7 13 11 2 2Vrednosti

0 1

24 1 7 -1 6 -2 8 5 17 -3 9 7 13 11 2 2Vrednosti

0

41 1 7 -1 6 -2 8 5 17 -3 9 7 13 11 2 2Vrednosti

Nit IDKorak 1

Pomeraj 1

Korak 2

Pomeraj 2

Korak 3

Pomeraj 4

Korak 4

Pomeraj 8

Nit ID

Nit ID

Nit ID

ETF Beograd::Multiprocesorski sistemi

Paralelna redukcija (4)

123/166

Page 124: Multiprocesorski sistemi Compute Unified ... - mups.etf.rsmups.etf.rs/vezbe/MPS - CUDA.pdf · Uvod u GPU računarstvo (1) Grafički procesori (Graphics Processing Unit, GPU) su prvobitno

Složenost paralelne redukcije

Redukcija se obavlja u log(N) paralelnih koraka

U svakom koraku S, izvršava se N/2S paralelnih operacija

Za N=2D, izvršava se S[1..D]2D-S = N-1 operacija

Algoritam je efikasan, jer ne izvršava više operacija nego sekvencijalna redukcija

Sa P niti fizički u paraleli, vremenska složenost je O(N/P + log N) u poređenju sa O(N) za sekvencijalnu redukciju

ETF Beograd::Multiprocesorski sistemi 124/166

Page 125: Multiprocesorski sistemi Compute Unified ... - mups.etf.rsmups.etf.rs/vezbe/MPS - CUDA.pdf · Uvod u GPU računarstvo (1) Grafički procesori (Graphics Processing Unit, GPU) su prvobitno

Loša paralelna redukcija (1)

__global__ void reduce(int *g_idata, int *g_odata) {

extern __shared__ int sdata[];

// Load shared mem

unsigned int tid = threadIdx.x;

unsigned int i = blockIdx.x * blockDim.x + threadIdx.x;

sdata[tid] = g_idata[i];

// Do reduction in shared memory

for (unsigned int stride = 1; s < blockDim.x; s *= 2) {

__syncthreads();

int index = 2 * stride * tid;

if (index < blockDim.x) {

sdata[index] += sdata[index + stride];

}

}

// Thread 0 writes result for this block to global mem

if (tid == 0) g_odata[blockIdx.x] = sdata[0];

}

Memorijski

konflikt

ETF Beograd::Multiprocesorski sistemi 125/166

Page 126: Multiprocesorski sistemi Compute Unified ... - mups.etf.rsmups.etf.rs/vezbe/MPS - CUDA.pdf · Uvod u GPU računarstvo (1) Grafički procesori (Graphics Processing Unit, GPU) su prvobitno

Loša paralelna redukcija (2)

Dešavaju se konflikti u deljenoj memoriji Dešava se simultani pristup kod indeksiranja niza i to dva puta Prvi pristup (sdata[index])

Indeks

Vrednosti

0 1 2 3 4 5 6 7Thread

IDsPomeraj 1

Banka

8 9 10

Niti 0 i 8 pristupaju istoj memorijskoj banki

Niti 1 i 9 pristupaju istoj memorijskoj banki

Niti 2 i 10 pristupaju istoj memorijskoj banki, itd.

0 1 2 3 4 5 6 7 8 9 101112131415 0 1 2 3 4 5 ...

0 1 2 3 4 5 6 7 8 9 101112131415161718192021 ...

10 1 8 -1 0 -2 3 5 -2 -3 2 7 0 11 0 2 -1 4 11 -5 0 12 ...

Korak 1

ETF Beograd::Multiprocesorski sistemi 126/166

Page 127: Multiprocesorski sistemi Compute Unified ... - mups.etf.rsmups.etf.rs/vezbe/MPS - CUDA.pdf · Uvod u GPU računarstvo (1) Grafički procesori (Graphics Processing Unit, GPU) su prvobitno

Loša paralelna redukcija (3)

Drugi simultani pristup (sdata[index + stride])

Indeksi

Vrednosti

0 1 2 3 4 5 6 7Nit IDPomeraj 1

Banka

8 9 10

Niti 0 i 8 pristupaju istoj memorijskoj banki

Niti 1 i 9 pristupaju istoj memorijskoj banki

Niti 2 i 10 pristupaju istoj memorijskoj banki, itd.

0 1 2 3 4 5 6 7 8 9 101112131415 0 1 2 3 4 5 ...

0 1 2 3 4 5 6 7 8 9 101112131415161718192021 ...

10 1 8 -1 0 -2 3 5 -2 -3 2 7 0 11 0 2 -1 4 11 -5 0 12 ...

Korak 1

ETF Beograd::Multiprocesorski sistemi 127/166

Page 128: Multiprocesorski sistemi Compute Unified ... - mups.etf.rsmups.etf.rs/vezbe/MPS - CUDA.pdf · Uvod u GPU računarstvo (1) Grafički procesori (Graphics Processing Unit, GPU) su prvobitno

Loša paralelna redukcija (4)

Prvi simultani pristup (sdata[index])

8-ostruki konflikt

Indeksi

Vrednosti

0Nit IDPomeraj 8

Banka

Parne niti pristupaju banki 0Neparne niti pristupaju banki 8

0 1 2 3 4 5 6 7 8 9 101112131415 0 1 2 3 4 5 ...

0 1 2 3 4 5 6 7 8 9 101112131415161718192021 ...

10 1 8 -1 0 -2 3 5 -2 -3 2 7 0 11 0 2 -1 4 11 -5 0 12 ...

21

Korak 3

ETF Beograd::Multiprocesorski sistemi 128/166

Page 129: Multiprocesorski sistemi Compute Unified ... - mups.etf.rsmups.etf.rs/vezbe/MPS - CUDA.pdf · Uvod u GPU računarstvo (1) Grafički procesori (Graphics Processing Unit, GPU) su prvobitno

Redukcija bez konflikta (1)

Korektna implementacija bez memorijskih konflikta:for (int s = 1; s < blockDim.x; s *= 2) {

__syncthreads();

if (threadIdx.x % (2 * s) == 0)

sdata[threadID] += sdata[threadIdx.x + s];

}

Problem je veliki broj divergentnih warp-ova prilikom izvršavanja ovakvog koda

Polovina niti (parne niti) će biti aktivna, a polovina ne (neparne niti)

Ukoliko postoje grananja unutar warp-a, sve niti će izvršiti sve putanje, što dovodi do usporenja

ETF Beograd::Multiprocesorski sistemi 129/166

Page 130: Multiprocesorski sistemi Compute Unified ... - mups.etf.rsmups.etf.rs/vezbe/MPS - CUDA.pdf · Uvod u GPU računarstvo (1) Grafički procesori (Graphics Processing Unit, GPU) su prvobitno

Redukcija bez konflikta (2)

0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15

10 1 8 -1 0 -2 3 5 -2 -3 2 7 0 11 0 2

Indeksi

Vrednosti

0 2 4 6 8 10 12 14

11 1 7 -1 -2 -2 8 5 -5 -3 9 7 11 11 2 2

0 4 8 12

18 1 7 -1 6 -2 8 5 4 -3 9 7 13 11 2 2

0 8

24 1 7 -1 6 -2 8 5 17 -3 9 7 13 11 2 2

0

41 1 7 -1 6 -2 8 5 17 -3 9 7 13 11 2 2

Nit IDKorak 1

Pomeraj 1

Korak 2

Pomeraj 2

Korak 3

Pomeraj 4

Korak 4

Pomeraj 8

Nit ID

Nit ID

Nit ID

Vrednosti

Vrednosti

Vrednosti

Vrednosti

ETF Beograd::Multiprocesorski sistemi 130/166

Page 131: Multiprocesorski sistemi Compute Unified ... - mups.etf.rsmups.etf.rs/vezbe/MPS - CUDA.pdf · Uvod u GPU računarstvo (1) Grafički procesori (Graphics Processing Unit, GPU) su prvobitno

Redukcija bez konflikta (3)

Ideja je da niti pristupaju nesusednim elementima:__global__ void reduce(int *g_idata, int *g_odata) {

extern __shared__ int sdata[];

// load shared mem

unsigned int tid = threadIdx.x;

unsigned int i = blockIdx.x * blockDim.x + threadIdx.x;

sdata[tid] = g_idata[i];

__syncthreads();

// do reduction in shared mem

for (unsigned int s = blockDim.x/2; s > 0; s >>= 1) {

if (tid < s) {

sdata[tid] = sdata[tid] + sdata[tid + s];

}

__syncthreads();

}

// write result for this block to global mem

if (tid == 0) g_odata[blockIdx.x] = sdata[0];

}

ETF Beograd::Multiprocesorski sistemi 131/166

Page 132: Multiprocesorski sistemi Compute Unified ... - mups.etf.rsmups.etf.rs/vezbe/MPS - CUDA.pdf · Uvod u GPU računarstvo (1) Grafički procesori (Graphics Processing Unit, GPU) su prvobitno

Redukcija bez konflikta (4)0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15

10 1 8 -1 0 -2 3 5 -2 -3 2 7 0 11 0 2

0 1 2 3 4 5 6 7

8 -2 10 6 0 9 3 7 -2 -3 2 7 0 11 0 2

0 1 2 3

8 7 13 13 0 9 3 7 -2 -3 2 7 0 11 0 2

0 1

21 20 13 13 0 9 3 7 -2 -3 2 7 0 11 0 2

0

41 20 13 13 0 9 3 7 -2 -3 2 7 0 11 0 2

Indeksi

Vrednosti

Nit ID

Korak 1

Pomeraj 1

Korak 2

Pomeraj 2

Korak 3

Pomeraj 4

Korak 4

Pomeraj 8

Nit ID

Nit ID

Nit ID

Vrednosti

Vrednosti

Vrednosti

VrednostiETF Beograd::Multiprocesorski sistemi 132/166

Page 133: Multiprocesorski sistemi Compute Unified ... - mups.etf.rsmups.etf.rs/vezbe/MPS - CUDA.pdf · Uvod u GPU računarstvo (1) Grafički procesori (Graphics Processing Unit, GPU) su prvobitno

Redukcija bez konflikta (4)

Treba primetiti da nakon učitavanja elementa u deljenu memoriju samo polovina niti radi redukciju:for (unsigned int s = blockDim.x/2; s > 0; s >>= 1) {

if (tid < s) {

sdata[tid] = sdata[tid] + sdata[tid + s];

}

__syncthreads();

}

To se može promeniti tako što će svaka nit raditi dva čitanja i prvo sumiranje u redukciji: Broj blokova se tako smanjuje za polaunsigned int tid = threadIdx.x;

unsigned int i = blockIdx.x*(blockDim.x*2) + threadIdx.x;

sdata[tid] = g_idata[i] + g_idata[i+blockDim.x];

__syncthreads();

ETF Beograd::Multiprocesorski sistemi 133/166

Page 134: Multiprocesorski sistemi Compute Unified ... - mups.etf.rsmups.etf.rs/vezbe/MPS - CUDA.pdf · Uvod u GPU računarstvo (1) Grafički procesori (Graphics Processing Unit, GPU) su prvobitno

Uklanjanje petlji (1)

Samo jedan warp unutar bloka je aktivan u poslednjih nekoliko koraka Broj iteracija petlje se može smanjiti i

time ukloniti suvišni pozivi __syncthreads()for (unsigned int s = blockDim.x/2; s > 32; s >>= 1) {

if (tid < s) {

sdata[tid] += sdata[tid + s];

}

__syncthreads();

}

if (tid < 32) sdata[tid] += sdata[tid + 32];

if (tid < 16) sdata[tid] += sdata[tid + 16];

if (tid < 8) sdata[tid] += sdata[tid + 8];

if (tid < 4) sdata[tid] += sdata[tid + 4];

if (tid < 2) sdata[tid] += sdata[tid + 2];

if (tid < 1) sdata[tid] += sdata[tid + 1];

ETF Beograd::Multiprocesorski sistemi 134/166

Page 135: Multiprocesorski sistemi Compute Unified ... - mups.etf.rsmups.etf.rs/vezbe/MPS - CUDA.pdf · Uvod u GPU računarstvo (1) Grafički procesori (Graphics Processing Unit, GPU) su prvobitno

Uklanjanje petlji (2)

Petlja se može kompletno ukloniti, ako je veličina bloka poznata unapred: Mogu se koristiti C++ šabloni da se izgeneriše odgovarajuća funkcijatemplate <unsigned int blockSize>

__global__ void reduce(int *g_idata, int *g_odata) {

...

if (blockSize >= 512) {

if (tid < 256) { sdata[tid] += sdata[tid + 256]; } __syncthreads(); }

if (blockSize >= 256) {

if (tid < 128) { sdata[tid] += sdata[tid + 128]; } __syncthreads(); }

if (blockSize >= 128) {

if (tid < 64) { sdata[tid] += sdata[tid + 64]; } __syncthreads(); }

if (tid < 32) {

if (blockSize >= 64) sdata[tid] += sdata[tid + 32];

if (blockSize >= 32) sdata[tid] += sdata[tid + 16];

if (blockSize >= 16) sdata[tid] += sdata[tid + 8];

if (blockSize >= 8) sdata[tid] += sdata[tid + 4];

if (blockSize >= 4) sdata[tid] += sdata[tid + 2];

if (blockSize >= 2) sdata[tid] += sdata[tid + 1];

}

ETF Beograd::Multiprocesorski sistemi 135/166

Page 136: Multiprocesorski sistemi Compute Unified ... - mups.etf.rsmups.etf.rs/vezbe/MPS - CUDA.pdf · Uvod u GPU računarstvo (1) Grafički procesori (Graphics Processing Unit, GPU) su prvobitno

Redukcija nad velikim nizovima (1)

Do sada je razmatrana redukcija na nivou bloka podataka Nezavisni blokovi niti redukuju jedan blok podataka iz globalne

memorije

CUDA ne dozvoljava globalnu sinhronizaciju među blokovima

Potreban način da niti iz različitih blokova međusobno sarađuju Rešenje je iskoristiti višestruke pozive istog jezgra

Poziv jezgru se može posmatrati kao globalna sinhorizaciona tačka

Poziv jezgru troši zanemarljivo režijsko vreme

Nakon završetka redukcije na nivou pojedinačnih blokova, treba pozvati jezgro ponovo, sada samo sa jednim blokom

Alternativno, poslednji korak se može izvršiti na CPU

ETF Beograd::Multiprocesorski sistemi 136/166

Page 137: Multiprocesorski sistemi Compute Unified ... - mups.etf.rsmups.etf.rs/vezbe/MPS - CUDA.pdf · Uvod u GPU računarstvo (1) Grafički procesori (Graphics Processing Unit, GPU) su prvobitno

Redukcija nad velikim nizovima (2)

Primer redukcije u više nivoa “Tiled” algoritam

Svaki blok niti redukuje jedan podblok podataka iz ulaznog niza

Međurezultati se smeštaju u globalnu memoriju i koriste kao ulazni podaci za sledeći poziv jezgru

Postupak se ponavlja onoliko puta koliko je potrebno

ETF Beograd::Multiprocesorski sistemi 137/166

Page 138: Multiprocesorski sistemi Compute Unified ... - mups.etf.rsmups.etf.rs/vezbe/MPS - CUDA.pdf · Uvod u GPU računarstvo (1) Grafički procesori (Graphics Processing Unit, GPU) su prvobitno

Parallel Prefix Sum (Scan)

Definition:

The all-prefix-sums operation takes a binary associative operator with identity I, and an array of n elements

[a0, a1, …, an-1]

and returns the ordered set[I, a0, (a0 a1), …, (a0 a1 … an-2)].

Example: if is addition, then scan on the set

[3 1 7 0 4 1 6 3]

returns the set

[0 3 4 11 11 15 16 22]

ETF Beograd::Multiprocesorski sistemi 138/166

Page 139: Multiprocesorski sistemi Compute Unified ... - mups.etf.rsmups.etf.rs/vezbe/MPS - CUDA.pdf · Uvod u GPU računarstvo (1) Grafički procesori (Graphics Processing Unit, GPU) su prvobitno

Applications of Scan (1)

Scan is a simple and useful parallel building block Convert recurrences from sequential :

for(j=1;j<n;j++)out[j] = out[j-1] + f(j);

into parallel:forall(j) { temp[j] = f(j) };scan(out, temp);

Useful for many parallel algorithms: Radix sort & quicksort String comparison Lexical analysis Stream compaction Polynomial evaluation Solving recurrences Tree operations Histograms

ETF Beograd::Multiprocesorski sistemi 139/166

Page 140: Multiprocesorski sistemi Compute Unified ... - mups.etf.rsmups.etf.rs/vezbe/MPS - CUDA.pdf · Uvod u GPU računarstvo (1) Grafički procesori (Graphics Processing Unit, GPU) su prvobitno

Applications of Scan (2)

Computing indexes into a global array where each thread needs space for a dynamic number of elements

Each thread computes the number of elements it will produce

The scan of the thread element counts will determine the beginning index for each thread.

Tid 1 2 3 4 5 6 7 8

Scan 0 3 4 11 11 15 16 22

Cnt 3 1 7 0 4 1 6 3

0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24

ETF Beograd::Multiprocesorski sistemi 140/166

Page 141: Multiprocesorski sistemi Compute Unified ... - mups.etf.rsmups.etf.rs/vezbe/MPS - CUDA.pdf · Uvod u GPU računarstvo (1) Grafički procesori (Graphics Processing Unit, GPU) su prvobitno

Scan on the CPU

Just add each element to the sum of the elements before it

Trivial, but sequential

Exactly n adds: optimal

void scan( float* scanned, float* input, int length)

{

scanned[0] = 0;

for(int i = 1; i < length; ++i) {

scanned[i] = input[i-1] + scanned[i-1];

}

}

ETF Beograd::Multiprocesorski sistemi 141/166

Page 142: Multiprocesorski sistemi Compute Unified ... - mups.etf.rsmups.etf.rs/vezbe/MPS - CUDA.pdf · Uvod u GPU računarstvo (1) Grafički procesori (Graphics Processing Unit, GPU) su prvobitno

A Naïve Parallel Scan Algorithm

1. Read input from device memory to shared memory. Set first element to zero and shift others right by one.

Each thread reads one value from the inputarray in device memory into shared memory array T0.

Thread 0 writes 0 into shared memory array.

T0 0 3 1 7 0 4 1 6

In 3 1 7 0 4 1 6 30

ETF Beograd::Multiprocesorski sistemi 142/166

Page 143: Multiprocesorski sistemi Compute Unified ... - mups.etf.rsmups.etf.rs/vezbe/MPS - CUDA.pdf · Uvod u GPU računarstvo (1) Grafički procesori (Graphics Processing Unit, GPU) su prvobitno

A Naïve Parallel Scan Algorithm

1. Read input from device memory to shared memory. Set first element to zero and shift others right by one.

2. Iterate log(n) times: Threads stride to n: Add pairs of elements stride elements apart. Double stride at each iteration. (note must double buffer shared

mem arrays)

• Active threads: stride to n-1 (n-stride threads)

• Thread j adds elements j and j-stride from T0 and writes result into shared memory buffer T1 (ping-pong)

Iteration #1Stride = 1

T1 0 3 4 8 7 4 5 7

Stride 1

T0 0 3 1 7 0 4 1 6

In 3 1 7 0 4 1 6 30

ETF Beograd::Multiprocesorski sistemi 143/166

Page 144: Multiprocesorski sistemi Compute Unified ... - mups.etf.rsmups.etf.rs/vezbe/MPS - CUDA.pdf · Uvod u GPU računarstvo (1) Grafički procesori (Graphics Processing Unit, GPU) su prvobitno

A Naïve Parallel Scan Algorithm

T1 0 3 4 8 7 4 5 7

T0 0 3 4 11 11 12 12 11

Stride 1

Stride 2

1. Read input from device memory to shared memory. Set first element to zero and shift others right by one.

2. Iterate log(n) times: Threads stride to n: Add pairs of elements stride elements apart. Double stride at each iteration. (note must double buffer shared mem arrays)

• Active threads: stride to n-1 (n-stride threads)

• Thread j adds elements j and j-stride from T1 and writes result into shared memory buffer T0 (ping-pong)

Iteration #2Stride = 2

T0 0 3 1 7 0 4 1 6

In 3 1 7 0 4 1 6 30

ETF Beograd::Multiprocesorski sistemi 144/166

Page 145: Multiprocesorski sistemi Compute Unified ... - mups.etf.rsmups.etf.rs/vezbe/MPS - CUDA.pdf · Uvod u GPU računarstvo (1) Grafički procesori (Graphics Processing Unit, GPU) su prvobitno

A Naïve Parallel Scan Algorithm

T1 0 3 4 11 11 15 16 22

1. Read input from device memory to shared memory. Set first element to zero and shift others right by one.

2. Iterate log(n) times: Threads stride to n: Add pairs of elements stride elements apart. Double stride at each iteration. (note must double buffer shared mem arrays)

• Active threads: stride to n-1 (n-4 == n/2 threads)

• Thread j adds elements j and j-stride from T0 and writes result into shared memory buffer T1 (ping-pong)

Iteration #3Stride = 4

In 3 1 7 0 4 1 6 30

T1 0 3 4 8 7 4 5 7

T0 0 3 4 11 11 12 12 11

Stride 1

Stride 2

T0 0 3 1 7 0 4 1 6

ETF Beograd::Multiprocesorski sistemi 145/166

Page 146: Multiprocesorski sistemi Compute Unified ... - mups.etf.rsmups.etf.rs/vezbe/MPS - CUDA.pdf · Uvod u GPU računarstvo (1) Grafički procesori (Graphics Processing Unit, GPU) su prvobitno

A Naïve Parallel Scan Algorithm

Out 0 3 4 11 11 15 16 22

1. Read input from device memory to shared memory. Set first element to zero and shift others right by one.

2. Iterate log(n) times: Threads stride to n: Add pairs of elements stride elements apart. Double stride at each iteration. (note must double buffer shared mem arrays)

3. Write output to device memory.

T1 0 3 4 11 11 15 16 22

In 3 1 7 0 4 1 6 30

T1 0 3 4 8 7 4 5 7

T0 0 3 4 11 11 12 12 11

Stride 1

Stride 2

T0 0 3 1 7 0 4 1 6

ETF Beograd::Multiprocesorski sistemi 146/166

Page 147: Multiprocesorski sistemi Compute Unified ... - mups.etf.rsmups.etf.rs/vezbe/MPS - CUDA.pdf · Uvod u GPU računarstvo (1) Grafički procesori (Graphics Processing Unit, GPU) su prvobitno

Why is This Scan Naïve?

Step complexity S(n): # of parallel iterations Work complexity W(n): the total # of operations

A parallel algorithm is Work Efficient if it does the same amount of work as an optimal sequential algorithm

Scan executes log(n) parallel iterations The steps do n-1, n-2, n-4,... n/2 adds each Total adds: O(n*log(n))

This scan algorithm is NOT work efficient Sequential scan algorithm does n adds A factor of log(n) hurts: 20x for 10^6 elements!

)(

1

)()(nS

i

i nWnW

ETF Beograd::Multiprocesorski sistemi 147/166

Page 148: Multiprocesorski sistemi Compute Unified ... - mups.etf.rsmups.etf.rs/vezbe/MPS - CUDA.pdf · Uvod u GPU računarstvo (1) Grafički procesori (Graphics Processing Unit, GPU) su prvobitno

Improving Efficiency

A common parallel algorithms pattern:

Balanced Trees Build a balanced binary tree on the input data and sweep it to

and from the root

Tree is not an actual data structure, but a concept to determine what each thread does at each step

For scan:

Traverse down from leaves to root building partial sums at internal nodes in the tree

Root holds sum of all leaves

Traverse back up the tree building the scan from the partial sums

ETF Beograd::Multiprocesorski sistemi 148/166

Page 149: Multiprocesorski sistemi Compute Unified ... - mups.etf.rsmups.etf.rs/vezbe/MPS - CUDA.pdf · Uvod u GPU računarstvo (1) Grafički procesori (Graphics Processing Unit, GPU) su prvobitno

Build the Sum Tree

T 3 1 7 0 4 1 6 3

Assume array is already in shared memory

ETF Beograd::Multiprocesorski sistemi 149/166

Page 150: Multiprocesorski sistemi Compute Unified ... - mups.etf.rsmups.etf.rs/vezbe/MPS - CUDA.pdf · Uvod u GPU računarstvo (1) Grafički procesori (Graphics Processing Unit, GPU) su prvobitno

Build the Sum Tree

T 3 1 7 0 4 1 6 3

T 3 4 7 7 4 5 6 9

Stride 1 Iteration 1, n/2 threads

Iterate log(n) times. Each thread adds value stride elements away to its own value

Each corresponds

to a single thread.

ETF Beograd::Multiprocesorski sistemi 150/166

Page 151: Multiprocesorski sistemi Compute Unified ... - mups.etf.rsmups.etf.rs/vezbe/MPS - CUDA.pdf · Uvod u GPU računarstvo (1) Grafički procesori (Graphics Processing Unit, GPU) su prvobitno

Build the Sum Tree

T 3 1 7 0 4 1 6 3

T 3 4 7 7 4 5 6 9

T 3 4 7 11 4 5 6 14

Stride 1

Stride 2

Iteration 2, n/4 threads

Iterate log(n) times. Each thread adds value stride elements away to its own value

Each corresponds

to a single thread.

ETF Beograd::Multiprocesorski sistemi 151/166

Page 152: Multiprocesorski sistemi Compute Unified ... - mups.etf.rsmups.etf.rs/vezbe/MPS - CUDA.pdf · Uvod u GPU računarstvo (1) Grafički procesori (Graphics Processing Unit, GPU) su prvobitno

Build the Sum Tree

T 3 1 7 0 4 1 6 3

T 3 4 7 7 4 5 6 9

T 3 4 7 11 4 5 6 14

T 3 4 7 11 4 5 6 25

Iterate log(n) times. Each thread adds value stride elements away to its own value.Note that this algorithm operates in-place: no need for double buffering

Iteration log(n), 1 thread

Stride 1

Stride 2

Stride 4 Each corresponds

to a single thread.

ETF Beograd::Multiprocesorski sistemi 152/166

Page 153: Multiprocesorski sistemi Compute Unified ... - mups.etf.rsmups.etf.rs/vezbe/MPS - CUDA.pdf · Uvod u GPU računarstvo (1) Grafički procesori (Graphics Processing Unit, GPU) su prvobitno

Zero the Last Element

T 3 4 7 11 4 5 6 0

We now have an array of partial sums. Since this is an exclusive scan,set the last element to zero. It will propagate back to the first element.

ETF Beograd::Multiprocesorski sistemi 153/166

Page 154: Multiprocesorski sistemi Compute Unified ... - mups.etf.rsmups.etf.rs/vezbe/MPS - CUDA.pdf · Uvod u GPU računarstvo (1) Grafički procesori (Graphics Processing Unit, GPU) su prvobitno

Build Scan From Partial Sums

T 3 4 7 11 4 5 6 0

ETF Beograd::Multiprocesorski sistemi 154/166

Page 155: Multiprocesorski sistemi Compute Unified ... - mups.etf.rsmups.etf.rs/vezbe/MPS - CUDA.pdf · Uvod u GPU računarstvo (1) Grafički procesori (Graphics Processing Unit, GPU) su prvobitno

Build Scan From Partial Sums

T 3 4 7 0 4 5 6 11

T 3 4 7 11 4 5 6 0

Iterate log(n) times. Each thread adds value stride elements away to its own value,and sets the value stride elements away to its own previous value.

Iteration 11 thread

Stride 4

Each corresponds

to a single thread.

ETF Beograd::Multiprocesorski sistemi 155/166

Page 156: Multiprocesorski sistemi Compute Unified ... - mups.etf.rsmups.etf.rs/vezbe/MPS - CUDA.pdf · Uvod u GPU računarstvo (1) Grafički procesori (Graphics Processing Unit, GPU) su prvobitno

Build Scan From Partial Sums

T 3 4 7 0 4 5 6 11

T 3 4 7 11 4 5 6 0

T 3 0 7 4 4 11 6 16

Iterate log(n) times. Each thread adds value stride elements away to its own value,and sets the value stride elements away to its own previous value.

Iteration 2 2 threads

Stride 4

Stride 2

Each corresponds

to a single thread.

ETF Beograd::Multiprocesorski sistemi 156/166

Page 157: Multiprocesorski sistemi Compute Unified ... - mups.etf.rsmups.etf.rs/vezbe/MPS - CUDA.pdf · Uvod u GPU računarstvo (1) Grafički procesori (Graphics Processing Unit, GPU) su prvobitno

Build Scan From Partial Sums

T 3 4 7 0 4 5 6 11

T 3 4 7 11 4 5 6 0

T 3 0 7 4 4 11 6 16

T 0 3 4 11 11 15 16 22

Done! We now have a completed scan that we can write out to device memory.Total steps: 2 * log(n). Total work: 2 * (n-1) adds = O(n) Work Efficient!

Iteration log(n) n/2 threads

Stride 2

Stride 4

Stride 1 Each corresponds

to a single thread.

ETF Beograd::Multiprocesorski sistemi 157/166

Page 158: Multiprocesorski sistemi Compute Unified ... - mups.etf.rsmups.etf.rs/vezbe/MPS - CUDA.pdf · Uvod u GPU računarstvo (1) Grafički procesori (Graphics Processing Unit, GPU) su prvobitno

Bank Conflicts

Algorithmic work-efficiency is not enough

Must use the hardware efficiently too!

Current scan implementation has many shared memory bank conflicts

These really hurt performance on hardware

We can add some simple modifications to our memory addressing to save a lot of cycles

ETF Beograd::Multiprocesorski sistemi 158/166

Page 159: Multiprocesorski sistemi Compute Unified ... - mups.etf.rsmups.etf.rs/vezbe/MPS - CUDA.pdf · Uvod u GPU računarstvo (1) Grafički procesori (Graphics Processing Unit, GPU) su prvobitno

Bank Conflicts

Occur when multiple threads access the same shared memory bank with different addresses

No penalty if all threads access different banks

Or if all threads access exact same address

Access costs N cycles if there is a conflict

Where N is max number of threads accessing single bank

ETF Beograd::Multiprocesorski sistemi 159/166

Page 160: Multiprocesorski sistemi Compute Unified ... - mups.etf.rsmups.etf.rs/vezbe/MPS - CUDA.pdf · Uvod u GPU računarstvo (1) Grafički procesori (Graphics Processing Unit, GPU) su prvobitno

Bank Conflicts on load

The first bank conflicts are simple

Each thread loads two shared mem data elements

Tempting to interleave the loadstemp[2*thid] = g_idata[2*thid];

temp[2*thid+1] = g_idata[2*thid+1];

Threads:(0,1,2,…,8,9,10,…) banks:(0,2,4,…,0,2,4,…)

Better to load one element from each half of the arraytemp[thid] = g_idata[thid];

temp[thid + (n/2)] = g_idata[thid + (n/2)];

ETF Beograd::Multiprocesorski sistemi 160/166

Page 161: Multiprocesorski sistemi Compute Unified ... - mups.etf.rsmups.etf.rs/vezbe/MPS - CUDA.pdf · Uvod u GPU računarstvo (1) Grafički procesori (Graphics Processing Unit, GPU) su prvobitno

Bank Conflicts in the tree algorithm

When we build the sums, each thread reads two shared memory locations and writes one:

Th(0,8) access bank 0

0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 0 1 2 ...

3 1 7 0 4 1 6 3 5 8 2 0 3 3 1 9 4 5 7 …

0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 0 1 2 ...

3 4 7 7 4 5 6 9 5 13

2 2 3 6 1 10

4 9 7 …

Bank:

First iteration: 2 threads access each of 8 banks.

Each corresponds to a single thread.

Like-colored arrows represent simultaneous memory accesses

ETF Beograd::Multiprocesorski sistemi 161/166

Page 162: Multiprocesorski sistemi Compute Unified ... - mups.etf.rsmups.etf.rs/vezbe/MPS - CUDA.pdf · Uvod u GPU računarstvo (1) Grafički procesori (Graphics Processing Unit, GPU) su prvobitno

Bank Conflicts in the tree algorithm

When we build the sums, each thread reads two shared memory locations and writes one:

Th(1,9) access bank 1, etc.

0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 0 1 2 ...

3 1 7 0 4 1 6 3 5 8 2 0 3 3 1 9 4 5 7 …

0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 0 1 2 ...

3 4 7 7 4 5 6 9 5 13

2 2 3 6 1 10

4 9 7 …

Bank:

First iteration: 2 threads access each of 8 banks.

Each corresponds to a single thread.

Like-colored arrows represent simultaneous memory accesses

ETF Beograd::Multiprocesorski sistemi 162/166

Page 163: Multiprocesorski sistemi Compute Unified ... - mups.etf.rsmups.etf.rs/vezbe/MPS - CUDA.pdf · Uvod u GPU računarstvo (1) Grafički procesori (Graphics Processing Unit, GPU) su prvobitno

Bank Conflicts in the tree algorithm

2nd iteration: even worse! 4-way bank conflicts; for example:

Th(0,4,8,12) access bank 1, Th(1,5,9,13) access Bank 5, etc.

0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 0 1 2 ...

3 4 7 4 4 5 6 9 5 13

2 2 3 6 1 10

4 9 7 …

0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 0 1 2 ...

3 4 7 11

4 5 6 14

5 13

2 15

3 6 1 16

4 9 7 …

Bank:

2nd iteration: 4 threads access each of 4 banks.

Each corresponds to a single thread.

Like-colored arrows represent simultaneous memory accesses

ETF Beograd::Multiprocesorski sistemi 163/166

Page 164: Multiprocesorski sistemi Compute Unified ... - mups.etf.rsmups.etf.rs/vezbe/MPS - CUDA.pdf · Uvod u GPU računarstvo (1) Grafički procesori (Graphics Processing Unit, GPU) su prvobitno

Bank Conflicts in the tree algorithm

We can use padding to prevent bank conflicts

Just add a word of padding every 16 words:

No more conflicts!

0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 0 1 2 3 …

3 1 7 0 4 1 6 3 5 8 2 0 3 3 1 9 P 4 5 7 …

0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 0 1 2 3 ...

3 4 7 7 4 5 6 9 5 13

2 2 3 6 1 10

P 4 9 7 …

Bank:

Now, within a 16-thread half-warp, all threads access different banks.(Note that only arrows with the same color happen simultaneously.)

ETF Beograd::Multiprocesorski sistemi 164/166

Page 165: Multiprocesorski sistemi Compute Unified ... - mups.etf.rsmups.etf.rs/vezbe/MPS - CUDA.pdf · Uvod u GPU računarstvo (1) Grafički procesori (Graphics Processing Unit, GPU) su prvobitno

Use Padding to Reduce Conflicts

This is a simple modification to the last exercise

After you compute a shared mem address like this:

Address = 2 * stride * thid;

Add padding like this:

Address += (address >> 4); // divide by NUM_BANKS

This removes most bank conflicts Not all, in the case of deep trees

ETF Beograd::Multiprocesorski sistemi 165/166

Page 166: Multiprocesorski sistemi Compute Unified ... - mups.etf.rsmups.etf.rs/vezbe/MPS - CUDA.pdf · Uvod u GPU računarstvo (1) Grafički procesori (Graphics Processing Unit, GPU) su prvobitno

Literatura

David Kirk, Wen-mei Hwu, Programming Massively Parallel Processors: A Hands on Approach, Morgan Kaufmann, 2010.

Kurs ECE498AL, University of Illinois, Urbana-Champaignhttp://courses.engr.illinois.edu/ece498/al/

Dann Connors, OpenCL and CUDA Programming for Multicoreand GPU Architectures, ACACES 2011, Fiuggi, Italy, 2011.

David Kirk, Wen-mei Hwu, Programming and tUnining Massively Parallel Systems, PUMPS 2011, Barcelona, Spain, 2011.

NVIDIA CUDA C Programming Guide 4.0, 2011. Razni materijali i dokumentacija sa NVIDIA sajta,

http://developer.nvidia.com/category/zone/cuda-zone

http://en.wikipedia.org/wiki/GPGPU http://en.wikipedia.org/wiki/CUDA GPU training wiki,

https://hpcforge.org/plugins/mediawiki/wiki/gpu-training/index.php/Main_Page

ETF Beograd::Multiprocesorski sistemi 166/166