IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

OpenCL Discussion :

Bases d'OpenCL et interfaçage OpenGL


Sujet :

OpenCL

  1. #1
    Membre confirmé Avatar de TNT89
    Inscrit en
    Juillet 2007
    Messages
    358
    Détails du profil
    Informations personnelles :
    Âge : 34

    Informations forums :
    Inscription : Juillet 2007
    Messages : 358
    Points : 615
    Points
    615
    Par défaut Bases d'OpenCL et interfaçage OpenGL
    Bonjour,

    J'ai quelques problèmes pour réussir à mettre en pratique OpenCL dans un bout de code simple : je réalise dans un premier temps une simple "copie" vers la mémoire du GPU puis une simple copie vers la mémoire vive.
    Après avoir initialisé avec succès OpenCL, j'essaie le code suivant :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
     
    #define TMPSIZE 100
     
    char* tmpData = new char[TMPSIZE];
    memset(tmpData, 127, TMPSIZE);
     
    //Envoi
    cl_mem mm1 = clCreateBuffer(HdlOCL::context(), CL_MEM_READ_WRITE | CL_MEM_USE_HOST_PTR, TMPSIZE, tmpData, HdlOCL::errorFB());
    std::cout << "After sending : "; HdlOCL::getErrors();
     
    //modification en RAM
    memset(tmpData, 0, TMPSIZE);
     
    // Sécurité
    clFinish(HdlOCL::queue());
     
    //Réception
    (*HdlOCL::errorFB()) = clEnqueueReadBuffer(HdlOCL::queue(), mm1, CL_TRUE, 0, TMPSIZE, tmpData, 0, NULL, NULL);
    std::cout << "After receiving : "; HdlOCL::getErrors();
     
    //Test
    if(tmpData[0]!=0) std::cout << "Test succeed" << std::endl;
    else              std::cout << "Test failed"  << std::endl;
     
    delete[] tmpData;
    OpenCL ne retourne aucune erreur mais j'obtiens le message suivant "Test failed" (!). (le buffer reste à zéro)

    Dans un second temps, je dois réaliser un boucle de retour pour récupérer rapidement des informations issues d'OpenGL. Là aussi, l'initialisation fonctionne correctement, tout comme clEnqueueAcquireGLObjects et clEnqueueReleaseGLObjects. Mais dès que j'essaie d'utiliser clEnqueueReadBuffer ou clEnqueueReadImage ils me retournent tous CL_INVALID_VALUE.

    Auriez-vous des pistes à me proposer?

    Merci d'avance!

    EDIT
    Windows 7 x64 - GTX 280M - Drivers 257.21 - OpenCL 1.1

    EDIT
    Pour le premier problème, tout fonctionne parfaitement avec l'utilisation de clEnqueueWriteBuffer à la place de l'initalisation automatique proposée par clCreateBuffer.

  2. #2
    Membre éprouvé Avatar de oxyde356
    Homme Profil pro
    Ingénieur Recherche Imagerie
    Inscrit en
    Février 2006
    Messages
    797
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur Recherche Imagerie

    Informations forums :
    Inscription : Février 2006
    Messages : 797
    Points : 1 087
    Points
    1 087
    Par défaut
    Essaye sur une carte ATI t'aura plus de chances xD

  3. #3
    Membre confirmé Avatar de TNT89
    Inscrit en
    Juillet 2007
    Messages
    358
    Détails du profil
    Informations personnelles :
    Âge : 34

    Informations forums :
    Inscription : Juillet 2007
    Messages : 358
    Points : 615
    Points
    615
    Par défaut
    Petite correction pour le premier problème : il suffisait d'utiliser

    par


    Par contre pour l'interfaçage CL/GL je bloque toujours... Quelqu'un aurait des exemple d'utilisation de texture OpenGL sous OpenCL?

    Merci

  4. #4
    Membre habitué
    Profil pro
    Dev
    Inscrit en
    Mai 2009
    Messages
    257
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Dev

    Informations forums :
    Inscription : Mai 2009
    Messages : 257
    Points : 190
    Points
    190
    Par défaut
    Citation Envoyé par oxyde356 Voir le message
    Essaye sur une carte ATI t'aura plus de chances xD
    un peu d'indulgence, ils y mettent tout leur petit coeur

  5. #5
    Membre éclairé Avatar de MatRem
    Profil pro
    Inscrit en
    Décembre 2002
    Messages
    750
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2002
    Messages : 750
    Points : 693
    Points
    693
    Par défaut
    Voilà un petit exemple de partage d'une texture entre OpenGL 3.3 et OpenCL 1.1 (ou 1.0).
    Elle est mise à jour continuellement par un kernel un peu bidon , et affichée sur un quad screen space.

    C'est codé sous linux kubuntu 10.04 64bits sur une geForce 9800gt avec des pilotes NVIDIA-Linux-x86_64-256.35, donc il faudra peut être adapter ça à ta platforme, notament la création du context.

    http://virtrev.git.sourceforge.net/g...aa1be2;hb=HEAD

    ps : j'utilise ici directement les APIS OpenCL et OpenGL dans un but pédagogique, sinon j'avoue que je préfère utiliser des bindings c++ plus haut niveau, pareil pour glut

  6. #6
    Membre éclairé Avatar de MatRem
    Profil pro
    Inscrit en
    Décembre 2002
    Messages
    750
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2002
    Messages : 750
    Points : 693
    Points
    693
    Par défaut
    Attention il y a une méchante erreur à l'allocation de textureData, il ne faut pas oublier de multiplier par 4, ou de passer sur une composante.

    Sinon ça tourne aussi sous windows (sur du material nvidia), en utilisant glew, et en créant le context de cette façon :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    //Context
      cl_context_properties properties[] =
      {
        CL_CONTEXT_PLATFORM, reinterpret_cast<cl_context_properties>(cl::platform),
        CL_GL_CONTEXT_KHR, reinterpret_cast<cl_context_properties>(wglGetCurrentContext()),
        CL_WGL_HDC_KHR, reinterpret_cast<cl_context_properties>(wglGetCurrentDC()),
        0
      };
     
      cl::context = clCreateContext( properties, 1, &cl::device, NULL, NULL, &errcode_ret);
      print_cl_error( errcode_ret, "clCreateContext" );

  7. #7
    Membre confirmé Avatar de TNT89
    Inscrit en
    Juillet 2007
    Messages
    358
    Détails du profil
    Informations personnelles :
    Âge : 34

    Informations forums :
    Inscription : Juillet 2007
    Messages : 358
    Points : 615
    Points
    615
    Par défaut
    Ok merci, en fait j'ai réussi à résoudre mon problème mais de façon incomplète :
    Il semblerait qu'une fois une ressource OpenGL mappé avec OpenCL on ne puisse pas lire/écrire/copier celle-ci via les routines habituelles clEnqueueReadImage/clEnqueueWriteImage/clEnqueueCopyImage.

    Il faut absolument repasser par une étape de Kernels...
    voilà!


  8. #8
    Membre éclairé Avatar de MatRem
    Profil pro
    Inscrit en
    Décembre 2002
    Messages
    750
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2002
    Messages : 750
    Points : 693
    Points
    693
    Par défaut
    Oui effectivement ça ne fonctionne pas, et à mon avis c'est un bug des pilotes.

    d'autres on le problème :
    http://www.khronos.org/message_board...hp?f=37&t=3030

  9. #9
    Membre confirmé Avatar de TNT89
    Inscrit en
    Juillet 2007
    Messages
    358
    Détails du profil
    Informations personnelles :
    Âge : 34

    Informations forums :
    Inscription : Juillet 2007
    Messages : 358
    Points : 615
    Points
    615
    Par défaut


    Euh, en fait c'est moi aussi ^^

    Par contre, d'autre personnes ont les mêmes symptômes sur les forums NVidia dédiés à OpenCL. Je pencherai pour un bug de driver en effet...

    Personnellement, c'est pas ce qui me dérangera le plus, j'aurai eu besoin d'une étape de traitement, donc de passer par des kernels de toute façon...

  10. #10
    Membre éclairé Avatar de MatRem
    Profil pro
    Inscrit en
    Décembre 2002
    Messages
    750
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2002
    Messages : 750
    Points : 693
    Points
    693
    Par défaut
    Le monde est petit

    J'ai créé un blog sur le sujet :http://virtrev.blogspot.com/2010/08/...te-opengl.html

    Ça pourra peut être, être utile à ceux qui passent par là .

  11. #11
    Candidat au Club
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    3
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 3
    Points : 2
    Points
    2
    Par défaut
    Petit up, j'ai le même problème. nVidia 470, derniers drivers, donc ça doit venir de moi

    Bouts de code :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    // Création de la texture côté GL
    glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, 512, 512, 0, GL_RGBA, GL_UNSIGNED_BYTE, NULL);
    // Création de l'image côté CL
    cl_mem imageObject = clCreateFromGLTexture2D(context(), CL_MEM_WRITE_ONLY, GL_TEXTURE_2D, 0, TextureName, &err);
     
     
    // Appel du kernel
    clEnqueueAcquireGLObjects(queue(), 1, &imageObject, 0,0,0);
    queue.enqueueNDRangeKernel(kernel, cl::NullRange, cl::NDRange(512, 512),  cl::NDRange(1, 1), NULL, &event);
     event.wait();
    clEnqueueReleaseGLObjects(queue(), 1, &imageObject, 0,0,0);
    clFinish(queue());
    Jusque là tout semble marcher (i.e aucune erreur, ni CL, ni GL). Mais quand je veux utiliser le résultat :

    - soit en recopiant vers le CPU:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    const size_t origin[3] = {0,0,0};
    const size_t region[3] = {512,512,1};
     
    unsigned char *  ptr = new unsigned char[512*512*4];
    err= clEnqueueReadImage(queue(), imageObject, CL_TRUE, origin, region, 0, 0, ptr, 0, NULL, NULL);
    checkErr(err, "clEnqueueReadBuffer");
     
    // Ca ya pas de raison que ça marche, mais dans le doute...
    err= clEnqueueReadBuffer(queue(), imageObject, CL_TRUE, 0, 512 * 512, ptr, 0, NULL, NULL);
    checkErr(err, "clEnqueueReadBuffer");
    dans les deux cas, err = CL_INVALID_VALUE

    - soit en le lisant dans un shader, ça retourne du noir (ou plus précisément, ça retourne la texture spécifiée dans glTexImage2D, donc c'est juste que le kernel ne fait rien...)


    Chose étrange, tout marche quand je passe la texture en float, même avec 4 composants. Ya ptet un truc que j'ai loupé dans la spec.

    PS : Hey mat, content de te recroiser. Merci pour le lien, c'est peu expliqué (surtout le blogspot) mais très compréhensible. Dis à Ghislain qu'il avait un mail à m'envoyer
    Arnaud

Discussions similaires

  1. Réponses: 5
    Dernier message: 05/06/2010, 00h48
  2. Réponses: 1
    Dernier message: 31/05/2009, 14h04
  3. Réponses: 13
    Dernier message: 01/09/2006, 15h57
  4. problème d'interfaçage d'une base Mysql
    Par zidenne dans le forum Installation
    Réponses: 4
    Dernier message: 19/04/2006, 18h49

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo