70f3908b8a24a025936e2fc7343c50af37d3a654
[GPU.git] / WCudaMSE / Student_Cuda / src / cpp / core / 01_Hello / 02_hello_add.cu
1 // Attention : Extension .cu\r
2 \r
3 #include <iostream>\r
4 #include <stdio.h>\r
5 #include "cudaTools.h"\r
6 #include "Device.h"\r
7 \r
8 using std::cout;\r
9 using std::endl;\r
10 \r
11 /*----------------------------------------------------------------------*\\r
12  |*                     Declaration                                     *|\r
13  \*---------------------------------------------------------------------*/\r
14 \r
15 /*--------------------------------------*\\r
16  |*             Imported                *|\r
17  \*-------------------------------------*/\r
18 \r
19 /*--------------------------------------*\\r
20  |*             Public                  *|\r
21  \*-------------------------------------*/\r
22 \r
23 __host__  bool isAddScalarGPU_Ok(void);\r
24 \r
25 /*--------------------------------------*\\r
26  |*             Private                 *|\r
27  \*-------------------------------------*/\r
28 \r
29 __host__  static int addScalarGPU(int a, int b);\r
30 __global__ static void addScalar(int a, int b, int* ptrC);\r
31 \r
32 /*----------------------------------------------------------------------*\\r
33  |*                     Implementation                                  *|\r
34  \*---------------------------------------------------------------------*/\r
35 \r
36 /*--------------------------------------*\\r
37  |*             Public                  *|\r
38  \*-------------------------------------*/\r
39 \r
40 __host__  bool isAddScalarGPU_Ok(void)\r
41     {\r
42     cout << endl << "[Hello Cuda 2]" << endl;\r
43 \r
44     int a = 2;\r
45     int b = 7;\r
46 \r
47     int sumGPU = addScalarGPU(a, b);\r
48     int sumTheorique = a + b;\r
49 \r
50     cout <<"\n[CPU] "<< a << " + " << b << " = " << sumGPU << endl;\r
51 \r
52     return sumGPU == sumTheorique;\r
53     }\r
54 \r
55 /*--------------------------------------*\\r
56  |*             Private                 *|\r
57  \*-------------------------------------*/\r
58 \r
59 __host__ int addScalarGPU(int a, int b)\r
60     {\r
61     int c;\r
62     int* ptrC=&c;       // on host (CPU)\r
63     int* ptrDev_c;      // on device (GPU)\r
64 \r
65     // Specifier nb thread : ici 1 thread au total !\r
66     dim3 dg = dim3(1,1,1);\r
67     dim3 db = dim3(1, 1, 1);\r
68 \r
69     // Debug\r
70     //Device::print(dg, db);\r
71      Device::checkDimError(dg,db);\r
72 \r
73     size_t size=sizeof(int);\r
74     HANDLE_ERROR(cudaMalloc((void**) &ptrDev_c, size)); // Device memory allocation (*)\r
75 \r
76     addScalar<<<dg,db>>>(a,b,ptrDev_c); // asynchrone !!\r
77     Device::checkKernelError("addScalar"); // facultatif\r
78 \r
79     //v1\r
80     Device::synchronize();// Pour printf sur  GPU\r
81 \r
82     //v2\r
83    // cudaDeviceSynchronize(); // Pour printf sur  GPU\r
84 \r
85     // memoryManagement => barrier de synchronisation\r
86     HANDLE_ERROR(cudaMemcpy(ptrC, ptrDev_c, size, cudaMemcpyDeviceToHost));// Device -> Host\r
87     HANDLE_ERROR(cudaFree(ptrDev_c)); // device dispose memory in (*)\r
88 \r
89     return c;\r
90     }\r
91 \r
92 \r
93 __global__ void addScalar(int a, int b, int* ptrC)\r
94     {\r
95     *ptrC = a + b;\r
96 \r
97     // debug\r
98     printf("[GPU] %d + %d = %d",a,b, *ptrC);\r
99     }\r
100 \r
101 /*----------------------------------------------------------------------*\\r
102  |*                     End                                             *|\r
103  \*---------------------------------------------------------------------*/\r
104 \r