Merge branch 'charm' of charmgit:charm into charm
[charm.git] / examples / charm++ / speeds / speed.C
1 #include <stdio.h>
2 #include <stdlib.h>
3 #include <limits.h>
4 #include "speed.h"
5
6 void 
7 test::measure(int nc)
8 {
9   nchunks = nc;
10   int s = LDProcessorSpeed();
11   CkPrintf("[%d] speed = %d \n", CkMyPe(), s);
12   CProxy_test grp(thisgroup);
13   grp.recv(CkMyPe(), s);
14 }
15
16 void
17 test::recv(int pe, int speed)
18 {
19   speeds[pe] = speed;
20   numrecd++;
21   if(numrecd==CkNumPes())
22   {
23     distrib();
24     if(CkMyPe()==0)
25       CkExit();
26   }
27 }
28
29 double *rem;
30
31 int cmp(const void *first, const void *second)
32 {
33   int fi = *((const int *)first);
34   int si = *((const int *)second);
35   return ((rem[fi]==rem[si]) ? 0 : ((rem[fi]<rem[si]) ? 1 : (-1)));
36 }
37
38 void
39 test::distrib(void)
40 {
41   double total = 0.0;
42   int i;
43   for(i=0;i<numrecd;i++)
44     total += (double) speeds[i];
45   double *nspeeds = new double[numrecd];
46   for(i=0;i<numrecd;i++)
47     nspeeds[i] = (double) speeds[i] / total;
48   int *cp = new int[numrecd];
49   for(i=0;i<numrecd;i++)
50     cp[i] = (int) (nspeeds[i]*nchunks);
51   int nr = 0;
52   for(i=0;i<numrecd;i++)
53     nr += cp[i];
54   nr = nchunks - nr;
55   if(nr != 0)
56   {
57     rem = new double[numrecd];
58     for(i=0;i<numrecd;i++)
59       rem[i] = (double)nchunks*nspeeds[i] - cp[i];
60     int *pes = new int[numrecd];
61     for(i=0;i<numrecd;i++)
62       pes[i] = i;
63     qsort(pes, numrecd, sizeof(int), cmp);
64     for(i=0;i<nr;i++)
65       cp[pes[i]]++;
66   }
67   int minspeed = INT_MAX;
68   for(i=0;i<numrecd;i++)
69     if(minspeed > speeds[i])
70       minspeed = speeds[i];
71   double *rel = new double[numrecd];
72   for(i=0;i<numrecd;i++)
73     rel[i] = (double)speeds[i] /(double)minspeed;
74   int *rr = new int[numrecd];
75   for(i=0;i<numrecd;i++)
76     rr[i] = 0;
77   int j = 0;
78   for(i=0;i<nchunks;i++)
79   {
80     rr[j]++;
81     j = (j+1)%numrecd;
82   }
83   double rrtime = 0.0;
84   double proptime = 0.0;
85   for(i=0;i<numrecd;i++)
86   {
87     double ptime = (double)rr[i]/rel[i];
88     if(rrtime < ptime)
89       rrtime = ptime;
90     ptime = (double)cp[i]/rel[i];
91     if(proptime < ptime)
92       proptime = ptime;
93   }
94   if(CkMyPe()==0)
95   {
96     char *str = new char[1024];
97     char stmp[32];
98     sprintf(str, "Distrib: ");
99     for(i=0;i<numrecd;i++)
100     {
101       sprintf(stmp, "%d=>%d ", i, cp[i]);
102       strcat(str, stmp);
103     }
104     CkPrintf("%s\n", str);
105     CkPrintf("Expected perf improvement using prop map: %lf percent\n",
106               ((rrtime-proptime))*100.0/rrtime);
107   }
108 }
109
110 main::main(CkArgMsg* m)
111 {
112   if(m->argc < 2) {
113     CkPrintf("Usage: charmrun pgm +pN <nchunks>\n");
114     CkAbort("");
115   }
116   int nchunks = atoi(m->argv[1]);
117   CkGroupID gid = CProxy_test::ckNew();
118   CProxy_test grp(gid);
119   grp.measure(nchunks);
120   delete m;
121 }
122
123 #include "speed.def.h"
124