75db728a76326d16d5b4872310a3e2649380b275
[charm.git] / examples / charm++ / hello / xarraySection / hello.C
1 #include <stdio.h>
2 #include "hello.decl.h"
3 #include "ckmulticast.h"
4
5 /*readonly*/ CProxy_Main mainProxy;
6
7
8 class pingMsg: public CkMcastBaseMsg, public CMessage_pingMsg
9 {
10     public:
11         pingMsg(int num=0): hiNo(num) {}
12         int hiNo;
13 };
14
15 /*mainchare*/
16 class Main : public CBase_Main
17 {
18 public:
19   Main(CkArgMsg* m): numArrays(2), numElements(5), sectionSize(numElements), maxIter(3), numReceived(0), numIter(0)
20   {
21     //Process command-line arguments
22     if (m->argc > 1) numElements = atoi(m->argv[1]);
23     if (m->argc > 2) numArrays   = atoi(m->argv[2]);
24     if (m->argc > 3) sectionSize = atoi(m->argv[3]); else sectionSize = numElements;
25     if (m->argc > 4) maxIter     = atoi(m->argv[4]);
26     if (m->argc > 5)
27     { CkPrintf("Syntax: %s [numElements numArrays sectionSize maxIter]",m->argv[0]); CkAbort("Wrong Usage\n"); }
28     delete m;
29
30     CkPrintf("Running a cross-array section demo.\n");
31     CkPrintf("\tnum PEs = %d\n\tnum arrays = %d\n\tnum elements = %d\n\tsection size = %d\n\tnum iterations = %d\n",
32              CkNumPes(), numArrays, numElements, sectionSize, maxIter);
33
34     mainProxy = thisProxy;
35     // Setup section member index bounds
36     int afloor = 0, aceiling = sectionSize-1;
37
38     // Allocate space
39     CProxy_Hello *arrayOfArrays = new CProxy_Hello[numArrays];
40     CkArrayID *arrID            = new CkArrayID[numArrays];
41     int *nelems                 = new int[numArrays];
42     CkArrayIndexMax **elems     = new CkArrayIndexMax*[numArrays];
43
44     // Create a list of array section members
45     for(int k=0; k < numArrays; k++)
46     {
47         // Create the array
48         arrayOfArrays[k] = CProxy_Hello::ckNew(k, numElements);
49         // Store the AID
50         arrID[k]  = arrayOfArrays[k].ckGetArrayID();
51         // Create a list of section member indices in this array
52         nelems[k] = sectionSize;
53         elems[k]  = new CkArrayIndexMax[sectionSize];
54         for(int i=afloor,j=0; i <= aceiling; i++,j++)
55             elems[k][j] = CkArrayIndex1D(i);
56     }
57     // Create the x-array-section
58     sectionProxy = CProxySection_Hello(numArrays, arrID, elems, nelems);
59
60     // Create a multicast manager group
61     CkGroupID mcastMgrGID = CProxy_CkMulticastMgr::ckNew();
62     CkMulticastMgr *mcastMgr = CProxy_CkMulticastMgr(mcastMgrGID).ckLocalBranch();
63     // Delegate the section comm to the CkMulticast library
64     sectionProxy.ckSectionDelegate(mcastMgr);
65
66     // Start the test by pinging the section
67     pingMsg *msg = new pingMsg(numIter);
68     sectionProxy.SayHi(msg);
69   };
70
71   /// Test controller method
72   void done(void)
73   {
74       if (++numReceived >= numArrays * sectionSize)
75       {
76           numReceived = 0;
77           if (++numIter == maxIter) {
78               CkPrintf("----------------- testController: All %d iterations done\n", numIter);
79               CkExit();
80           }
81           else {
82               // Ping the section
83               CkPrintf("----------------- testController: Iteration %d done\n", numIter);
84               pingMsg *msg = new pingMsg(numIter);
85               sectionProxy.SayHi(msg);
86           }
87       }
88   };
89
90 private:
91   /// Input parameters
92   int numArrays, numElements, sectionSize, maxIter;
93   /// Counters
94   int numReceived, numIter;
95   /// The cross-array section proxy
96   CProxySection_Hello sectionProxy;
97 };
98
99 /*array [1D]*/
100 class Hello : public CBase_Hello
101 {
102 public:
103   Hello(int _aNum): aNum(_aNum)
104   {
105     CkPrintf("AID[%d] Hello %d created on pe %d\n", aNum, thisIndex, CkMyPe());
106   }
107
108   Hello(CkMigrateMessage *m) {}
109
110   void SayHi(pingMsg *msg)
111   {
112     CkPrintf("AID[%d] Hi[%d] from element %d\n", aNum, msg->hiNo, thisIndex);
113     mainProxy.done();
114     delete msg;
115   }
116 private:
117   int aNum;
118 };
119
120 #include "hello.def.h"
121