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