6e528d25dfe19e5a309ac3b7e96b1e84de812534
[charm.git] / examples / charm++ / zerocopy / entry_method_api / prereg / pingpong / pingpong.C
1 #include "pingpong.decl.h"
2
3 #define BIG_ITER 10
4 #define SMALL_ITER 100
5
6 #define MAX_PAYLOAD 1 << 12
7
8 CProxy_main mainProxy;
9
10 #define P1 0
11 #define P2 1%CkNumPes()
12
13 class main : public CBase_main
14 {
15   CProxy_Ping1 arr1;
16   int size;
17 public:
18   main(CkMigrateMessage *m) {}
19   main(CkArgMsg *m)
20   {
21     if(CkNumPes()>2) {
22       CkAbort("Run this program on 1 or 2 processors only.\n");
23     }
24     delete m;
25     size = 1024;
26     mainProxy = thisProxy;
27     CkPrintf("Size (bytes) \t\tIterations\t\tRegular API (one-way us)\tZero Copy API (one-way us)\n");
28     arr1 = CProxy_Ping1::ckNew(2);
29     CkStartQD(CkCallback(CkIndex_main::maindone(), mainProxy));
30   };
31
32   void maindone(void){
33     if(size < MAX_PAYLOAD){
34       arr1[0].start(size);
35       size = size << 1;
36     }
37     else if(size == MAX_PAYLOAD){
38       arr1[0].freeBuffer();
39     }
40   };
41 };
42
43
44 class Ping1 : public CBase_Ping1
45 {
46   int size;
47   int niter;
48   int iterations;
49   double start_time, end_time, reg_time, zerocpy_time;
50   char *nocopyMsg;
51
52 public:
53   Ping1()
54   {
55     nocopyMsg = (char *)CkRdmaAlloc(sizeof(char) * MAX_PAYLOAD);
56     niter = 0;
57   }
58   Ping1(CkMigrateMessage *m) {}
59
60   void start(int size)
61   {
62     niter = 0;
63     if(size >= 1 << 20)
64       iterations = SMALL_ITER;
65     else
66       iterations = BIG_ITER;
67     start_time = CkWallTimer();
68     thisProxy[1].recv(nocopyMsg, size);
69   }
70
71   void freeBuffer(){
72     CkRdmaFree(nocopyMsg);
73     if(thisIndex == 0){
74       thisProxy[1].freeBuffer();
75     }
76     else{
77       CkExit();
78     }
79   }
80
81   void recv(char* msg, int size)
82   {
83     if(thisIndex==0) {
84       niter++;
85       if(niter==iterations) {
86         end_time = CkWallTimer();
87         reg_time = 1.0e6*(end_time-start_time)/iterations;
88         niter = 0;
89         start_time = CkWallTimer();
90         thisProxy[1].recv_zerocopy(CkSendBuffer(nocopyMsg, CK_BUFFER_PREREG), size);
91       } else {
92         thisProxy[1].recv(nocopyMsg, size);
93       }
94     } else {
95       thisProxy[0].recv(nocopyMsg, size);
96     }
97   }
98
99   void recv_zerocopy(char* msg, int size)
100   {
101     if(thisIndex==0) {
102       niter++;
103       if(niter==iterations) {
104         end_time = CkWallTimer();
105         zerocpy_time = 1.0e6*(end_time-start_time)/iterations;
106         if(size < 1 << 24)
107           CkPrintf("%d\t\t\t%d\t\t\t%lf\t\t\t%lf\n", size, iterations, reg_time/2, zerocpy_time/2);
108         else //using different print format for larger numbers for aligned output
109           CkPrintf("%d\t\t%d\t\t\t%lf\t\t\t%lf\n", size, iterations, reg_time/2, zerocpy_time/2);
110         niter=0;
111         mainProxy.maindone();
112       } else {
113         thisProxy[1].recv_zerocopy(CkSendBuffer(nocopyMsg, CK_BUFFER_PREREG), size);
114       }
115     } else {
116       thisProxy[0].recv_zerocopy(CkSendBuffer(nocopyMsg, CK_BUFFER_PREREG), size);
117     }
118   }
119 };
120
121 #include "pingpong.def.h"