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

C++ Discussion :

CUDA, C++, Qt : Sortie anticip�e de fonction


Sujet :

C++

  1. #1
    Futur Membre du Club
    Profil pro
    Ing�nieur d�veloppement logiciels
    Inscrit en
    Juin 2009
    Messages
    3
    D�tails du profil
    Informations personnelles :
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activit� : Ing�nieur d�veloppement logiciels
    Secteur : A�ronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Juin 2009
    Messages : 3
    Par d�faut CUDA, C++, Qt : Sortie anticip�e de fonction
    Bonjour !

    Je travaille actuellement � la cr�ation d'une librairie C++ (sous linux) qui utilise CUDA pour une partie des calculs. Tout ceci est effectu� avec l'IDE QtCreator et donc l'utilisation de l'API qui va avec.

    Je vous expose donc mon probl�me :
    Lors d'une �tape du calcul j'instancie un thread pour garder la main
    Dans le thread j'appelle une fonction CUDA d�finie dans un fichier .cu
    A la suite de cette instruction je recopie le r�sultat et termine le thread.

    Mais les instructions suivant l'appel CUDA ne sont jamais ex�cut�es, je l'ai v�rifi� � l'aide de gdb (quand l'appel est comment� les points d'arr�t sont atteints mais sinon ils ne sont jamais rencontr�s)

    Je me doute qu'il y a une explication enfantine mais j'avoue avoir atteint les limites de ma patience pour le moment Si jamais l'un de vous avait une info ou un bon lien � m'indiquer je serais preneur !

    Merci d'avance.

    [EDIT: un petit bout 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
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
     
    void FonctionPrincipale(){
      QMutexLocker ml(&mMutex);
      WorkThread* wthread = new WorkThread(this);
      wthread->start();
    }
     
    void WorkThread::run()
    {
      //initialisation de variables
      FonctionCuda(Parametre p1);
      //autres instructions jamais exécutées
    }
     
    /**Fichier .cu **/
    __host__ void FonctionCuda(Parametre p1)
    {
      double *a_cuda;
        double *b_cuda;
        unsigned int nBytes = sizeof(double) * n;
        int threadsPerBlock = 256;
        int blocksPerGrid   = (n + threadsPerBlock - 1) / threadsPerBlock;
     
        // allocate and copy memory into the device
        cudaMalloc((void **)& a_cuda, nBytes);
        cudaMalloc((void **)& b_cuda, nBytes);
        cudaMemcpy(b_cuda, a, nBytes, cudaMemcpyHostToDevice);
        compute<<<blocksPerGrid, threadsPerBlock>>>(b_cuda,a_cuda);
        cudaMemcpy(a, a_cuda, n*sizeof(double),cudaMemcpyDeviceToHost);
        cudaFree(a_cuda);
        cudaFree(b_cuda);
    }

  2. #2
    Inactif  


    Homme Profil pro
    Inscrit en
    Novembre 2008
    Messages
    5 288
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    �ge : 49
    Localisation : France, Rh�ne (Rh�ne Alpes)

    Informations professionnelles :
    Secteur : Sant�

    Informations forums :
    Inscription : Novembre 2008
    Messages : 5 288
    Par d�faut
    Bonjour et bienvenue sur le forum

    Classiquement, c'est un probl�me de config de ta compilation. Tu appelles comment nvcc ?

    Sinon, les appels des fonctions cuda est asynchrone, �a ne sert � rien de threader les appels (sauf si tu mets des barri�res... mais �a serait idiot de mettre des barri�res pour mettre dans un threas apr�s)

  3. #3
    Membre �clair� Avatar de LinuxUser
    Inscrit en
    Avril 2007
    Messages
    857
    D�tails du profil
    Informations forums :
    Inscription : Avril 2007
    Messages : 857
    Par d�faut
    On peut voir le kernel?

    Et o� est d�clar� ce que tu copies sur le device, ta variable appel�e "a"?

  4. #4
    Futur Membre du Club
    Profil pro
    Ing�nieur d�veloppement logiciels
    Inscrit en
    Juin 2009
    Messages
    3
    D�tails du profil
    Informations personnelles :
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activit� : Ing�nieur d�veloppement logiciels
    Secteur : A�ronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Juin 2009
    Messages : 3
    Par d�faut
    Bonjour � vous deux et merci pour vos r�ponses

    Citation Envoy� par LinuxUser Voir le message
    On peut voir le kernel?

    Et o� est d�clar� ce que tu copies sur le device, ta variable appel�e "a"?
    La variable est d�clar�e dans le run du WorkThread
    Le kernel est un "dummie krenel" il ne fait que faire l'addition du tableau avec lui-m�me. Par ailleurs il fonctionne, car si je fait des affichages du tableau "a" j'ai bien des r�sultats coh�rents. Le code que je vous ai fourni se veut descriptif car je ne peux pas fournir le "vrai" code (employeur tatillon )

    Citation Envoy� par gbdivers Voir le message
    Bonjour et bienvenue sur le forum

    Classiquement, c'est un probl�me de config de ta compilation. Tu appelles comment nvcc ?

    Sinon, les appels des fonctions cuda est asynchrone, �a ne sert � rien de threader les appels (sauf si tu mets des barri�res... mais �a serait idiot de mettre des barri�res pour mettre dans un threas apr�s)
    Pour ce qui est de l'appel � nvcc il est fait � l'aide de QMake, je me suis inspir� du Tutoriel Cuda partie VII-C.

    Pour ce qui est du threading, mon projet est un "plugin" qui doit s'imbriquer dans une application lourde en C++. Cette derni�re doit effectuer des appel asynchrones pour le lancement des calculs car il y aura plusieurs plugins diff�rents. C'est pour cela que je cr�e un thread pour le travail. Il y aurait peut-�tre une meilleur solution ?

    Je vais me concentrer sur la configuration de ma compilation et reviendrais vers vous quand j'aurais progress�

    Merci encore !

    [EDIT] J'oubliais, j'ai cr�� un mutex que je bloque avant d'appeler thread.start(); mais comme l'appel de la fonction Cuda est asynchrone je ne peux pas �tre assur� que cette derni�re sera termin�e ... je vais creuser de ce cot�

  5. #5
    Membre �prouv�
    Profil pro
    Inscrit en
    Mars 2010
    Messages
    118
    D�tails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2010
    Messages : 118
    Par d�faut
    As-tu lu la doc?

    Si la fonction est asynchrone alors il y a forc�ment un m�canisme pour savoir quand les r�sultats sont disponible.

  6. #6
    Futur Membre du Club
    Profil pro
    Ing�nieur d�veloppement logiciels
    Inscrit en
    Juin 2009
    Messages
    3
    D�tails du profil
    Informations personnelles :
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activit� : Ing�nieur d�veloppement logiciels
    Secteur : A�ronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Juin 2009
    Messages : 3
    Par d�faut
    Bon, en r�alit� ce que je pensais �tre un probl�me, n'�tait qu'une ex�cution normale (je ne suis pas encore assez familier avec Cuda).

    Le r�el probl�me �tait l'acc�s � une variable par le main alors que cette derni�re devait �tre remplie par la partie cuda du programme (qui �tait alors toujours en cours d'ex�cution). Je pensais avoir correctement effectu� le contr�le � l'aide de mutex mais �a n'�tait pas exact. Du coup en bloquant et d�bloquant mon mutex "� la main" (sans utiliser le QMutexLocker) cela fonctionne parfaitement.

    Merci encore � vous deux de m'avoir accompagn� dans ma r�flexion

    [EDIT] @Backlash : tu avais raison

  7. #7
    Inactif  


    Homme Profil pro
    Inscrit en
    Novembre 2008
    Messages
    5 288
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    �ge : 49
    Localisation : France, Rh�ne (Rh�ne Alpes)

    Informations professionnelles :
    Secteur : Sant�

    Informations forums :
    Inscription : Novembre 2008
    Messages : 5 288
    Par d�faut
    A lire : CUDA C Programming Guide - Asynchronous Concurrent Execution, en particulier les parties sur __syncthreads() et les events

+ R�pondre � la discussion
Cette discussion est r�solue.

Discussions similaires

  1. R�ponses: 28
    Dernier message: 17/01/2008, 18h15
  2. lire la sortie d'une fonction linux
    Par NexRezzo dans le forum C
    R�ponses: 2
    Dernier message: 02/12/2007, 01h08
  3. Variable de sortie de la fonction Imcontour
    Par emilieGre dans le forum Images
    R�ponses: 3
    Dernier message: 18/07/2007, 12h49
  4. Execution a la sortie d'une fonction
    Par cococococococo dans le forum Interfaces Graphiques
    R�ponses: 2
    Dernier message: 10/07/2007, 14h21
  5. sortie anticip� d'une proc�dure
    Par patou41000 dans le forum C++/CLI
    R�ponses: 2
    Dernier message: 30/04/2007, 10h09

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