Professional Documents
Culture Documents
avec OpenCL
Julien Dehos
Sminaire du 05/01/2012
Sommaire
Introduction
Le calculateur du CGR/LISIC/LMPA
Modles
Programmation
Optimisation
Conclusion
Sommaire
Introduction
Le calculateur du CGR/LISIC/LMPA
Modles
Programmation
Optimisation
Conclusion
Introduction
Problmatique :
Introduction
Architectures matrielles :
CPU :
Introduction
Architectures matrielles :
GPU :
Introduction
Architectures matrielles :
CPU + GPU :
Introduction
Architectures matrielles :
Comparaisons GPU/CPU :
Introduction
Technologies logicielles :
Sommaire
Introduction
Le calculateur du CGR/LISIC/LMPA
Modles
Programmation
Optimisation
Conclusion
10
Le calculateur du CGR/LISIC/LMPA
Caractristiques du calculateur :
11
Le calculateur du CGR/LISIC/LMPA
Caractristiques du X5660 :
Architecture Gulftown
12 Mo de cache L3
SSE 4.2
12
Le calculateur du CGR/LISIC/LMPA
Caractristiques du C2050 :
3 Go de mmoire vive
13
Le calculateur du CGR/LISIC/LMPA
Systme :
Debian 6 "squeeze"
OpenCL, pyopencl
NVIDIA_GPU_COMPUTING_SDK
14
Le calculateur du CGR/LISIC/LMPA
Accs :
baru.univ-littoral.fr
193.49.192.7
15
Le calculateur du CGR/LISIC/LMPA
16
Le calculateur du CGR/LISIC/LMPA
Installer pyopencl
Pacman
17
Le calculateur du CGR/LISIC/LMPA
Installer Cuda
Installer le NVIDIA_GPU_COMPUTING_SDK
Installer pyopencl
18
Sommaire
Introduction
Le calculateur du CGR/LISIC/LMPA
Modles
Programmation
Optimisation
Conclusion
19
Historique :
20
Principe :
Standard ouvert
Framework pour crire des programmes
de calcul parallle
21
Architectures :
UAL
UAL
UC
UAL
UAL
Cache
UC
Cache
UC
Cache
UC
Cache
UC
Cache
UC
Cache
UC
Cache
UAL
UAL
UAL
UAL
UAL
UAL
DRAM
DRAM
CPU
GPU
Architecture gnraliste
Sminaire LISIC du 05/01/2012
22
SDK NV GPU NV
23
Avantages de OpenCL :
Standard ouvert
Systmes htrognes
Avantages de Cuda :
24
Sommaire
Introduction
Le calculateur du CGR/LISIC/LMPA
Modles
Programmation
Optimisation
Conclusion
25
Modles
Architecture OpenCL
Application
Kernel OCL
API OCL
Langage OCL
Framework OCL
Runtime OCL
Runtime OCL
Runtime OCL
Driver
Driver
Driver
Device
Device
Device
26
Modles
Architecture OpenCL
CPU hte
Application
Kernel OCL
API OCL
Langage OCL
Framework OCL
Runtime OCL
Runtime OCL
Runtime OCL
Driver
Driver
Driver
Device
Device
Device
27
Modles
Architecture OpenCL
Baru (actuellement) :
28
Modles
Modle de plate-forme
Host
Processing Element
(thread processor)
Sminaire LISIC du 05/01/2012
Compute Unit
(cur)
Compute Device
(GPU ou CPU)
29
Modles
Modle de plate-forme
Baru :
8 devices (GPU)
14 compute units par device
32 processing elements par compute unit
NB : 14x32 = 448 thread processors par device
30
Modles
Modle d'excution :
31
Modles
Modle d'excution
WI
WI
WI
WI
WI
WI
WI
WI
WI
WI
WI
WI
WI
WI
WI
WI
WG
WG
WG
WG
WI
WI
WI
WI
WI
WI
WI
WI
WI
WI
WI
WI
WI
WI
WI
WI
WG
WG
WG
WG
nD-range
Sminaire LISIC du 05/01/2012
32
Modles
Modle d'excution
Processing
Element
Compute
Unit
Warp
WI
WI
WI
WI
WI
WI
WI
WI
WI
WI
WI
WI
WI
WI
WI
WI
WG
WG
WG
WG
WI
WI
WI
WI
WI
WI
WI
WI
WI
WI
WI
WI
WI
WI
WI
WI
WG
Device
Sminaire LISIC du 05/01/2012
WG
WG
WG
nD-range
Introduction au calcul parallle avec OpenCL
33
Modles
Modle mmoire :
34
Modles
Modle mmoire
35
Modles
Modle mmoire
36
Modles
Modle de programmation :
Paralllisme de donnes :
GPU, CPU
37
Modles
Modle de programmation :
Paralllisme de taches :
CPU
38
Sommaire
Introduction
Le calculateur du CGR/LISIC/LMPA
Modles
Programmation
Optimisation
Conclusion
39
Programmation
SDK OpenCL :
40
Programmation
Rfrences :
http://www.khronos.org/opencl/
NVIDIA_GPU_COMPUTING_SDK/OpenCL/doc/
http://mathema.tician.de/software/pyopencl/
41
Programmation
tapes :
crire le kernel
Compiler, excuter
42
Programmation
Programme type :
Importer OpenCL
Crer un contexte
43
Programmation
Parallle
res[0] := f(0)
buf :=
res[1] := f(1)
kernel_f
res[2] := f(2)
res :=
res[3] := f(3)
temps
Sminaire LISIC du 05/01/2012
44
Programmation
Exemple :
45
Programmation
46
Programmation
47
Programmation
Exemple en C (1) :
// importer opencl
#include <CL/cl.h>
#include <math.h>
#include <stdio.h>
#include <stdlib.h>
// initialise les donnees a traiter
#define DATA_SIZE 50000
void fillData(float *data, unsigned int size) {
int i;
for (i=0; i<size; i++)
data[i] = i;
}
// code du kernel
const char *kernelSource[] = {
"__kernel void add42(__global float* data, __global float* result) {",
" unsigned int i = get_global_id(0);",
" result[i] = data[i] + 42.f;",
"}"
};
48
Programmation
Exemple en C (2) :
int main (int argc, char **argv) {
// creer un contexte
cl_platform_id platform;
clGetPlatformIDs (1, &platform, NULL);
cl_device_id device;
clGetDeviceIDs (platform, CL_DEVICE_TYPE_ALL, 1, &device, NULL);
cl_context context = clCreateContext (0, 1, &device, NULL, NULL, NULL);
//creer une file de commandes
cl_command_queue commandQueue = clCreateCommandQueue(context, device,0,0);
// allouer et initialiser la memoire du device
float inputDataHost[DATA_SIZE];
fillData(inputDataHost, DATA_SIZE);
cl_mem inputBufferDevice = clCreateBuffer (context, CL_MEM_READ_ONLY |
CL_MEM_COPY_HOST_PTR, sizeof(float) * DATA_SIZE, inputDataHost, 0);
cl_mem outputBufferDevice = clCreateBuffer (context, CL_MEM_WRITE_ONLY,
sizeof (float) * DATA_SIZE, 0, 0);
49
Programmation
Exemple en C (3) :
// charger et compiler le kernel
cl_program kernelProgram = clCreateProgramWithSource (context, 4,
kernelSource, 0, 0);
clBuildProgram (kernelProgram, 0, NULL, NULL, NULL, NULL);
cl_kernel kernel = clCreateKernel (kernelProgram, "add42", NULL);
clSetKernelArg (kernel, 0, sizeof (cl_mem), (void *) &inputBufferDevice);
clSetKernelArg (kernel, 1, sizeof (cl_mem), (void *) &outputBufferDevice);
// ajouter le kernel dans la file de commandes
size_t WorkSize[1] = { DATA_SIZE };
clEnqueueNDRangeKernel (commandQueue, kernel, 1, 0, WorkSize, 0, 0, 0, 0);
// recuperer les donnees calculees dans la memoire du device
float outputDataHost[DATA_SIZE];
clEnqueueReadBuffer (commandQueue, outputBufferDevice, CL_TRUE, 0,
DATA_SIZE * sizeof (float), outputDataHost, 0, NULL, NULL);
50
Programmation
Exemple en C (4) :
// liberer les ressources
clReleaseKernel (kernel);
clReleaseProgram (kernelProgram);
clReleaseCommandQueue (commandQueue);
clReleaseMemObject (inputBufferDevice);
clReleaseMemObject (outputBufferDevice);
clReleaseContext (context);
// validation
int i;
for (i=0; i<DATA_SIZE; i++)
if (fabs((inputDataHost[i] + 42.f) - outputDataHost[i]) > 1e-2)
break;
if (i == DATA_SIZE)
printf ("passed\n");
else
printf ("failed\n");
}
return 0;
51
Programmation
52
Programmation
53
Programmation
54
Programmation
55
Programmation
(Hirarchie de classes)
Syntaxe un peu plus lgre
Mcanisme d'exceptions
Libration automatique des ressources
56
Programmation
Synchronisation :
57
Programmation
Synchronisation :
Command queue :
Event :
58
Programmation
Synchronisation :
59
Programmation
Objets mmoire :
Types d'objet :
Buffer 1D
Image 2D ou 3D
Types de donnes :
Scalaire
Vectoriel
Structure dfinie par l'utilisateur
60
Programmation
Transferts mmoire :
Coteux
Bloquants ou non-bloquants
61
Sommaire
Introduction
Le calculateur du CGR/LISIC/LMPA
Modles
Programmation
Optimisation
Conclusion
62
Optimisation
63
Optimisation
Gnralits :
Mthode gnrale :
Valider l'implmentation
Mesurer/profiler l'excution
Si ncessaire, optimiser les sections de code coteuses
Boucler
64
Optimisation
Gnralits :
OpenCL :
65
Optimisation
Quelques pistes :
Divergence :
66
Optimisation
Quelques pistes :
67
Optimisation
Quelques pistes :
Mmoire "local" :
68
Optimisation
Quelques pistes :
Coalescing :
WI
WI
WI
WI
NDRange
WI
WI
WI
WI
Mmoire "global"
Accs coalescent
Sminaire LISIC du 05/01/2012
Accs non-coalescent
Introduction au calcul parallle avec OpenCL
69
Optimisation
Quelques pistes :
Unrolling
Pipelining
Vectorisation
...
70
Optimisation
Exemple :
Multiplication de matrices
71
Sommaire
Introduction
Le calculateur du CGR/LISIC/LMPA
Modles
Programmation
Optimisation
Conclusion
72
Conclusion
OpenCL :
Mais :
73
Conclusion
Remarques :
Choix Cuda/OpenCL :
74
75