msgQ test: Adjust test parameters (num priorities, numiters)
[charm.git] / tests / charm++ / array4d / hello.C
1 /** \file hello.C
2  *  Author: Abhinav S Bhatele
3  *  Date Created: November 4th, 2007
4  */
5
6 #include "hello.decl.h"
7 #include <stdio.h>
8 #include "ckmulticast.h"
9 #include "TopoManager.h"
10
11 /*readonly*/ CProxy_Main mainProxy;
12 /*readonly*/ int numW;
13 /*readonly*/ int numX;
14 /*readonly*/ int numY;
15 /*readonly*/ int numZ;
16
17 /** \class Main
18  *
19  */
20 class Main : public CBase_Main
21 {
22 public:
23   CProxy_Hello arr;
24   CProxySection_Hello secProxy;
25   int numElems;
26   int counter;
27
28   Main(CkArgMsg* m)
29   {
30     numElems = counter = 0;
31     //Process command-line arguments
32     numW = numX = numY = numZ = 5;
33     if(m->argc > 1) {
34       if(m->argc != 5)
35         CkPrintf("4 arguments needed, one for each dimension\n");
36       else {
37         numW = atoi(m->argv[1]);
38         numX = atoi(m->argv[2]);
39         numY = atoi(m->argv[3]);
40         numZ = atoi(m->argv[4]);
41       }
42     }
43     delete m;
44
45     //Start the computation
46     CkPrintf("Running Hello on %d processors for [%d][%d][%d][%d] elements\n",
47              CkNumPes(), numW, numX, numY, numZ);
48     mainProxy = thisProxy;
49
50     CProxy_HelloMap map = CProxy_HelloMap::ckNew(numW, numX, numY, numZ);
51     CkArrayOptions opts;
52     opts.setMap(map);
53     arr = CProxy_Hello::ckNew(opts);
54
55     for(int i1=0; i1<numW; i1++)
56       for(int i2=0; i2<numX; i2++)
57         for(int i3=0; i3<numY; i3++)
58           for(int i4=0; i4<numZ; i4++) {
59             arr(i1, i2, i3, i4).insert();
60           }
61     CkPrintf("Array created\n");
62
63     CkVec<CkArrayIndex4D> elems;    // add array indices
64     for (short int i=0; i<1; i++)
65       for (short int j=0; j<2; j+=2)
66         for (short int k=0; k<3; k+=2)
67           for (short int l=0; l<4; l+=2)
68             elems.push_back(CkArrayIndex4D(i, j, k, l)); 
69     numElems = elems.size();
70     secProxy = CProxySection_Hello::ckNew(arr, elems.getVec(), numElems);
71
72     CkGroupID mCastGrpId = CProxy_CkMulticastMgr::ckNew();
73     CkMulticastMgr *mcastGrp = CProxy_CkMulticastMgr(mCastGrpId).ckLocalBranch();
74     secProxy.ckSectionDelegate(mcastGrp);  // initialize section proxy
75
76     CkPrintf("Section created\n");
77
78     arr(0, 0, 0, 0).SayHi(17);
79   };
80
81   void done_1(void)
82   {
83     CkPrintf("Phase 1 done\n");
84     secProxy.SayBye();
85     // CkExit();
86   };
87
88   void done_2(void)
89   {
90     counter++;
91     if(counter == numElems) {
92       CkPrintf("Phase 2 done\n");
93       CkPrintf("All done\n");
94       CkExit();
95     }
96   };
97 };
98
99 /** \class Hello
100  *
101  */
102 class Hello : public CBase_Hello 
103 {
104 public:
105   Hello()
106   {
107     //CkPrintf("Hello %d %d %d %d created\n", thisIndex.w, thisIndex.x, thisIndex.y, thisIndex.z);
108   }
109
110   Hello(CkMigrateMessage *m) {}
111   
112   void SayHi(int hiNo)
113   {
114     char *name=(char *)malloc(sizeof(char)*1000);
115     CkPrintf("Hi [%d] from element %d %d %d %d\n", hiNo, thisIndex.w, thisIndex.x, thisIndex.y, thisIndex.z);
116     //Pass the hello on:
117     if(thisIndex.w < numW-1)
118       thisProxy(thisIndex.w+1, thisIndex.x, thisIndex.y, thisIndex.z).SayHi(hiNo+1);
119     else if(thisIndex.x < numX-1)
120       thisProxy(thisIndex.w, thisIndex.x+1, thisIndex.y, thisIndex.z).SayHi(hiNo+1);
121     else if(thisIndex.y < numY-1)
122       thisProxy(thisIndex.w, thisIndex.x, thisIndex.y+1, thisIndex.z).SayHi(hiNo+1);
123     else if(thisIndex.z < numZ-1)
124       thisProxy(thisIndex.w, thisIndex.x, thisIndex.y, thisIndex.z+1).SayHi(hiNo+1);
125     else 
126       //We've been around once-- we're done.
127       mainProxy.done_1();
128   }
129
130   void SayBye()
131   {
132     CkPrintf("Bye from element %d %d %d %d\n", thisIndex.w, thisIndex.x, thisIndex.y, thisIndex.z);
133     mainProxy.done_2();
134   }
135 };
136
137 /** \class HelloMap
138  *
139  */
140 class HelloMap : public CkArrayMap {
141   public:
142     int ****mapping;
143
144     HelloMap(int w, int x, int y, int z) {
145       int i, j, k;
146       mapping = new int***[w];
147       for (i=0; i<w; i++) {
148         mapping[i] = new int**[x];
149         for(j=0; j<x; j++) {
150           mapping[i][j] = new int*[y];
151             for(k=0; k<y; k++)
152               mapping[i][j][k] = new int[z]; 
153         }
154       }
155
156       for(int i=0; i<w; i++)
157         for(int j=0; j<x; j++)
158           for(int k=0; k<y; k++)
159             for(int l=0; l<z; l++) {
160               mapping[i][j][k][l] = i;
161             }
162
163     }
164
165     int procNum(int, const CkArrayIndex &idx) {
166       short *index = (short *)idx.data();
167       return mapping[index[0]][index[1]][index[2]][index[3]]; 
168     }
169 };
170
171 #include "hello.def.h"