pstlspoc Index du Forum

pstlspoc
SPOC

 FAQFAQ   RechercherRechercher   MembresMembres   GroupesGroupes   S’enregistrerS’enregistrer 
 ProfilProfil   Se connecter pour vérifier ses messages privésSe connecter pour vérifier ses messages privés   ConnexionConnexion 

Intéropérabilité SPOC - OpenGL
Aller à la page: 1, 2, 3, 4, 5, 6, 7, 8  >
 
Poster un nouveau sujet   Répondre au sujet    pstlspoc Index du Forum -> pstlspoc -> pstlspoc
Sujet précédent :: Sujet suivant  
Auteur Message
sam
Administrateur

Hors ligne

Inscrit le: 15 Jan 2013
Messages: 83

MessagePosté le: Jeu 17 Jan - 16:56 (2013)    Sujet du message: Intéropérabilité SPOC - OpenGL Répondre en citant

Description
Description générale 
Les processeurs graphiques (GPU) ont considérablement évolué ces dernières années. D’outils dédiés à la visualisation, ils sont désormais devenus des accélérateurs de calcul programmables. Dans ce cadre, des environnements de développement sont proposés afin de permettre l’écriture de programmes de plus en plus généralistes. Actuellement, les deux principaux environnements sont Cuda et OpenCL. Ils sont fournis avec des bibliothèques de bas niveau pour les langages C et C++. Pour aider les programmeurs, des bibliothèques de plus haut niveau ont vu le jour. Nous avons développé une bibliothèque pour la programmation GPGPU (General Purpose GPU) dédiée au langage de programmation OCaml dans le cadre du projet OpenGPU. SPOC consiste en une extension à OCaml associée à une bibliothèque d’exécution. L’extension permet la déclaration de noyaux GPGPU externes utilisables depuis un programme OCaml, tandis que la bibliothèque permet de manipuler ces noyaux ainsi que les données nécessaires à leur exécution. SPOC offre, de plus, une abstraction supplémentaire en unifiant les deux environnements de développement GPGPU en une même bibliothèque. Enfin, SPOC abstrait les transferts mémoires via l’utilisation de jeux de données spécifiques. 
OpenGL (Open Graphics Library) est une spécification qui définit une API multiplate-forme pour la conception d’applications générant des images 3D (mais également 2D). Elle utilise en interne les représentations de la géométrie projective pour éviter toute situation faisant intervenir des infinis. Des bindings d’OpenGL existent pour OCaml. Il existe par ailleurs des bibliothèques d’interopération entre des données graphiques manipulées par OpenGL et des noyaux de calcul Cuda ou OpenCL. Ceci permet de réaliser l’ensemble calcul+affichage directement sur la carte graphique sans redonner la main au CPU. 
Dans ce projet on cherche à enrichir la bibliothèque SPOC pour permettre l’intéropérabilité avec les bibliothèques OpenGL OCaml existantes. 
Travail à réaliser 
La bibliothèque SPOC ne fait pas la liaison avec les fonctions d’interoperabilité avec OpenGL des bibliothèques Cuda et OpenCL. Il est alors demandé : 
  • en s’appuyant sur les bibliothèques OpenGL pour OCaml de fournir une bibliothèque pour SPOC pour la liaison avec OpenGL (soit pour OpenCL, soit pour Cuda).
  • de réaliser des exemples d’application exploitant OpenGL pour l’affichage et des noyaux de calcul manipulés par SPOC pour le traitement des données
  • d’effectuer des mesures de performance en comparant avec des implantations CPU et CPU-GPU sans interopérabilité
 
Liens


Revenir en haut
Publicité






MessagePosté le: Jeu 17 Jan - 16:56 (2013)    Sujet du message: Publicité

PublicitéSupprimer les publicités ?
Revenir en haut
Mathias


Hors ligne

Inscrit le: 23 Jan 2013
Messages: 57

MessagePosté le: Jeu 31 Jan - 15:41 (2013)    Sujet du message: Intéropérabilité SPOC - OpenGL Répondre en citant

suite à la réunion d'aujourd'hui...


Pour le projet il faut en particulier (mais pas uniquement) permettre a votre bibliothèque de manipuler des structures OpenGL via OpenCL.
Si on regarde la bibliothèque d'OpenCL on constate qu'il est possible d'utilisez trois types de structures avec les fonctions suivantes:
clCreateFromGLBuffer
clCreateFromGLTexture2D
clCreateFromGLTexture3D
clCreateFromGLRenderbuffer



Prenons l'exemple de VBO (GLBuffer).
La fonction OpenCL C prends en paramètre un GLuint qui représente le VBO normalement créé par la fonction OpenGL C glGenBuffers.


Ici nous utilisons une bibliothèque CAML avec des wrappers sur les fonctions et structures OpenGL et idem pour OpenCL.
MLGLite  permet de créer des VBO en CAML. Cette fonction créé les VBO via un appel a une fonction external C et les renvoie sous forme de structure CAML.
Il faut utiliser ce VBO CAML depuis votre fonction OpenCL (en CAML). Votre fonction CAML fera elle aussi appel à un (ou plusieurs) external C à qui il faudra passer en paramètre le VBO C
qui se trouve dans le VBO Caml.
Il vous faut donc regarder comment est construit ce VBO Caml dans MLGLite pour pouvoir dans votre bibliothèque récupérer le VBO C qu'il contient.


Attention, le VBO n'est pas la seule structure qu'il faudra étudier, pensez au contextes etc.
Regardez http://www.dyn-lab.com/articles/cl-gl.html pour plus d'infos sur la liaison OpenCL-OpenGL
Vos fonctions devront aussi manipuler des données CAML fournies par SPOC qu'il faudra passer a des fonctions C, donc même problème, il faudra récupérer la structure C depuis les données CAML etc


Revenir en haut
sam
Administrateur

Hors ligne

Inscrit le: 15 Jan 2013
Messages: 83

MessagePosté le: Sam 16 Fév - 19:02 (2013)    Sujet du message: Intéropérabilité SPOC - OpenGL Répondre en citant

J'essaye d'élaborer un exemple avec SPOC et OpenGL.
J'ai fait un glutWireSphere qui serait plutôt un glutDotSphere.
Le calcul est très lourd vraisemblablement sur CPU.
Le code Ocaml fonctionne (vue reste à régler).

J'ai un problème en ce qui concerne la compilation (intégrer au makefile glMlite).
Code:




/usr/local/lib/ocaml/../../bin/ocamlc -I "+glMLite" GL.cma Glu.cma Glut.cma vertArray.cma VBO.cma -custom -pp "/usr/local/lib/ocaml/../../bin/camlp4of -I /usr/local/lib/ocaml/spoc kernels_ext.cmo" str.cma bigarray.cma  unix.cma graphics.cma -verbose -I /usr/local/lib/ocaml/spoc -cclib -lpthread -cclib -lbigarray -cclib -lunix -g  spoc.cma sphere_spoc.cmo -o sphere_spoc.byte
+ gcc -o 'sphere_spoc.byte'   '-L/usr/local/lib/ocaml/glMLite' '-L/usr/local/lib/ocaml/spoc' '-L/usr/local/lib/ocaml' -Wl,-rpath,/usr/local/lib/ocaml -Wl,-rpath,/usr/local/lib/ocaml -lGL '/tmp/camlprimf32392.c' '-lspoc' '-lgraphics' '-lX11' '-lunix' '-lbigarray' '-lcamlstr' '-lVBO' '-L/usr/local/lib/ocaml' '-lbigarray' '-lGL' '-lvertArray' '-L/usr/local/lib/ocaml' '-lGL' '-lbigarray' '-lGlut' '-lglut' '-lGlu' '-lGLU' '-lpthread' '-lbigarray' '-lunix' '-lcamlrun' -I'/usr/local/lib/ocaml' -lm  -ldl -lcurses -lpthread
/tmp/ccQiSaPt.o:camlprimf32392.c:function caml_builtin_cprim: error: undefined reference to 'ml_glmatrixmode'
/tmp/ccQiSaPt.o:camlprimf32392.c:function caml_builtin_cprim: error: undefined reference to 'ml_glloadidentity'
/tmp/ccQiSaPt.o:camlprimf32392.c:function caml_builtin_cprim: error: undefined reference to 'ml_glclearcolor'
/tmp/ccQiSaPt.o:camlprimf32392.c:function caml_builtin_cprim: error: undefined reference to 'ml_glclear'
/tmp/ccQiSaPt.o:camlprimf32392.c:function caml_builtin_cprim: error: undefined reference to 'ml_glpushmatrix'
/tmp/ccQiSaPt.o:camlprimf32392.c:function caml_builtin_cprim: error: undefined reference to 'ml_glrotate'
/tmp/ccQiSaPt.o:camlprimf32392.c:function caml_builtin_cprim: error: undefined reference to 'ml_gltranslate'
/tmp/ccQiSaPt.o:camlprimf32392.c:function caml_builtin_cprim: error: undefined reference to 'ml_glscale'
/tmp/ccQiSaPt.o:camlprimf32392.c:function caml_builtin_cprim: error: undefined reference to 'ml_glpopmatrix'
/tmp/ccQiSaPt.o:camlprimf32392.c:function caml_builtin_cprim: error: undefined reference to 'ml_glbegin'
/tmp/ccQiSaPt.o:camlprimf32392.c:function caml_builtin_cprim: error: undefined reference to 'ml_glvertex3'
/tmp/ccQiSaPt.o:camlprimf32392.c:function caml_builtin_cprim: error: undefined reference to 'ml_glend'
collect2: erreur: ld a retourné 1 code d'état d'exécution
File "_none_", line 1:
Error: Error while building custom runtime system
make: *** [sphere_spoc.byte] Erreur 2
 



J'obtiens qd même un .nat mais j'ai des problème avec ces lignes ensuite:
Code:




(*let devices = Spoc.Devices.init;;
let dev1 = ref devices.(0);;
let dev2 = ref devices.(1);;
let auto_transfers = ref true;;*) 



Code:




ran@ran-700G7C:~/Bureau/SPOC-121217_modified/Samples/src/SphereSpoc$ make
/usr/local/lib/ocaml/../../bin/ocamlopt -I "+glMLite" GL.cmxa Glu.cmxa Glut.cmxa vertArray.cmxa VBO.cmxa -pp "/usr/local/lib/ocaml/../../bin/camlp4of -I /usr/local/lib/ocaml/spoc kernels_ext.cmo" str.cmxa bigarray.cmxa unix.cmxa graphics.cmxa -verbose  -I /usr/local/lib/ocaml/spoc -cclib -lpthread -cclib -lbigarray -cclib -lunix -g spoc.cmxa -c sphere_spoc.ml  
+ /usr/local/lib/ocaml/../../bin/camlp4of -I /usr/local/lib/ocaml/spoc kernels_ext.cmo 'sphere_spoc.ml' > /tmp/ocamlpp9ad57d
File "sphere_spoc.ml", line 98, characters 41-48:
Error: This expression has type
         ?only:Spoc.Devices.specificLibrary ->
         unit -> Spoc.Devices.device array
       but an expression was expected of type 'a array
make: *** [sphere_spoc.cmx] Erreur 2 




Le code de la Sphere Paresseuse est ici:
http://www.sendspace.com/file/0kc0u3




Revenir en haut
Mathias


Hors ligne

Inscrit le: 23 Jan 2013
Messages: 57

MessagePosté le: Sam 16 Fév - 19:52 (2013)    Sujet du message: Intéropérabilité SPOC - OpenGL Répondre en citant

sam a écrit:
J'obtiens qd même un .nat mais j'ai des problème avec ces lignes ensuite:
Code:
(*let devices = Spoc.Devices.init;;
let dev1 = ref devices.(0);;
let dev2 = ref devices.(1);;
let auto_transfers = ref true;;*) 

Code:

ran@ran-700G7C:~/Bureau/SPOC-121217_modified/Samples/src/SphereSpoc$ make
/usr/local/lib/ocaml/../../bin/ocamlopt -I "+glMLite" GL.cmxa Glu.cmxa Glut.cmxa vertArray.cmxa VBO.cmxa -pp "/usr/local/lib/ocaml/../../bin/camlp4of -I /usr/local/lib/ocaml/spoc kernels_ext.cmo" str.cmxa bigarray.cmxa unix.cmxa graphics.cmxa -verbose  -I /usr/local/lib/ocaml/spoc -cclib -lpthread -cclib -lbigarray -cclib -lunix -g spoc.cmxa -c sphere_spoc.ml  
+ /usr/local/lib/ocaml/../../bin/camlp4of -I /usr/local/lib/ocaml/spoc kernels_ext.cmo 'sphere_spoc.ml' > /tmp/ocamlpp9ad57d
File "sphere_spoc.ml", line 98, characters 41-48:
Error: This expression has type
         ?only:Spoc.Devices.specificLibrary ->
         unit -> Spoc.Devices.device array
       but an expression was expected of type 'a array
make: *** [sphere_spoc.cmx] Erreur 2 










Type de la fonction init
   

 
Code:
Spoc.Devices.init;;
- : ?only:Spoc.Devices.specificLibrary -> unit -> Spoc.Devices.device array =
<fun>
 













C'est à dire que cette fonction prends deux paramètres: 
- un paramètre optionel pour définir si l'on e veut QUE Cuda ou OpenCL du genre ~only:Spoc.Devices.Cuda ou ~only:Spoc.Devices.OpenCL
- un ()
et retourne un tableau de vecteurs.


Dans votre code: 

 
Code:
let devices = Spoc.Devices.init;;
let dev1 = ref devices.(0);;
let dev2 = ref devices.(1);;
let auto_transfers = ref true;;

  
 





devices est une fonction (il manque le paramètre () pour l'appeler et récupérer sa valeur), du coup dev1 fait une erreur de type car vous utilisez devices (qui est une fonction) comme un tableau.


Le code correct serait :

 
Code:
let devices = Spoc.Devices.init ();;
let dev1 = ref devices.(0);;
let dev2 = ref devices.(1);;
let auto_transfers = ref true;;
 






Bon courage pour la suite!


Revenir en haut
Mathias


Hors ligne

Inscrit le: 23 Jan 2013
Messages: 57

MessagePosté le: Sam 16 Fév - 19:56 (2013)    Sujet du message: Intéropérabilité SPOC - OpenGL Répondre en citant

PS/ si vous n'êtes pas trop à l'aise avec les arguments optionnels vous pouvez jeter un oeil par ici:
http://caml.inria.fr/pub/docs/u3-ocaml/ocaml051.html


Revenir en haut
sam
Administrateur

Hors ligne

Inscrit le: 15 Jan 2013
Messages: 83

MessagePosté le: Sam 16 Fév - 20:27 (2013)    Sujet du message: Intéropérabilité SPOC - OpenGL Répondre en citant

L'indication fonctionne bien.
J'irais voir le lien, sur les arguments optionnels.
Merci.


Revenir en haut
sam
Administrateur

Hors ligne

Inscrit le: 15 Jan 2013
Messages: 83

MessagePosté le: Dim 17 Fév - 17:51 (2013)    Sujet du message: Intéropérabilité SPOC - OpenGL Répondre en citant

Dans le sample Game.ml, j'ai du mal à comprendre ce bout de code:
Code:
...
        let compute tab dev queue =
          game#run (tab, !max_gen, !largeur, !hauteur) (block, grid) queue  dev;       
          game#run (tab, !max_gen, !largeur, !hauteur) (block, grid) queue dev;       
        in
         
          Spoc.Kernel.run !dev1 (block,grid) game (b_iter1, !max_gen, !largeur, !hauteur);
...

 on déclare une fonction compute local pour garder block et grid en porté mais on apelle 2 fois la ligne ci-dessous?



Code:
game#run (tab, !max_gen, !largeur, !hauteur) (block, grid) queue  dev;


Ensuite on apelle game de game.cl mais alors à quoi sert Spoc.kernel.run ...game...


Il me semble que l'on avait vu tout cela Mardi dernier mais n'ayant pas fait de compte rendu de réunion je pense que j'ai oublié. dsl.


Revenir en haut
Mathias


Hors ligne

Inscrit le: 23 Jan 2013
Messages: 57

MessagePosté le: Dim 17 Fév - 17:55 (2013)    Sujet du message: Intéropérabilité SPOC - OpenGL Répondre en citant

là dans ce que je lis de l'exemple, compute est une fonction (est-elle appelée qquepart?) elle lance le kernel game.cl (2 fois).
Le code d'en dessous lance le kernel aussi mais n'utilise pas la fonciton compute (peut-être plus loin). 


attention :  Kernel.run dev (block,grid) k ...  = k#run ... (block,grid) queue dev
Ce sont 2 façons de faire la même chose.




Pour la queue, vous pouvez mettre 0 tout le temps, on en discutera là prochaine fois.


Revenir en haut
sam
Administrateur

Hors ligne

Inscrit le: 15 Jan 2013
Messages: 83

MessagePosté le: Dim 17 Fév - 18:04 (2013)    Sujet du message: Intéropérabilité SPOC - OpenGL Répondre en citant

D'accord je comprends mieux.
Merci.


Revenir en haut
sam
Administrateur

Hors ligne

Inscrit le: 15 Jan 2013
Messages: 83

MessagePosté le: Mer 20 Fév - 23:19 (2013)    Sujet du message: Intéropérabilité SPOC - OpenGL Répondre en citant

Mon programme fonctionne, je peux passer d'une sphere calculer par le CPU à une sphere calculer par le GPU Ocaml/Spoc/glMlite.
Mais en mode GPU, au bout de quelque secondes le programme se ferme et j'obtiens le message d'erreur ci-dessous:
Citation:



IN: spoc_opencl_flush@ 292
Fatal error: exception OpenCL.INVALID_COMMAND_QUEUE



D'après vous de quel coté devrais regarder? kernel ou mon code SPOC?

Version 2.0 Sphère paresseuse:
http://www.sendspace.com/file/nog1v0


Revenir en haut
Mathias


Hors ligne

Inscrit le: 23 Jan 2013
Messages: 57

MessagePosté le: Mer 20 Fév - 23:25 (2013)    Sujet du message: Intéropérabilité SPOC - OpenGL Répondre en citant

Est-ce que la version Cuda marche mieux?  Vérifiez les tailles block/grid et qu'il n'y a pas de sortie du tableau sur le kernel.


Par ailleurs, si j'ai bien regardé pour l'instant votre programme calcule les points sur GPU puis récupère sur CPU la liste des points et l'affiche via OpenGL?


Revenir en haut
sam
Administrateur

Hors ligne

Inscrit le: 15 Jan 2013
Messages: 83

MessagePosté le: Mer 20 Fév - 23:32 (2013)    Sujet du message: Intéropérabilité SPOC - OpenGL Répondre en citant

Je n'ai pas testé la version Cuda mais je vais essayer.

Mon programme est bien censé que vous décrivez. Est-ce un mauvais test de performances? Je peux augmenter le nombre de points à afficher.


Revenir en haut
Mathias


Hors ligne

Inscrit le: 23 Jan 2013
Messages: 57

MessagePosté le: Mer 20 Fév - 23:34 (2013)    Sujet du message: Intéropérabilité SPOC - OpenGL Répondre en citant

Nan, c'est bien pour commencer, on pourra en discuter demain. Ce qu'il faudrait (a terme) c'est remplacer le tableau de points par une structure partagée entre SPOC et OpenGL pour éviter le retour CPU.Mais déjà, ce serait bien de faire tourner cet exemple ^^

Revenir en haut
sam
Administrateur

Hors ligne

Inscrit le: 15 Jan 2013
Messages: 83

MessagePosté le: Mer 20 Fév - 23:35 (2013)    Sujet du message: Intéropérabilité SPOC - OpenGL Répondre en citant

En ce qui concerne les block/grid je ne suis pas sûr d'avoir bien compris comment configuré.
Je vais vérifier s'il y a une sortie du tableau sur le kernel, mais je pensais qu'à l'éxécution j'aurais un seg fault.


Revenir en haut
sam
Administrateur

Hors ligne

Inscrit le: 15 Jan 2013
Messages: 83

MessagePosté le: Mer 20 Fév - 23:38 (2013)    Sujet du message: Intéropérabilité SPOC - OpenGL Répondre en citant

Oui je comptais d'ailleurs faire ce simple exemple et me lancer dans l'intéropérabilité, VBO Texture objet (j'ai mieux compris les enjeux maintenant que j'ai commencer à coder), pour tout faire sur GPU.

Revenir en haut
Contenu Sponsorisé






MessagePosté le: Aujourd’hui à 05:04 (2018)    Sujet du message: Intéropérabilité SPOC - OpenGL

Revenir en haut
Montrer les messages depuis:   
Poster un nouveau sujet   Répondre au sujet    pstlspoc Index du Forum -> pstlspoc -> pstlspoc Toutes les heures sont au format GMT + 1 Heure
Aller à la page: 1, 2, 3, 4, 5, 6, 7, 8  >
Page 1 sur 8

 
Sauter vers:  

Index | Panneau d’administration | creer un forum | Forum gratuit d’entraide | Annuaire des forums gratuits | Signaler une violation | Conditions générales d'utilisation
Powered by phpBB © 2001, 2005 phpBB Group
Traduction par : phpBB-fr.com