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 :

À quoi sert un device_vector ?


Sujet :

CUDA

  1. #1
    Membre éclairé 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
    Points : 890
    Points
    890
    Par défaut À quoi sert un device_vector ?
    A quoi sert un device_vector en CUDA vu que l'on ne peut pas l'utiliser dans le GPU ?

    En faite pour passer mon objet sur le GPU j'ai voulu voulais faire une structure contenant des vecteurs de vecteurs mais en cuda ON PEUT PAS imbriquer des vecteurs ensuite je suis passer aux pointeurs en calculant l'adresse de l'élément que je recherche depuis celle de mon pointeur mais dans une structure ON PEUT PAS copier de valeur dans le pointeur donc il devient inutilisable. Du coup je me suis dis que je j'allais utiliser un vecteur comme tableau mais là non plus ON PEUT PAS car les device_vector de cuda ne peuvent pas être appeler dans le code du processeur.

    Du coup la SEULE SOLUTION que j'ai trouvé c'est de passer par un seul pointeur puis j'alloue un gros bloc mémoire avec cudamalloc() et j'utilise des fonctions pour accéder aux valeurs que je souhaite.
    Je trouve ça hyper compliquer pour pas grand-chose mais si c'était que ça ... Le gros problème c'est que pour accéder à mes variables je dois passer par des calculs avec des additions et multiplications et j'ai peur que cela ralentisse mon programme, le but étant d'être rapide sinon je n'utiliserais pas la programmation GPU.

    Quelqu'un aurait une meilleur solution s'il vous plaît ?


    PS : Ça commence à m'énerver grave ce truc.

  2. #2
    Expert éminent sénior

    Femme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2007
    Messages
    5 184
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Juin 2007
    Messages : 5 184
    Points : 17 118
    Points
    17 118
    Par défaut
    Et si, au lieu de faire un vecteur de vecteur, tu faisais un vecteur linéarisé, c'est à dire indicé par [row_size*i + j] (ou row_size est le nombre d'élément en j)?
    Cela résoudrait le problème d'imbrication.

    Par ailleurs, regarde s'il n'y a pas déjà une device_matrix.

    Pour le reste, je n'ai qu'une idée théorique de ce qu'est CUDA, je ne pourrai pas t'aider spécifiquement.
    Courage
    Mes principes de bases du codeur qui veut pouvoir dormir:
    • Une variable de moins est une source d'erreur en moins.
    • Un pointeur de moins est une montagne d'erreurs en moins.
    • Un copier-coller, ça doit se justifier... Deux, c'est un de trop.
    • jamais signifie "sauf si j'ai passé trois jours à prouver que je peux".
    • La plus sotte des questions est celle qu'on ne pose pas.
    Pour faire des graphes, essayez yEd.
    le ter nel est le titre porté par un de mes personnages de jeu de rôle

  3. #3
    Membre éclairé 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
    Points : 890
    Points
    890
    Par défaut
    Merci beaucoup de ta réponse, ce que tu proposes n'est vraiment pas idiot et j'y ai pensé mais là aussi c'est impossible car il est impossible d'utiliser un vector dans le code du GPU.
    Le device_vector de cuda utilise le GPU mais ne peut pas être appeler depuis celui-ci, d'où ma question : A quoi sert un device_vector ? (à part la fonction sort() qui utilise le GPU et qui à la limite peut-être utile ...)

    Après si je passe par un seul pointeur ça donnera un truc du genre :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    inline
    float getValueOfArray3(int i, int j)
    {
        return network[number_value + row_size1*col_size1 + row_size2*col_size2 +row_size3*i + j]
    }
    Sachant que row_size sont des variables contenues dans network, on aurait :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    #define NUMBER_VALUE 6
     
    inline
    float getValueOfArray3(int i, int j)
    {
        return network[NUMBER_VALUE + network[0]*network[1] + network[3]*network[4] + network[5]*i + j]
    }
    Mais j'ai vraiment peur que cela ralentisse de beaucoup mon programme car il y aura plus de calcul dans l'appel des variables que dans l'algorithme en lui même.

  4. #4
    Expert éminent sénior

    Femme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2007
    Messages
    5 184
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Juin 2007
    Messages : 5 184
    Points : 17 118
    Points
    17 118
    Par défaut
    après avoir fait un simple google(cuda device_vector), j'ai en première page la doc CUDA de nvidia qui dit:
    2. Vectors

    Thrust provides two vector containers, host_vector and device_vector. As the names suggest, host_vector is stored in host memory while device_vector lives in GPU device memory. Thrust’s vector containers are just like std::vector in the C++ STL. Like std::vector, host_vector and device_vector are generic containers (able to store any data type) that can be resized dynamically. The following source code illustrates the use of Thrust’s vector containers.

    [Un code d'exemple]

    As this example shows, the = operator can be used to copy a host_vector to a device_vector (or vice-versa). The = operator can also be used to copy host_vector to host_vector or device_vector to device_vector. Also note that individual elements of a device_vector can be accessed using the standard bracket notation. However, because each of these accesses requires a call to cudaMemcpy, they should be used sparingly. We’ll look at some more efficient techniques later.
    J'en déduis que c'est justement un vecteur en mémoire GPU.

    A priori, tu as raté autre chose pour te poser ce problème.

    Quel est ton code où "on ne peut pas l'utiliser dans le GPU"?
    Si tu te dis "on ne peut pas" parce que ca ne compile pas, quels sont les messages d'erreurs?
    Mes principes de bases du codeur qui veut pouvoir dormir:
    • Une variable de moins est une source d'erreur en moins.
    • Un pointeur de moins est une montagne d'erreurs en moins.
    • Un copier-coller, ça doit se justifier... Deux, c'est un de trop.
    • jamais signifie "sauf si j'ai passé trois jours à prouver que je peux".
    • La plus sotte des questions est celle qu'on ne pose pas.
    Pour faire des graphes, essayez yEd.
    le ter nel est le titre porté par un de mes personnages de jeu de rôle

  5. #5
    Membre éclairé 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
    Points : 890
    Points
    890
    Par défaut
    Alors c'est là qu'est la subtilité, le device_vector stock les valeurs dans le GPU mais il est impossible d’appeler le device_vector depuis du code qui s'execute dans le GPU.

    Le message d’erreur est très clair :
    calling a __host__ function (operator []) from a __global__ function is not allowed
    device_vector est un objet host(CPU) qui pointe vers des addresses de la device memory(mémoire du GPU).

    J'ai trouvé ça sur des forum :
    "thrust::device_vector objects/references can not be used as kernel parameters. You could use raw pointers to pass the device vector data."

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    thrust::device_vector<float> d_vec(100);
    float* pd_vec = thrust::raw_pointer_cast(d_vec.data());
    kernel<<<100,1>>>(pd_vec);
    Ah oui, donc du coup je pense que je peux copier ma structure CPU contenant des device_vector dans ma structure GPU contenant des pointeurs qui pointent vers ces vecteurs, puis dans le code de mon GPU je passe par des pointeurs qui pointent sur mes vectors.
    En gros mes vector servent juste à pouvoir faire une copy de ma structure.
    Par contre il y a encore un tout petit problème mais je ferais avec à moins que tu n'ai une solution c'est que ma struct CPU et ma struct GPU partageront à présent les mêmes données pour ce qui est des vecteurs/pointeurs.



    En tout cas merci pour ton aide, cela m'aide beaucoup.

  6. #6
    Membre éclairé 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
    Points : 890
    Points
    890
    Par défaut re
    Pour résumer j'obtiens une structure du genre :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    struct network
    {
        int lenght;
        host_vector<float> hv;
        device_vector<float> dv;
        float* pointer;
    };
    Et c'est là de c'est drôle , pour instancier mon network sur le GPU je dois :

    - créer 2 pointeurs, un pointeur networkCPU et un pointeur networkGPU
    - faire un malloc() sur networkCPU
    - mettre les valeurs souhaitées dans le host_vector de mon networkCPU
    - faire un cudaMalloc() sur networkGPU
    - utiliser cudaMemcpy() pour copier les valeurs de networkCPU dans networkGPU
    - copier le contenu de host_vector dans device_vector avec l'opérateur =
    - faire pointeur mon pointeur sur dv[0]
    - utiliser mon pointeur dans le code GPU

  7. #7
    Membre éclairé 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
    Points : 890
    Points
    890
    Par défaut mieux
    Bon bah finalement ça ne fonctionne pas et apparemment c'est pas très bien d'utiliser les vecteurs de la librairie thrust car ils "fonctionnent mal" dans certain cas car la librairie est "mal codé". (d'après des gens sur stackoverflow).

    Du coup j'ai été au plus simple, plus de structure, par contre mes fonctions prennent 16 paramètres en entrée.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. A quoi sert XML-Schema
    Par Community Management dans le forum Valider
    Réponses: 20
    Dernier message: 26/01/2009, 10h52
  2. à quoi sert le délestage?
    Par r0d dans le forum Mode d'emploi & aide aux nouveaux
    Réponses: 5
    Dernier message: 06/10/2004, 15h34
  3. a quoi sert le schema dans postgres ??
    Par champion dans le forum PostgreSQL
    Réponses: 6
    Dernier message: 13/09/2004, 11h25
  4. [info] A quoi sert ImageObserver ?
    Par FrigoAcide dans le forum AWT/Swing
    Réponses: 4
    Dernier message: 22/03/2004, 18h20

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