reducing the test count
[charm.git] / tests / converse / commbench / memoryAccess.c
1 #include <converse.h>
2 #include "commbench.h"
3
4 #define CLUBMALLOC 10000
5 #define RANDMALLOC 10000
6 #define RANDOPS 10000
7 #define POWER 15
8 #define MAXSIZE 16384
9 typedef double myType;
10 myType value = 10;
11 int dist[] = {1,5,9,10};
12
13 CpvStaticDeclare(int, memoryIdx);
14
15 double memoryTest(){
16   double starttime, endtime;  
17   double extraOverhead;
18   myType **ptrs = NULL;
19   int i,j,k,size;
20   myType sums[200];
21   double times[POWER][4];
22   int sizes[RANDMALLOC];
23   int ops[RANDOPS][3];
24
25   ptrs = (myType **)malloc(CLUBMALLOC*sizeof(myType *));
26   for(i=0; i<CLUBMALLOC; i++) ptrs[i] = 0;
27   starttime = CmiWallTimer();
28   for(i=0; i<CLUBMALLOC; i++) ptrs[i] = (myType *)0xabcd;
29   endtime = CmiWallTimer();
30   extraOverhead = endtime - starttime;
31   
32   size = 1;
33   for(i = 0; i < POWER; i++,size*=2) {
34
35     for(j=0; j<CLUBMALLOC; j++) ptrs[j] = 0;
36     starttime = CmiWallTimer();
37     for(j=0; j<CLUBMALLOC; j++) {
38       ptrs[j] = (myType *)CmiAlloc(size*sizeof(myType));
39     }
40     endtime = CmiWallTimer();
41     times[i][0] = endtime - starttime - extraOverhead;
42     
43     for(j=0; j<CLUBMALLOC; j++) {
44       for(k = 0; k < size; k++) {
45         ptrs[j][k] = value;
46       }
47     }
48
49     starttime = CmiWallTimer();
50     for(j=0; j<CLUBMALLOC; j++) {
51       for(k = 0; k < size; k++) {
52         ptrs[j][k] = value;
53       }
54     }
55     endtime = CmiWallTimer();
56     times[i][1] = endtime - starttime - extraOverhead;
57
58     for(j = 0; j < 200; j++) {
59       sums[j] = 0;
60     }
61
62     starttime = CmiWallTimer();
63     for(j=0; j<CLUBMALLOC; j++) {
64       for(k = 0; k < size; k++) {
65         sums[k%200] += ptrs[j][k];
66       }
67     }
68     endtime = CmiWallTimer();
69     times[i][2] = endtime - starttime - extraOverhead;
70
71     starttime = CmiWallTimer();
72     for(j=0; j<CLUBMALLOC; j++) CmiFree(ptrs[j]);
73     endtime = CmiWallTimer();
74     times[i][3] = endtime - starttime - extraOverhead;
75   }
76
77   if(CmiMyPe()==0){
78     CmiPrintf("Performance number of clubbed malloc-traversal-free\n");
79     CmiPrintf("Size\tIterations\tMalloc\tWrite\tRead\tFree\n");
80     size = 1;
81     for(i = 0; i < POWER; i++,size*=2) {
82       CmiPrintf("%d\t%d\t%E\t%E\t%E\t%E\n",size,CLUBMALLOC,times[i][0],
83                times[i][1],times[i][2],times[i][3]);
84     }
85   }
86
87   free(ptrs);
88   ptrs = (myType **)malloc(RANDMALLOC*sizeof(myType *));
89
90   srand(7187);
91   for(i=0; i<RANDMALLOC; i++) {
92     sizes[i] = rand() % MAXSIZE;
93   }
94
95   for(i=0; i<RANDMALLOC; i++) {
96       ptrs[i] = (myType *)CmiAlloc(sizes[i]*sizeof(myType));
97   }
98
99   for(i=0; i<RANDOPS; i++) {
100     ops[i][0] = rand()%RANDMALLOC;
101     ops[i][1] = rand()%dist[3];
102     if(ops[i][1] < dist[0]) {
103       ops[i][1] = 0;
104       ops[i][2] =rand()%MAXSIZE;
105     } else if(ops[i][1] < dist[1]) {
106       ops[i][1] = 1;
107       ops[i][2] = sizes[ops[i][0]];
108     } if(ops[i][1] < dist[2]) {
109       ops[i][1] = 2;
110       ops[i][2] = sizes[ops[i][0]];
111     } else {
112       ops[i][1] = 3;
113     }
114   }
115
116   starttime = CmiWallTimer();
117   for(i=0; i<RANDOPS; i++) {
118     switch(ops[i][1]) {
119       case 0:
120         if(ptrs[ops[i][0]] != NULL)
121           CmiFree(ptrs[ops[i][0]]);
122         ptrs[ops[i][0]] = (myType *)CmiAlloc(ops[i][2]*sizeof(myType));
123         break;
124       case 1:
125         if(ptrs[ops[i][0]] == NULL)
126           ptrs[ops[i][0]] = (myType *)CmiAlloc(ops[i][2]*sizeof(myType));
127         for(j = 0; j < ops[i][2]; j++) {
128           ptrs[ops[i][0]][j] = value;
129         }
130         break;
131      case 2:
132         if(ptrs[ops[i][0]] == NULL)
133           ptrs[ops[i][0]] = (myType *)CmiAlloc(ops[i][2]*sizeof(myType));
134         for(j = 0; j < ops[i][2]; j++) {
135           sums[k%200] += ptrs[ops[i][0]][j];
136         }
137         break;
138     case 3:
139       if(ptrs[ops[i][0]] != NULL){
140         CmiFree(ptrs[ops[i][0]]);
141         ptrs[ops[i][0]] = NULL;
142       }
143     }
144   }
145   endtime = CmiWallTimer();
146
147   if(CmiMyPe()==0){
148     CmiPrintf("Time taken by random malloc-traversal-free benchmark with following commutative distribution: malloc %d, write %d, read %d, free %d, max malloc size %d, length of table %d, number of ops %d is %E.\n",dist[0],dist[1],dist[2],dist[3],MAXSIZE,RANDMALLOC,RANDOPS, (endtime-starttime));
149   }
150
151   for(i=0; i<RANDMALLOC; i++) {
152     if(ptrs[i] != NULL)
153       CmiFree(ptrs[i]);
154   }
155   free(ptrs);
156 }
157
158 static void memoryHandler(EmptyMsg *msg){
159         /* Make sure the memory contention on a node happens roughly at the same time */
160         CmiNodeBarrier();
161         memoryTest();   
162         CmiNodeBarrier();
163         
164         if(CmiMyPe()==0){
165     CmiSetHandler(msg, CpvAccess(ack_handler));
166     CmiSyncSend(0, sizeof(EmptyMsg), msg);
167         }
168         else {
169           CmiFree(msg);
170         }
171 }
172
173 void memoryAccess_init(void)
174 {
175   EmptyMsg msg;
176
177   CmiPrintf("Single core malloc/free/traversal performance numbers\n");
178   memoryTest();
179              
180   CmiPrintf("Multi core malloc/free/traversal performance numbers\n");
181   CmiSetHandler(&msg, CpvAccess(memoryIdx));
182   CmiSyncBroadcastAll(sizeof(EmptyMsg), &msg);
183 }
184
185 void memoryAccess_moduleinit(void)
186 {
187   CpvInitialize(int, memoryIdx);
188   CpvAccess(memoryIdx) = CmiRegisterHandler((CmiHandler)memoryHandler);
189 }
190