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

  1. #1
    Membre habitué
    Profil pro
    Inscrit en
    février 2008
    Messages
    354
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : Tunisie

    Informations forums :
    Inscription : février 2008
    Messages : 354
    Points : 139
    Points
    139
    Par défaut Projeter un ensemble des points sur un plan en utilisant CUDA
    Bonjour,
    Je suis débutante en CUDa.
    Je veux projeter un nuage de points (un point est défini par x, y, et z) sur un plan défini par a, b et c.
    e code est le 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
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
     
    #include <cuda.h>
    #include <cuda_runtime.h>
    #include <float.h>
    #include <cstdio>
    #include <io.h>
    #include <vector>
    struct G3DPoint
    {
    		double _x;/*!< The x coordinates*/
    		double _y;/*!< The y Coordinates*/
    		double _z;/*!< The z coordinates*/
    };
       __device__ void Project(G3DPoint  pt, G3DPoint pt_proj,double a, double b, double c,double d, double x_p, double y_p, double z_p)
       {
       				double dist=/*abs*/(a*pt._x+b*pt._y+c*pt._z+d)/(a*a+b*b+c*c);
    				//Mettre les coordonnées du projeté orthogonal du p_point sur p_plan
    				pt_proj._x=pt._x-dist*a;
    				pt_proj._y=pt._y-dist*b;
    				pt_proj._z=pt._z-dist*c;
     
       }
    __global__ void ProjectPoint(std::vector<G3DPoint > * gpu_vectPts,std::vector<G3DPoint > * gpu_vectprojPoint,double a, double b, double c,double d, double x_p, double y_p, double z_p)
    {
        int idx = blockIdx.x*blockDim.x + threadIdx.x;
    	printf("blockIdx is %d",blockIdx);
        if(idx >=gpu_vectPts->size() )
            return;
     
        Project(gpu_vectPts->at(idx), gpu_vectprojPoint->at(idx),a,b,c,d,x_p,y_p,z_p);
    }
    void getVectOfPointProj(const std::vector<G3DPoint > & vectPts,std::vector<G3DPoint > & vectProjPoints,double a,double b,double c,double d, double x_p, double y_p, double z_p)
    {
    	int threads = 512;
        int blocks = vectPts.size()/threads + ((vectPts.size() % threads)?1:0);
     
     
    	std::vector<G3DPoint >  *gpu_vectPts,*gpu_vectprojPoint;
     
        cudaMalloc((void**)gpu_vectPts, sizeof(G3DPoint)*vectPts.size());
      	cudaMalloc((void**)gpu_vectprojPoint, sizeof(G3DPoint)*vectPts.size());
    	vectProjPoints.resize(vectPts.size());
        CheckCUDAError("Project");
     
        cudaMemcpy(gpu_vectPts, & vectPts, vectPts.size(), cudaMemcpyHostToDevice);
     
        CheckCUDAError("Project");
     
        printf("CUDA blocks/threads: %d %d\n", blocks, threads);
     
        ProjectPoint<<<blocks, threads>>>(gpu_vectPts, gpu_vectprojPoint, a, b, c,d, x_p,  y_p,  z_p);
        cudaThreadSynchronize();
     
        CheckCUDAError("Search");
     
        cudaMemcpy(& vectProjPoints, gpu_vectprojPoint, vectPts.size(), cudaMemcpyDeviceToHost);
        cudaFree(gpu_vectPts);
        cudaFree(gpu_vectprojPoint);
       }
    Les erreurs trouvées sont les suivantes
    Erreur 7 error : calling a __host__ function("std::vector<G3DPoint, std::allocator<G3DPoint> > ::at") from a __global__ function("ProjectPoint") is not allowed d:\projects\new_test_kd_tree_gpu\new_test_kd_tree_gpu\Projection.cu 29 1 New_test_kd_tree_GPU
    Erreur 8 error : calling a __host__ function("std::vector<G3DPoint, std::allocator<G3DPoint> > ::at") from a __global__ function("ProjectPoint") is not allowed d:\projects\new_test_kd_tree_gpu\new_test_kd_tree_gpu\Projection.cu 29 1 New_test_kd_tree_GPU
    Erreur 6 error : calling a __host__ function("std::vector<G3DPoint, std::allocator<G3DPoint> > ::size") from a __global__ function("ProjectPoint") is not allowed d:\projects\new_test_kd_tree_gpu\new_test_kd_tree_gpu\Projection.cu 26 1 New_test_kd_tree_GPU
    Erreur 9 error MSB3721: La commande ""C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v6.5\bin\nvcc.exe" -gencode=arch=compute_20,code=\"sm_20,compute_20\" --use-local-env --cl-version 2010 -ccbin "C:\Program Files\Microsoft Visual Studio 10.0\VC\bin" -I"C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v6.5\include" -I"C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v6.5\include" --keep-dir Release -maxrregcount=0 --machine 32 --compile -cudart static -DWIN32 -DNDEBUG -D_CONSOLE -D_MBCS -Xcompiler "/EHsc /W3 /nologo /O2 /Zi /MD " -o Release\kernel.cu.obj "D:\projects\New_test_kd_tree_GPU\New_test_kd_tree_GPU\kernel.cu"" s'est arrêtée avec le code 2. C:\Program Files\MSBuild\Microsoft.Cpp\v4.0\BuildCustomizations\CUDA 6.5.targets 593 10 New_test_kd_tree_GPU
    13 IntelliSense*: expression attendue d:\projects\new_test_kd_tree_gpu\new_test_kd_tree_gpu\projection.cu 50 19 New_test_kd_tree_GPU
    11 IntelliSense*: identificateur "blockDim" non défini d:\projects\new_test_kd_tree_gpu\new_test_kd_tree_gpu\projection.cu 24 26 New_test_kd_tree_GPU
    10 IntelliSense*: identificateur "blockIdx" non défini d:\projects\new_test_kd_tree_gpu\new_test_kd_tree_gpu\projection.cu 24 15 New_test_kd_tree_GPU
    12 IntelliSense*: identificateur "threadIdx" non défini d:\projects\new_test_kd_tree_gpu\new_test_kd_tree_gpu\projection.cu 24 39 New_test_kd_tree_GPU
    D'après ce que j'ai compris est qu'il y a des erreurs dans la définition des vecteurs vectProjPoints, gpu_vectprojPoint mais je ne suis pas arriver à le résoudre.
    Merci pour vos aides.

  2. #2
    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 : 896
    Points
    896
    Par défaut
    Salut, beaucoup d'erreurs dans ton code mais j'ai un peu la flemme de tout corriger car ce serait trop long mais voici quelques trucs :

    • Tout d'abord ton code cuda doit être en extern "C" {} pour le compiler en C et non C++
    • Tu dois aussi utiliser 2 compilateurs, ton compilateur C ou C++ et le compilateur CUDA (nvcc) et tu dois configurer les paramètres d'entrés du compilateurs.
    • Tu ne peux pas utilisé de structure en CUDA car tu ne pourras pas alloué les pointers dans ta structure.
    • cudaThreadSynchronize(); n'est pas utilise


    Désolé de te dire ça mais au vu de ton code tu n'as pas l'air d'être très bon en programmation C/C++ mais peut-être que je me trompe. (Désolé je sais pas trop comment dire ça avec des pincettes ).
    Je te conseil sincèrement d’arrêter la programmation en CUDA car cela te prendra beaucoup de temps et d'énergie pour pas grand-chose. C'est un langage excrement fastidieux qui demande beaucoup de rigueur et de persévérance. Si tu veux vraiment améliorer la vitesse de ton code concentre-toi plus sur le multi-threading de ton CPU en C++ 11 qui intègre les threads à la std.

    Pour te faire par de mon expérience personnelle, j'avais un projet en cours depuis 1 ans et demi et j'ai voulue passer une partie de mon algorithme principal en cuda; cela m'a pris 2 jours à codé et 2 mois à résoudre tout les bugs pour qu'au final le code ne soit pas plus rapide que sur CPU. Va voir les posts que j'ai fait sur ce forum et tu comprendras à quel points j'en ai chier... Si j'avais passé 3 mois à améliorer mes algo et mon code C++ cela aurait été bien plus efficace.

    En gros, je te conseil d'arrêter la programmation CUDA et de te concentrer sur déjà faire de très bon programme en C/C++.
    Le CUDA n'est vraiment efficace et utile que si tu as des matricer avec plus d'un million de données. Si ton programme s'execute en 2 minutes en C, aucune raison de le passer en CUDA. Moi j'avais fait le choix de passer en CUDA car je fa&is du deep learning et que mon algo met plus d'une nuit à s’exécuter mais en réalité le problème ne vient pas de la vitesse de calcul mais de l'algorithme que l'utilise qui ne converge pas.

    En espérant t'avoir aidé,
    Matthieu

Discussions similaires

  1. Définir des points sur un plan 3D
    Par -N4w4k- dans le forum Mathématiques
    Réponses: 7
    Dernier message: 14/07/2013, 11h58
  2. Projection d'un ensemble des points 3D sur un Plan 2D
    Par fraisa1985 dans le forum Traitement d'images
    Réponses: 13
    Dernier message: 23/07/2010, 11h07
  3. Projection de points sur un plan
    Par bernard6 dans le forum MATLAB
    Réponses: 7
    Dernier message: 23/07/2007, 16h26
  4. Réponses: 4
    Dernier message: 27/11/2006, 18h06
  5. Récupérer l'ensemble des points d'une droite
    Par Psycho_Kwak dans le forum AWT/Swing
    Réponses: 4
    Dernier message: 18/01/2006, 11h42

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