getting rid of calls to cbrt
[charm.git] / src / ck-com / AAMLearner.C
1 #include "AAMLearner.h"
2 #include "ComlibManager.h"
3
4 #include "EachToManyMulticastStrategy.h"
5 #include "RingMulticastStrategy.h"
6
7 AAMLearner::AAMLearner() {
8    init();
9 }
10
11 void AAMLearner::init() {
12     alpha = ALPHA;
13     beta = BETA;
14     gamma = GAMMA;
15 }
16
17 Strategy *AAMLearner::optimizePattern(Strategy *strat, 
18                                            ComlibGlobalStats &stats) {
19     CharmStrategy *in_strat = (CharmStrategy *)strat;
20     double npes;              //, *pelist;
21     CharmStrategy *ostrat = NULL;
22
23     double degree = 0, msgsize = 0, nmsgs = 0;
24     stats.getAverageStats(strat->getInstance(), msgsize, nmsgs, degree, npes);
25
26     double dcost = computeDirect(npes, msgsize, degree);
27     double mcost = computeMesh(npes, msgsize, degree);
28     double gcost = computeGrid(npes, msgsize, degree);
29     double hcost = computeHypercube(npes, msgsize, degree);
30     double mincost = min4(dcost, mcost, gcost, hcost);
31
32     int minstrat = -1;
33     if(in_strat->getType() == ARRAY_STRATEGY) {
34         CkArrayID said, daid;
35         CkArrayIndexMax *sidxlist, *didxlist;
36         int nsrc, ndest;
37         
38         in_strat->ainfo.getSourceArray(said, sidxlist, nsrc);
39         in_strat->ainfo.getDestinationArray(daid, didxlist, ndest);
40                
41         if(dcost == mincost) 
42             minstrat = USE_DIRECT;        
43         
44         else if(mcost == mincost) 
45             minstrat = USE_MESH;                
46         else if(gcost == mincost) 
47             minstrat = USE_GRID;
48         else if(hcost == mincost) 
49             minstrat = USE_HYPERCUBE;               
50
51         CkPrintf("Choosing router %d, %g, %g, %g\n", minstrat, 
52                  mcost, hcost, dcost);
53         
54         if(minstrat != USE_DIRECT) {
55             ostrat = new EachToManyMulticastStrategy
56                 (minstrat, said, daid,
57                  nsrc, sidxlist, ndest,
58                  didxlist);
59         }
60         else {
61             ostrat = new RingMulticastStrategy(said, daid);
62         }
63         
64         ostrat->setInstance(in_strat->getInstance());
65     }
66     else
67         CkAbort("Groups Not Implemented Yet\n");
68
69     //Group strategy implement later, foo bar !!
70     
71     return ostrat;
72 }
73
74 //P = number of processors, m = msgsize, d = degree
75 double AAMLearner::computeDirect(double P, double m, double d) {
76     double cost = 0.0;
77     cost = d * alpha;
78     cost += d * m * beta;
79     
80     return cost;
81 }
82
83 /******************* CHECK EQUATIONS FOR AAM ***********/
84 //P = number of processors, m = msgsize, d = degree
85 double AAMLearner::computeMesh(double P, double m, double d) {
86     double cost = 0.0;
87     cost = 2 * sqrt((double) P) * alpha;
88     cost += d * m * (beta + gamma);
89     
90     return cost;
91 }
92
93 //P = number of processors, m = msgsize, d = degree
94 double AAMLearner::computeHypercube(double P, double m, double d) {
95
96     if(P == 0)
97         return 0;
98
99     double cost = 0.0;
100     double log_2_P = log(P)/log(2.0);
101     
102     cost = log_2_P * alpha;
103     cost += d * m * (beta + gamma);
104
105     return cost;
106 }
107
108 //P = number of processors, m = msgsize, d = degree
109 double AAMLearner::computeGrid(double P, double m, double d) {
110     double cost = 0.0;
111     cost = 3 * cubeRoot((double) P) * alpha;
112     cost += d * m * (beta + gamma);
113     
114     return cost;
115 }
116