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 éprouvé
    Avatar de Gouyon
    Homme Profil pro
    Développeur informatique
    Inscrit en
    novembre 2003
    Messages
    916
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 57
    Localisation : France, Loiret (Centre)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : novembre 2003
    Messages : 916
    Points : 1 138
    Points
    1 138
    Billets dans le blog
    3
    Par défaut Problème d'intégration de code CUDA dans une application MFC
    Salut à tous

    Je souhaite accélérer une application MFC (Boite de dialogue) en remplaçant certaines fonctions par du code CUDA. Dans la doc de CUDA j'ai trouvé comment faire en sorte que mon projet MFC accepte l'accélération par CUDA. Par contre je ne sais pas comment intégrer le code cuda à mon source
    Dans l'exemple ci dessous je ne compile pas car la compilation du code CUDA ne se fait pas avec le compilateur CUDA mais avec celui de visual studio.

    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
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
     
     
    // MFCcudaDlg.cpp : fichier d'implémentation
    //
     
    #include "stdafx.h"
    #include "MFCcuda.h"
    #include "MFCcudaDlg.h"
    #include "afxdialogex.h"
    #include <cuda_runtime.h>
     
    #ifdef _DEBUG
    #define new DEBUG_NEW
    #endif
     
     
     
    __global__ void VecAdd(float *A, float *B, float *C, int N)
    {
    	int i = threadIdx.x;
    	if (i<N)
    		C[i] = A[i] + B[i];
    }
     
    void AjouteVect(float *A, float *B, float *C, int N)
    {
    	float *dev_a, *dev_b, *dev_c;
    	//allocations mémoires sur le GPU
    	cudaMalloc((void**)&dev_a, N*sizeof(float));
    	cudaMalloc((void**)&dev_c, N*sizeof(float));
    	cudaMalloc((void**)&dev_b, N*sizeof(float));
    	//copie des valeurs sur le GPU
    	cudaMemcpy(dev_a, A, N*sizeof(float), cudaMemcpyHostToDevice);	
    	cudaMemcpy(dev_b, B, N*sizeof(float), cudaMemcpyHostToDevice);
    	//Addition des vecteurs
    	VecAdd << <1, N >> >(dev_a, dev_a, dev_a, N);
    	//copie du résulat sur le CPU
    	cudaMemcpy(C,dev_c, N*sizeof(float), cudaMemcpyDeviceToHost);
    }
     
    // boîte de dialogue CMFCcudaDlg
     
    CMFCcudaDlg::CMFCcudaDlg(CWnd* pParent /*=NULL*/)
    	: CDialogEx(CMFCcudaDlg::IDD, pParent)
    {
    	m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
    }
     
    void CMFCcudaDlg::DoDataExchange(CDataExchange* pDX)
    {
    	CDialogEx::DoDataExchange(pDX);
    }
     
    BEGIN_MESSAGE_MAP(CMFCcudaDlg, CDialogEx)
    	ON_WM_PAINT()
    	ON_WM_QUERYDRAGICON()
    END_MESSAGE_MAP()
     
     
    // gestionnaires de messages pour CMFCcudaDlg
     
    BOOL CMFCcudaDlg::OnInitDialog()
    {
    	CDialogEx::OnInitDialog();
     
    	// Définir l'icône de cette boîte de dialogue.  L'infrastructure effectue cela automatiquement
    	//  lorsque la fenêtre principale de l'application n'est pas une boîte de dialogue
    	SetIcon(m_hIcon, TRUE);			// Définir une grande icône
    	SetIcon(m_hIcon, FALSE);		// Définir une petite icône
     
    	// TODO: ajoutez ici une initialisation supplémentaire
    	float h_a[5] = { 1, 2, 3, 4, 5 };
    	AjouteVect(h_a, h_a, h_a, 5);
     
    	return TRUE;  // retourne TRUE, sauf si vous avez défini le focus sur un contrôle
    }
     
    // Si vous ajoutez un bouton Réduire à votre boîte de dialogue, vous devez utiliser le code ci-dessous
    //  pour dessiner l'icône.  Pour les applications MFC utilisant le modèle Document/Vue,
    //  cela est fait automatiquement par l'infrastructure.
     
    void CMFCcudaDlg::OnPaint()
    {
    	if (IsIconic())
    	{
    		CPaintDC dc(this); // contexte de périphérique pour la peinture
     
    		SendMessage(WM_ICONERASEBKGND, reinterpret_cast<WPARAM>(dc.GetSafeHdc()), 0);
     
    		// Centrer l'icône dans le rectangle client
    		int cxIcon = GetSystemMetrics(SM_CXICON);
    		int cyIcon = GetSystemMetrics(SM_CYICON);
    		CRect rect;
    		GetClientRect(&rect);
    		int x = (rect.Width() - cxIcon + 1) / 2;
    		int y = (rect.Height() - cyIcon + 1) / 2;
     
    		// Dessiner l'icône
    		dc.DrawIcon(x, y, m_hIcon);
    	}
    	else
    	{
    		CDialogEx::OnPaint();
    	}
    }
     
    // Le système appelle cette fonction pour obtenir le curseur à afficher lorsque l'utilisateur fait glisser
    //  la fenêtre réduite.
    HCURSOR CMFCcudaDlg::OnQueryDragIcon()
    {
    	return static_cast<HCURSOR>(m_hIcon);
    }
    Dans les exemple j'ai vu que le code CUDA est mis dans des fichiers .cu. Du coups j'ai mis mon code cuda dans un fichier Fonction.cu.

    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
     
    __global__ void VecAdd(float *A, float *B, float *C, int N)
    {
    	int i = threadIdx.x;
    	if (i<N)
    		C[i] = A[i] + B[i];
    }
     
    void AjouteVect(float *A, float *B, float *C, int N)
    {
    	float *dev_a, *dev_b, *dev_c;
    	//allocations mémoires sur le GPU
    	cudaMalloc((void**)&dev_a, N*sizeof(float));
    	cudaMalloc((void**)&dev_c, N*sizeof(float));
    	cudaMalloc((void**)&dev_b, N*sizeof(float));
    	//copie des valeurs sur le GPU
    	cudaMemcpy(dev_a, A, N*sizeof(float), cudaMemcpyHostToDevice);	
    	cudaMemcpy(dev_b, B, N*sizeof(float), cudaMemcpyHostToDevice);
    	//Addition des vecteurs
    	VecAdd << <1, N >> >(dev_a, dev_a, dev_a, N);
    	//copie du résulat sur le CPU
    	cudaMemcpy(C,dev_c, N*sizeof(float), cudaMemcpyDeviceToHost);
    }
    J'ai bien la compilation qui marche mais par contre ça bloque à l'édition de lien.

    Quelqu'un a t'il déjà fait l'exercice et si oui je suis preneur de sa solution
    Il y a des jours où j'éprouve une haine profonde envers microsoft
    Venez vous défouler ici ou c'est amusant
    Mon modeste site et mes modestes oeuvres sont
    Rémi

  2. #2
    Membre actif
    Inscrit en
    mai 2012
    Messages
    65
    Détails du profil
    Informations forums :
    Inscription : mai 2012
    Messages : 65
    Points : 282
    Points
    282
    Par défaut
    Si tu veux appeler ta fonction AjoutVect, rajoute avant un extern "C", comme ceci :

    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
    __global__ void VecAdd(float *A, float *B, float *C, int N)
    {
    	int i = threadIdx.x;
    	if (i<N)
    		C[i] = A[i] + B[i];
    }
     
    extern "C"
    {
      void AjouteVect(float *A, float *B, float *C, int N)
      {
    	float *dev_a, *dev_b, *dev_c;
    	//allocations mémoires sur le GPU
    	cudaMalloc((void**)&dev_a, N*sizeof(float));
    	cudaMalloc((void**)&dev_c, N*sizeof(float));
    	cudaMalloc((void**)&dev_b, N*sizeof(float));
    	//copie des valeurs sur le GPU
    	cudaMemcpy(dev_a, A, N*sizeof(float), cudaMemcpyHostToDevice);	
    	cudaMemcpy(dev_b, B, N*sizeof(float), cudaMemcpyHostToDevice);
    	//Addition des vecteurs
    	VecAdd << <1, N >> >(dev_a, dev_a, dev_a, N);
    	//copie du résulat sur le CPU
    	cudaMemcpy(C,dev_c, N*sizeof(float), cudaMemcpyDeviceToHost);
       }
    }
    Et dans le .h de ton fichier qui appelle ta fonction Cuda tu as juste à écrire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    extern "C"
    void AjouteVect(float *A, float *B, float *C, int N)

  3. #3
    Membre éprouvé
    Avatar de Gouyon
    Homme Profil pro
    Développeur informatique
    Inscrit en
    novembre 2003
    Messages
    916
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 57
    Localisation : France, Loiret (Centre)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : novembre 2003
    Messages : 916
    Points : 1 138
    Points
    1 138
    Billets dans le blog
    3
    Par défaut
    Merci pour la réponse je vais essayer ça dès mon retour de vacances
    Il y a des jours où j'éprouve une haine profonde envers microsoft
    Venez vous défouler ici ou c'est amusant
    Mon modeste site et mes modestes oeuvres sont
    Rémi

Discussions similaires

  1. Intègration du code Ruby dans une application web Java
    Par L'aigle de Carthage dans le forum Développement Web en Java
    Réponses: 0
    Dernier message: 04/06/2011, 00h28
  2. intégration de code behind dans une page de sharepoint
    Par bakabdel dans le forum SharePoint
    Réponses: 4
    Dernier message: 14/05/2009, 17h08
  3. Réponses: 3
    Dernier message: 23/12/2008, 22h34
  4. intégration de code javascript dans une page asp.net
    Par Je-cherche-pfe dans le forum Général Dotnet
    Réponses: 1
    Dernier message: 06/09/2007, 17h10
  5. intégration d'un résultat dans une application.
    Par kifouillou dans le forum Langage
    Réponses: 66
    Dernier message: 06/02/2007, 15h46

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