Optimiser une boucle en OpenCL

Optimiser une boucle en OpenCL - C++ - Programmation

Marsh Posté le 18-06-2012 à 09:01:49    

Bonjour,
J'ai une boucle du type :
 
 

Code :
  1. for (i=0; i<1000;i++){
  2.   for (k=0; i<=2;i++){
  3.      a[i][0][k]=Noeud[Triangle[i][0]][k];
  4.      a[i][1][k]=Noeud[Triangle[i][1]][k];
  5.      a[i][2][k]=Noeud[Triangle[i][2]][k];
  6.   }
  7. }


 
avec  
Triangle[i][0], l'index (int) du premier noeud du triangle i
Triangle[i][1], l'index (int) du deuxieme noeud du triangle i
 
Noeud[Triangle[i][0]][0] :la premiere coordonnée du premier noeud du triangle i
Noeud[Triangle[i][0]][1] :la deuxieme coordonnée du premier noeud du triangle i
....
 
J'aimerai faire cette boucle en OpenCL
J'ai donc modifié mes tableaux pour qu'ils ne soient à une seule entrée donc mon Noeud[][] devient Noeud2[] avec les trois premieres valeurs les coordonnées du premier point, puis les 3 suivantes les coordonnees du second point ...
Triangle[][] devient Triangle2[] avec les 3 premières valeurs, qui sont les index des 3 noeuds du premier triangle, puis les 3 valeurs suivante sont les index des noeuds du second triangle ...  
 
Maintenant mon soucis est l'écriture du .cl
 
J'aimerais mettre en place la boucle ci dessus mais je ne sais pas trop comment marche cette histoire de  
int id = get_global_id(0);
et apres faire "une boucle" avec id en incrementeur ...
 
Si vous pouviez m'éclairer ?
 
 
 


---------------
http://www.jppanaget.com
Reply

Marsh Posté le 18-06-2012 à 09:01:49   

Reply

Marsh Posté le 19-06-2012 à 11:28:44    

le global_id te renvoit l'identifiant de ton thread OpenCL. Il represente un thread sur ta grille de thread.

 

La technique usuelle consiste a "peler" les nids de boucle externes et les remplacer par un acces via ce id:

 
Code :
  1. int id = get_global_id(0);
  2.   for (k=0; i<=2;i++){
  3.      a[id][0][k]=Noeud[Triangle[id][0]][k];
  4.      a[id][1][k]=Noeud[Triangle[id][1]][k];
  5.      a[id][2][k]=Noeud[Triangle[id][2]][k];
  6.   }
 

Ensuite, side note, la boucle de 0 a 2, tu me feras plaisir de la derouler a la main.


Message édité par Joel F le 19-06-2012 à 11:29:38
Reply

Marsh Posté le 19-06-2012 à 22:37:24    

Merci pour ta réponse. Mais est-il possible de mettre en argument du kernel, un tableau de plusieurs dimensions ?


---------------
http://www.jppanaget.com
Reply

Marsh Posté le 20-06-2012 à 07:41:30    

De memoire non, il faut le lineariser

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed