examples/charm++: Always use CkWallTimer, not CmiWallTimer (tested)
[charm.git] / examples / charm++ / cuda / overlapTestGPUManager / overlapTest.C
1 #include "overlapTest.decl.h"
2 #include "overlapTest.h"
3
4 #define DEBUG
5
6 extern void cudaMatMul(int matrixSize, ElementType *A, ElementType *B, ElementType *C, int myIndex, void *cb); 
7 extern void hostMemorySetup(int matrixSize, ElementType **h_A, ElementType **h_B, ElementType **h_C, void *cb); 
8 extern void hostMemoryCleanup(ElementType *h_A, ElementType *h_B, ElementType *h_C);
9
10 CProxy_Main mainProxy; 
11 int matrixSize;
12
13 Main::Main(CkArgMsg *m) {
14   mainProxy = thisProxy; 
15
16   if (m->argc >= 2) {
17     numChares = atoi(m->argv[1]); 
18   }
19   if (m->argc == 3) {
20     matrixSize = atoi(m->argv[2]); 
21   }
22   delete m;
23
24   workers = CProxy_Workers::ckNew(numChares); 
25
26   startTime = CkWallTimer(); 
27     
28   workers.setupBuffers(); 
29 }
30
31 void Main::finishWork(CkReductionMsg *m) {
32   delete m;
33   CkPrintf("Elapsed time: %f s\n", CkWallTimer() - startTime);  
34   CkExit(); 
35 }
36
37 Workers::Workers() {
38   int size = matrixSize * matrixSize; 
39   A = new ElementType[size];
40   B = new ElementType[size];
41   C = new ElementType[size]; 
42   
43   randomInit(A, size); 
44   randomInit(B, size); 
45 }
46
47 Workers::~Workers() {
48   delete [] A; 
49   delete [] B; 
50   delete [] C; 
51   hostMemoryCleanup(h_A, h_B, h_C);
52 }
53
54 Workers::Workers(CkMigrateMessage *msg) { } 
55
56 void Workers::setupBuffers() {
57   CkArrayIndex1D myIndex = CkArrayIndex1D(thisIndex);
58   CkCallback *cb = new CkCallback(CkIndex_Workers::beginWork(), myIndex, thisArrayID);
59   hostMemorySetup(matrixSize, &h_A, &h_B, &h_C, (void *) cb); 
60 }
61
62 void Workers::beginWork() {
63   CkCallback *cb;
64   CkArrayIndex1D myIndex = CkArrayIndex1D(thisIndex);
65   cb = new CkCallback(CkIndex_Workers::complete(), myIndex, thisArrayID); 
66   int size = matrixSize * matrixSize * sizeof(ElementType);
67   memcpy(h_A, A, size);
68   memcpy(h_B, B, size); 
69   cudaMatMul(matrixSize, h_A, h_B, h_C, thisIndex, (void *) cb);
70 }
71
72 void Workers::complete() {
73   int size = matrixSize * matrixSize * sizeof(ElementType); 
74   memcpy(C, h_C, size); 
75 #ifdef DEBUG
76   CkPrintf("[%d] A\n", thisIndex); 
77   for (int i=0; i<matrixSize; i++) {
78     CkPrintf("[%d] ", thisIndex);
79     for (int j=0; j<matrixSize; j++) {
80       CkPrintf("%.2f ", A[i*matrixSize+j]); 
81     }
82     CkPrintf("\n");
83   }
84   CkPrintf("[%d] B\n", thisIndex); 
85   for (int i=0; i<matrixSize; i++) {
86     CkPrintf("[%d] ", thisIndex);
87     for (int j=0; j<matrixSize; j++) {
88       CkPrintf("%.2f ", B[i*matrixSize+j]); 
89     }
90     CkPrintf("\n");
91   }
92   CkPrintf("[%d] C\n", thisIndex); 
93   for (int i=0; i<matrixSize; i++) {
94     CkPrintf("[%d] ", thisIndex);
95     for (int j=0; j<matrixSize; j++) {
96       CkPrintf("%.2f ", C[i*matrixSize+j]); 
97     }
98     CkPrintf("\n");
99   }
100   CkPrintf("[%d] C-gold\n", thisIndex);
101   for (int i=0; i<matrixSize; i++) {
102     CkPrintf("[%d] ", thisIndex);
103     for (int j=0; j<matrixSize; j++) {
104       C[i*matrixSize + j] = 0; 
105       for (int k=0; k<matrixSize; k++) {
106         C[i*matrixSize + j] += A[i*matrixSize +k] * B[k * matrixSize + j];
107       }
108       CkPrintf("%.2f ", C[i*matrixSize+j]); 
109     }
110     CkPrintf("\n");
111   }
112
113 #endif
114
115   contribute(CkCallback(CkIndex_Main::finishWork(NULL), mainProxy));
116 }
117
118 void randomInit(ElementType* data, int size) {
119   for (int i = 0; i < size; ++i) {
120     data[i] = rand() / (ElementType)RAND_MAX;
121   }
122 }
123
124 #include "overlapTest.def.h"