Uvod u GPGPU programiranje
-
Upload
sicef -
Category
Engineering
-
view
88 -
download
15
Transcript of Uvod u GPGPU programiranje
Uvod u GPGPU programiranje
Elektronski fakultet Niš 16.04.2015.
dr Dušan Gajić
•Commodore Amiga - 1985.
•Nvidia GeForce 256 - 1999.
• Industrija video igara
•GPU danas: PC, tablet, smartphone, konzole…
•Heterogeni računarski sistemi
(CPU, GPU, DSP, FPGA…)
Kratka istorija GPU
brza evolucija GPU
Savremene GPU arhitekture
Manycore arhitekture
2006 2007 2008 2009 2010 2011 2012 2013 20140
1000
2000
3000
4000
5000
6000
43 51 55 58 86 187 225 225 225518 576 648
1062
1581
2488
3090
4500
5632
CPU GPU
godina
moć o
bra
de [
GFLO
PS
]Moć obrade CPU i GPU
2006 2007 2008 2009 2010 2011 2012 2013 20140
50
100
150
200
250
300
350
1026 26 32 32 32
51 51 51
90108
142159
177192 192
288
336
CPU GPU
godina
pro
pu
sn
i op
seg
[G
B/s
]Propusnu opseg CPU i GPU
CPU – von Neumannova arhitektura
GPU – SIMD arhitektura
1. Zahtevaju kompleksna i obimna izračunavanja
2. Omogućavaju značajan paralelizam
3. U većoj meri zavise od propusne moći nego od latencije
Problemi pogodni za GPU
Intenzitet izračunavanja
CPU GPU
ulazni podaci
izračunati rezultati
ulazni
bafer
1
2
GPU izvršava kernel sa velikim brojem paralelnih
niti3
izlazni bafer
4
Rad GPGPU programa
Struktura GPGPU programa
Elementi rada GPGPU programa
2000 2005 2007 2015
Programski jezici za GPGPU
+ visoke performanse+ razvijeni alati za programiranje i optimizaciju
- radi isključivo na Nvidia GPU
+ radi na širokom spektru procesora (AMD i Nvidia GPU, DSP, FPGA...)
- slabije razvijeni alati i nešto niže performanse programa
Programski jezici za GPGPU
• CUDA C i OpenCL C zasnovani na C99 ISO standardu
• Specijalne ključne reči i dodatne funkcije za podršku paralelnom programiranju:
kernel, global, shared, sync, get_global_id, ...
• Određena ograničenja (npr. zabrana rekurzije) i specifičnosti (eksplicitna specifikacija tipa memorije)
Programski jezici za GPGPU
Primer: sekvencijalno množenje dva vektora u C-u na CPU
void addCPU(int* c, const int* a, const int* b)
{
unsigned int i;
for (i = 0; i < n; i++)
{
c[i] = a[i] + b[i];
}
}
#include “cuda_runtime.h”#include “device_launch_parameters.h”…void main(){
…cudaMalloc((void**)&a, size*sizeof(int));…cudaMemcpy(a, input, size*sizeof(int),
cudaMemcpyHostToDevice);
…dim3 gridDim(1,1,1);dim3 blockDim(N,1,1);
addGPU<<<gridDim, blockDim>>>(c, a, b);
cudaMemcpy(c, output, size*sizeof(int), cudaMemcpyDeviceToHost);
…}
Primer: host CUDA program (CPU)
__global__ void addGPU(int* c,
const int* a,
const int* b)
{
const unsigned int tid = threadIdx.x;
c[tid] = a[tid] + b[tid];
}
Primer: paralelno množenje dva vektora – CUDA na GPU
__kernel void addGPU(__global int* c,
__const int* a,
__const int* b)
{
const unsigned int tid = get_global_id();
c[tid] = a[tid] + b[tid];
}
Primer: paralelno množenje dva vektora – OpenCL na GPU
• Program domаćina (host) i program uređaja (device)
• Kernel opisuje operacije koje realizuje jedna nit
•Broj niti po bloku i broj blokova u mreži određuje se u programu domaćina
Glavni koncepti kod GPGPU programa
https://www.coursera.org/course/hetero
Heterogeneous Parallel Programming
https://www.udacity.com/course/cs344
Introduction to Parallel Programming
GPGPU MOOC-ovi
http://gpgpu.org/
http://www.gpucomputing.net/
https://developer.nvidia.com/category/zone/cuda-zone
http://developer.amd.com/resources/ heterogeneous-computing/opencl-zone/
Web resursi
Preporučena literatura - CUDA
Preporučena literatura - OpenCL
Uvod u GPGPU programiranje
Elektronski fakultet Niš 16.04.2015.
dr Dušan Gajić e-mail: [email protected]