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