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);
} |
Partager