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

CUDA Discussion :

Gestion des données, des threads, etc.


Sujet :

CUDA

  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Décembre 2012
    Messages
    16
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2012
    Messages : 16
    Par défaut Gestion des données, des threads, etc.
    Bonjour,

    Je suis en train d'écrire mon premier code en CUDA. J'ai déjà alloué la mémoire, transformé toutes mes classes pour qu'elles soient compatibles sur le device. En ce moment, je rencontre un problème lié à la gestion de données par thread car je ne sais pas trop comment m'y prendre (même si j'ai lu pas mal d'exemples).
    Je pensais commencer par quelque chose de simple prendre une grille de dimension (1,1,1) avec un seul block de dimension (1024,1,1).

    J'ai un nombre de 10^5 particules (par ex) qui sont indépendantes et qui subissent diverses opérations.
    Je souhaite les répartir sur les threads et dès qu'un thread a fini, récupérer l'information si nécessaire et relancer si il reste encore des particules. (1 particule / thread)
    Le programme s'arrête dès que toutes les particules ont été lancées. Je fais la copie des résultats sur le cpu.

    Je ne sais pas par où commencer ?

    Merci d'avance.

  2. #2
    Membre très actif Avatar de Matthieu76
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Mars 2013
    Messages
    568
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Consultant informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2013
    Messages : 568
    Par défaut
    Bonjour, déjà :

    Citation Envoyé par Absynthe12 Voir le message
    Je pensais commencer par quelque chose de simple prendre une grille de dimension (1,1,1) avec un seul block de dimension (1024,1,1).
    .
    C'est pas plutôt (1,1,1024) que tu dois utiliser ?

    Ensuite tout dépends de combien de particule tu as, mais si tu en as moins de 1024, c'est "simple", tu écris ta fonction de traitement et ensuite tu l'appelles en passant l'indice 0 de ton tableau de particules, un truc du genre :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    void traitementParticules<<<1, 1, n>>>(float *TableauDeParticule, float *TableauDeResultats); //avec n ton nombre de particules
    En faite tu passes le pointeur de ton tableau de résultat en argument de ta fonction.

    PS : J'espère que tu es très à l'aise en C et que tu codes beaucoup sinon ce n'est pas la peine de faire du CUDA.

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Décembre 2012
    Messages
    16
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2012
    Messages : 16
    Par défaut
    Bonjour,
    Merci pour la réponse.

    Pourquoi (1,1,1024) ?

    La solution que vous proposez est intéressante. Mais je pensais plus à quelque chose du style
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    traitementParticules<<<1, 1>>>(float *TableauDeParticule, float *TableauDeResultats, int *nParticulesRestantes, int *nParticulesLancées);
    L'idée étant d'initialiser une particule pour chaque thread et dès que le thread finit de traiter une particule, il regarde le nb de particules restantes et il en appelle une nouvelle.

    Vous en pensez quoi ?

    Après je fais du cuda/cpp mais la programmation n'est pas un soucis, c'est la durée des simulations que je souhaite diminuer.

  4. #4
    Membre très actif Avatar de Matthieu76
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Mars 2013
    Messages
    568
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Consultant informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2013
    Messages : 568
    Par défaut
    La solution que tu proposes n'utilise pas le multi-threading, si c'est pour faire ça, tu iras plus vite sur GPU.

    traitementParticules<<<1, 1>>> Faire ça reviens à écrire un code linéaire, tu vas exécuter tes opérations une par une, ça va être extrêmement lent. (Là tu ne déclares qu'un seul et unique thread, aucun intérêt)

    Lis la doc CUDA, ça t’aidera à mieux comprendre :
    http://docs.nvidia.com/cuda/cuda-c-p...gramming-model

    Et surtout essaie au maximum de recopier les exemples de la doc sinon ton code ne fonctionnera jamais.

  5. #5
    Membre averti
    Profil pro
    Inscrit en
    Décembre 2012
    Messages
    16
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2012
    Messages : 16
    Par défaut
    Bonjour,

    Finalement j'ai réussi à faire tourner ce que je voulais grâce à un code déjà existant. Par contre, je me rends compte que j'ai quelques soucis d'optimisation (dans le sens que je trouve mon programme un peu lent) probablement dus à la présence de conditions et de tests (if par ex), c'est possible que ce soit l'origine de cette lenteur ?
    Ensuite, je n'ai pas bien compris comment on pouvait déterminer le nombre max de threads actifs durant une simulation ? (genre pour une tesla k20c ?)

    Merci d'avance.

  6. #6
    Membre très actif Avatar de Matthieu76
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Mars 2013
    Messages
    568
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Consultant informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2013
    Messages : 568
    Par défaut réponse rapide
    Je nombre de thread max dépends de ta carte graphique je crois mais regarde la doc CUDA, c'est marqué. (Il y a même une variable pour ça)

    Ensuite la lenteur ne vient pas des if, à mon avis cela viens de la copie de tes données dans le GPU, les cudaMemcpy() sont très lourd, tu ne devais en n'avoir qu'un seul dans tout ton programme et l'appeler une seul fois. Après, tu ne dois avoir AUCUN BOUCLE FOR dans ton code CUDA.

  7. #7
    Membre averti
    Profil pro
    Inscrit en
    Décembre 2012
    Messages
    16
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2012
    Messages : 16
    Par défaut
    Bonjour,
    merci pour la réponse. Pourquoi aucune boucle for ?
    Pour l'instant, j'ai validé une partie de mon programme en comparant avec une version cpu.
    Il me reste une autre partie à valider mais je rencontre un soucis pour debug... Sur google, je n'ai pas trouvé une réponse adéquate.
    Le programme ne s'arrête jms au niv du point d'arrêt...

  8. #8
    Membre très actif Avatar de Matthieu76
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Mars 2013
    Messages
    568
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Consultant informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2013
    Messages : 568
    Par défaut
    Pas de boucle for car tu dois paralléliser ton code, si tu fais un for de 1 à 100 tu peux redéployer ça sur 100 nouveaux threads pour aller encore plus vite.

    Pour ton problème de debug, c'est tout à fait normal que ton programme ne s'arrêter pas au point d'arrêt si ceux-ci sont dans ton GPU, n'oublie pas, tu as 2 compilers différents donc 2 debuggers différents. Pour cela utilise le debugger CUDA. Regarde aussi ça : http://docs.nvidia.com/cuda/profiler...ide/index.html

Discussions similaires

  1. Réponses: 16
    Dernier message: 14/06/2011, 10h20
  2. Réponses: 1
    Dernier message: 23/08/2010, 02h10
  3. échanger des données entre thread
    Par youp_db dans le forum Windows
    Réponses: 7
    Dernier message: 05/03/2008, 18h30
  4. [MySQL] Utilisation des fonctions des récupérations des données
    Par Konrad Florczak dans le forum PHP & Base de données
    Réponses: 4
    Dernier message: 27/10/2006, 15h17

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