Académique Documents
Professionnel Documents
Culture Documents
GPGPU
GPGPU
Objectif
Lopration saxpy() :
un exemple simple
ne require pratiquement aucun background
en algbre linaire
illustre trs bien les concepts GPGPU.
Consiste calculer y = y + alpha * x
avec x et y vecteurs de longueur N et alpha une
valeur scalaire
Configuration de OpenGL-GLUT
GLUT (OpenGL Utility Toolkit), :
fournit des fonctions pour grer les vnements windows
Permet de crer de simples menus
etc. (voir http://raphaello.univ-fcomte.fr/ig/opengl/Glut.htm)
Configuration de OpenGL-GLEW
La plupart des mcanismes requis pour faire du GPGPU
ne font pas partie du noyau dOpenGL
GLEW (OpenGL Extension Wrangler) est une libraire qui
tend OpenGL pour avoir plus de contrle sur le matriel
travers lAPI OpenGL
Dautres extensions OpenGL sont disponibles
ladresse http://www.opengl.org/registry/
Il est possible dexplorer les extensions supportes par
la carte graphique avec les outils :
Interface minimalistique
void initGLEW (void)
{
// initialiser GLEW et obtenir les pointeurs sur les fonctions
int err = glewInit();
// Attention : Ce code ne teste pas si lextension est supporte par le matriel
// dans le cas chant glewInit() sera gale NULL
if (err!=GLEW_OK)
{
printf((char*)glewGetErrorString(err));
exit(ERROR_GLEW);
}
}
Utilisation de lextension
EXT_framebuffer_object
GLuint fb;
void initFBO(void) {
// crer un FBO (off-screen framebuffer)
glGenFramebuffersEXT(1, &fb);
// se brancher sur offscreen buffer
glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, fb);
}
GPGPU concept 1:
tableaux = textures
Pour le CPU :
nativement sur une seule dimension
accds moyennant des indices a[i][j]=a[i*M+j]
Pour le GPU :
nativement sur 2 dimensions
supporte 1 et 3 dimensions mais implique des pnalits sur les
performances
Laccs se fait moyennant des coordonnes de textures
appels textures ou texture samplers
les dimensions des textures sont limites (peuvent tre obtenues
par une requte OpenGL une fois GLUT initialis)
int maxtexsize;
glGetIntegerv(GL_MAX_TEXTURE_SIZE,&maxtexsize);
printf("GL_MAX_TEXTURE_SIZE, %d\n",maxtexsize);
8
Texture rectangle
Texture cible
GL_TEXTURE_2D
GL_TEXTURE_RECTANGLE_ARB
Coordonnes
des textures
Dimensions
des textures
10
11
Enumrants
Les numrants des 2 formats de textures auxquels
nous nous intressons sont :
GL_FLOAT_R32_NV : informe le GL que nous souhaitons
stocker un seul nombre virgule flottante par texel
GL_FLOAT_RGBA32_NV : stocke un 4-tuplet de nombres
virgule flottante
GL_LUMINANCE_FLOAT32_ATI
GL_RGBA_FLOAT32_ATI
GL_LUMINANCE32F_ARB
GL_RGBA32F_ARB
13
Mapping CPU-GPU
Comment associer un vecteur (CPU) une
texture (GPU) ?
La solution la plus simple :
Pour les formats LUMINANCE : Associer un vecteur de taille
N (on suppose que N est une puissance de 2) une texture
de taille sqrt(N) par sqrt(N)
Pour les formats RGBA : Associer un vecteur de taille N
une texture de taille sqrt(N/4) par sqrt(N/4). On suppose que
N correspond une taille qui soit adapte pour tresupporte
par la texture (ex. N=1024^2 peut tre stocke dans une
texture de taille 512 sur 512). La valeur correspondante sera
stocke dans texSize.
14
Rcap.
Cible
Format
Format
interne
NVIDIA GeForce
FX (NV3x)
ATI
texture rectangle
texture
rectangle
texture2D et
texture
rectangle
texture2D
NV_float_buffer
ATI_texture_float NV_float_buffer
15
Le format de la texture
GL_LUMINANCE
GL_RGBA
17
18
19
20
Transfert de donnes
tableau (CPU)texture (GPU)
Pour transfrer les donnes vers les
textures il faut les associer des textures
cibles et ordonnancer le transfert avec des
appels OpenGL.
glBindTexture(texture_target, texID);
glTexSubImage2D(texture_target,0,0,0,texSize,texSize,
texture_format,GL_FLOAT,data);
21
Transfert de donnes
texture (GPU) tableau (CPU)
Il y a 2 faons pour implmenter le transfert des
textures GPU vers des tableaux CPU
Lapproche traditionnelle OpenGL moyennant un
appel glGetTexImage() qui permet dassocier une
texture une texture cible
glBindTexture(texture_target,texID);
glGetTexImage(texture_target,0,texture_format,GL_FLOAT,data);
24
GPGPU concept 2 :
kernel = shader
y = y + alpha * x
25
26
27
O placer le shader ?
Le code source dun shader peut tre
stock dans une chane de caractres ou
bien dans un fichier .cg et il sera accd
par OpenGL via le Cg runtime
28
Configuration du runtime Cg
Inclure lentte Cg
#include <cg\cg.h>// Cg Header
#include <cg\cggl.h>// Header spcifique Cg OpenGL
Initialisation du runtime Cg
void initCG(void) {
// set up Cg
cgContext = cgCreateContext();
fragmentProfile = cgGLGetLatestProfile(CG_GL_FRAGMENT);
cgGLSetOptimalOptions(fragmentProfile);
// create fragment program
fragmentProgram = cgCreateProgram (
cgContext,CG_SOURCE,program_source,
fragmentProfile,"saxpy",NULL);
// load program
cgGLLoadProgram (fragmentProgram);
// and get parameter handles by name
yParam = cgGetNamedParameter (fragmentProgram,"textureY");
xParam = cgGetNamedParameter (fragmentProgram,"textureX");
alphaParam = cgGetNamedParameter (fragmentProgram,"alpha");
}
30
GPGPU concept 3 :
Calculer = dessiner
Quatre tapes sont ncessaires :
Activation du noyaux en utilisant le Cg
runtime
Assignation des tableaux d entre et de
sortie au shader runtime Cg
Dclenchement du traitement
31
32
33
34
Etape 4 : Traitement
Rappelons ce que nous avons fait.
Activ un mapping 1:1 entre les pixels cibles, les coordonnes de
texture et la gomtrie
Prpar un fragment shader excuter sur chaque fragment
35
36
37