Several new changes
[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, 
25                           degree, npes);
26
27     double dcost = computeDirect(npes, msgsize, degree);
28     double mcost = computeMesh(npes, msgsize, degree);
29     double gcost = computeGrid(npes, msgsize, degree);
30     double hcost = computeHypercube(npes, msgsize, degree);
31     double mincost = min4(dcost, mcost, gcost, hcost);
32
33     int minstrat = -1;
34     if(in_strat->getType() == ARRAY_STRATEGY) {
35         CkArrayID said, daid;
36         CkArrayIndexMax *sidxlist, *didxlist;
37         int nsrc, ndest;
38         
39         in_strat->ainfo.getSourceArray(said, sidxlist, nsrc);
40         in_strat->ainfo.getDestinationArray(daid, didxlist, ndest);
41                
42         if(dcost == mincost) 
43             minstrat = USE_DIRECT;        
44         
45         else if(mcost == mincost) 
46             minstrat = USE_MESH;                
47         else if(gcost == mincost) 
48             minstrat = USE_GRID;
49         else if(hcost == mincost) 
50             minstrat = USE_HYPERCUBE;               
51
52         CkPrintf("Choosing router %d, %g, %g, %g\n", minstrat, 
53                  mcost, hcost, dcost);
54         
55         //if(minstrat != USE_DIRECT) {
56         ostrat = new EachToManyMulticastStrategy
57             (minstrat, said, daid,
58              nsrc, sidxlist, ndest,
59              didxlist);
60         
61         ostrat->setMulticast();
62
63         /*
64           }        
65           else {
66           ostrat = new RingMulticastStrategy(said, daid);
67           
68           }
69         */
70         
71         ostrat->setInstance(in_strat->getInstance());
72     }
73     else
74         CkAbort("Groups Not Implemented Yet\n");
75
76     //Group strategy implement later, foo bar !!
77     
78     return ostrat;
79 }
80
81 //P = number of processors, m = msgsize, d = degree
82 double AAMLearner::computeDirect(double P, double m, double d) {
83     double cost = 0.0;
84     cost = d * alpha;
85     cost += d * m * beta;
86     
87     return cost;
88 }
89
90 /******************* CHECK EQUATIONS FOR AAM ***********/
91 //P = number of processors, m = msgsize, d = degree
92 double AAMLearner::computeMesh(double P, double m, double d) {
93     double cost = 0.0;
94     cost = 2 * sqrt((double) P) * alpha;
95     cost += d * m * (beta + gamma);
96     
97     return cost;
98 }
99
100 //P = number of processors, m = msgsize, d = degree
101 double AAMLearner::computeHypercube(double P, double m, double d) {
102
103     if(P == 0)
104         return 0;
105
106     double cost = 0.0;
107     double log_2_P = log(P)/log(2.0);
108     
109     cost = log_2_P * alpha;
110     cost += d * m * (beta + gamma);
111
112     return cost;
113 }
114
115 //P = number of processors, m = msgsize, d = degree
116 double AAMLearner::computeGrid(double P, double m, double d) {
117
118     double cost = 0.0;
119     cost = 3 * cubeRoot((double) P) * alpha;
120     cost += d * m * (beta + gamma);
121     
122     return cost;
123 }
124