added a point-point broadcast example
[charm.git] / tests / charm++ / broadcast / broadcast.C
1 #include <string.h> // for strlen, and strcmp
2 #include <charm++.h>
3
4 #define NITER 1000
5 #define PAYLOAD 100
6
7 #include "broadcast.decl.h"
8 class PingMsg : public CMessage_PingMsg
9 {
10   public:
11     char *x;
12
13 };
14
15 CProxy_main mainProxy;
16 int iterations;
17 int payload;
18
19 class main : public CBase_main
20 {
21   int phase;
22   CProxy_Ping1 arr1;
23 public:
24   main(CkMigrateMessage *m) {}
25   main(CkArgMsg* m)
26   {
27
28     iterations=NITER;
29     payload=PAYLOAD;
30     if(m->argc>1)
31       payload=atoi(m->argv[1]);
32     if(m->argc>2)
33       iterations=atoi(m->argv[2]);
34     if(m->argc>3)
35       CkPrintf("Usage: pgm +pN [payload] [iterations]\n Where N [1-2], payload (default %d) is integer >0 iterations (default %d) is integer >0 ", PAYLOAD, NITER);
36     CkPrintf("broadcast with payload: %d iterations: %d\n", payload,iterations);
37     mainProxy = thishandle;
38     phase = 0;
39     arr1 = CProxy_Ping1::ckNew(CkNumPes());
40     phase=0;
41     mainProxy.maindone();
42     delete m;
43   }
44
45   void maindone(void)
46   {
47     switch(phase++) {
48       case 0:
49         arr1[0].start();
50     break;
51       default:
52     CkExit();
53     }
54   }
55 };
56
57
58 class Ping1 : public CBase_Ping1
59 {
60   CProxy_Ping1 *pp;
61   int niter, ack;
62   double start_time, end_time;
63 public:
64   Ping1()
65   {
66     pp = new CProxy_Ping1(thisArrayID);
67     niter = 0;
68   }
69   Ping1(CkMigrateMessage *m) {}
70   void start(void)
71   {
72       int i;
73       ack = 0;
74       for(i=1; i<CkNumPes(); i++)
75       {
76           (*pp)[i].recv(new (payload) PingMsg);
77       }
78     start_time = CkWallTimer();
79   }
80
81   void back(PingMsg *msg)
82   {
83       int i;
84     ack++;
85     if(ack == CkNumPes()-1)
86     {
87         niter++;
88         if(niter==iterations) {
89             end_time = CkWallTimer();
90             CkPrintf("Time for 1D Arrays broadcast and reduction is %lf us\n",
91                  1.0e6*(end_time-start_time)/iterations);
92
93             //mainProxy.maindone();
94             niter=0;
95             start_time = CkWallTimer();
96             mainProxy.maindone();
97         }else
98         {
99             for(i=1; i<CkNumPes(); i++)
100             {
101                 (*pp)[i].recv(new (payload) PingMsg);
102             }
103             ack =0;
104         }
105     }
106   }
107   void recv(PingMsg *msg)
108   {
109         (*pp)[0].back(msg);
110   }
111 };
112
113 #include "broadcast.def.h"