optimize chkp after ldb
[charm.git] / src / langs / pvmc / pvmctest.c
1 #include <stdio.h>
2 #include <sys/time.h>
3 #include <math.h>
4 #include "pvm3.h"
5 #include <converse.h>
6
7 /* #include <sys/types.h> */
8 /* #include <fcntl.h> */
9
10 #define MALLOC(x) CmiAlloc(x)
11 #define PRINTF CmiPrintf
12 #define puts(x) CmiPrintf("%s%c",(x),'\n')
13
14 pvmc_user_main(argc,argv)
15 {
16   if (CmiMyPe()==0) {
17     time_master(argc,argv);
18   } else {
19     time_slave(argc,argv);
20   }
21   exit(1);
22 }
23
24 /*
25 *       timing.c
26 *
27 *       Does a few communication timing tests on pvm.
28 *       Uses `timing_slave' to echo messages.
29 *
30 *       9 Dec 1991  Manchek
31 *  14 Oct 1992  Geist  - revision to pvm3
32 */
33
34
35 #define SLAVENAME "timeslave"
36
37 time_master(argc, argv)
38 int argc;
39 char **argv;
40 {
41   int mytid;                  /* my task id */
42   int stid = 0;               /* slave task id */
43   int reps = 20;              /* number of samples per test */
44   struct timeval tv1, tv2;    /* for timing */
45   int dt1, dt2;               /* time for one iter */
46   int at1, at2;               /* accum. time */
47   int numint;                 /* message length */
48   int n;
49   int i;
50   int *iarray = 0;
51
52   /* enroll in pvm */
53
54   if ((mytid = pvm_mytid()) < 0) {
55     exit(1);
56   }
57   PRINTF("i'm t%x\n", mytid);
58
59   /* start up slave task */
60   /*        PRINTF("Argc==%d, name == %s\n", argc, argv[1]);*/
61   if (argc>1)  /* read it of the command line */
62     {
63       if (pvm_spawn(SLAVENAME, (char **)0, PvmTaskHost, argv[1], 1, &stid) <=0 || stid < 0) {
64         fputs("can't initiate slave on ", stderr);
65         fputs(argv[1], stderr);
66         fputs("\n", stderr);
67         goto bail;
68       }
69     }
70   else   /* let the pvmd decide */
71     if (pvm_spawn(SLAVENAME, (char**)0, 0, "", 1, &stid) <= 0 || stid < 0) {
72       fputs("can't initiate slave\n", stderr);
73       goto bail;
74     }
75
76   PRINTF("slave is task t%x\n", stid);
77
78   /*
79    *  round-trip timing test
80    */
81
82   puts("Doing Round Trip test, minimal message size\n");
83   at1 = 0;
84
85   /* pack buffer */
86
87   pvm_initsend(PvmDataRaw);
88   pvm_pkint(&stid, 1, 1);
89
90   puts(" N     uSec");
91   for (n = 1; n <= reps; n++) {
92     gettimeofday(&tv1, (struct timezone*)0);
93
94     if (pvm_send(stid, 1)) {
95       PRINTF("can't send to \"%s\"\n", SLAVENAME);
96       goto bail;
97     }
98
99     if (pvm_recv(-1, -1) < 0) {
100       PRINTF("recv error%d\n" );
101       goto bail;
102     }
103
104     gettimeofday(&tv2, (struct timezone*)0);
105
106     dt1 = (tv2.tv_sec - tv1.tv_sec) * 1000000 + tv2.tv_usec - tv1.tv_usec;
107     /*                PRINTF("(sec = %d %d, usec = %d %d) %2d %8d\n", tv2.tv_sec, tv1.tv_sec, tv2.tv_usec, tv1.tv_usec, n, dt1);*/
108     PRINTF("TIME 0 %2d %8d\n", n, dt1);
109     at1 += dt1;
110   }
111   PRINTF("RTT Avg uSec %d\n", at1 / reps);
112
113   /*
114    *  bandwidth test for different message lengths
115    */
116
117   puts("\nDoing Bandwidth tests\n");
118
119   for (numint = 25; numint < 100000; numint *= 10) {
120     PRINTF("\nMessage size is %d integers (%d bytes)\n", 
121            numint, numint * sizeof(int));
122     at1 = at2 = 0;
123     iarray = (int*)MALLOC(numint * sizeof(int));
124     puts(" N  Pack uSec  Send uSec");
125     for (n = 1; n <= reps; n++) {
126       gettimeofday(&tv1, (struct timezone*)0);
127
128       pvm_initsend(PvmDataRaw);
129       pvm_pkint(iarray, numint, 1);
130
131       gettimeofday(&tv2, (struct timezone*)0);
132       dt1 = (tv2.tv_sec - tv1.tv_sec) * 1000000
133         + tv2.tv_usec - tv1.tv_usec;
134
135       gettimeofday(&tv1, (struct timezone*)0);
136
137       if (pvm_send(stid, 1)) {
138         PRINTF("can't send to \"%s\"\n", SLAVENAME);
139         goto bail;
140       }
141
142       if (pvm_recv(-1, -1) < 0) {
143         PRINTF("recv error%d\n" );
144         goto bail;
145       }
146
147       gettimeofday(&tv2, (struct timezone*)0);
148       dt2 = (tv2.tv_sec - tv1.tv_sec) * 1000000
149         + tv2.tv_usec - tv1.tv_usec;
150
151       PRINTF("TIME %d %2d   %8d   %8d   %8d\n", sizeof(int)*numint, n, dt1, dt2,dt1+dt2);
152       at1 += dt1;
153       at2 += dt2;
154     }
155
156     puts("Total uSec");
157     PRINTF("     %8d   %8d   %8d\n", at1, at2,at1+at2);
158
159     at1 /= reps;
160     at2 /= reps;
161     puts("Avg uSec");
162     PRINTF("     %8d   %8d\n", at1, at2);
163     puts("Avg Byte/uSec");
164     PRINTF("     %8f   %8f\n",
165            (numint * 4) / (double)at1,
166            (numint * 4) / (double)at2);
167   }
168
169   puts("\ndone");
170
171 bail:
172   if (stid > 0)
173     pvm_kill(stid);
174   sleep(10);
175   pvm_exit();
176   exit(1);
177 }
178
179
180 /*
181 *       timing_slave.c
182 *
183 *       See timing.c
184 */
185
186 time_slave(argc, argv)
187 int argc;
188 char **argv;
189 {
190   int mytid;   /* my task id */
191   int dtid;    /* driver task */
192   int bufid;
193   int n = 0;
194
195   /* enroll in pvm */
196
197   mytid = pvm_mytid();
198
199   /* pack mytid in buffer */
200
201   pvm_initsend(PvmDataRaw);
202   pvm_pkint(&mytid, 1, 1);
203
204   /* our job is just to echo back to the sender when we get a message */
205
206   while (1) {
207     bufid = pvm_recv(-1, -1);
208     pvm_bufinfo(bufid, (int*)0, (int*)0, &dtid);
209     pvm_send(dtid, 2);
210     /*
211       PRINTF("echo %d\n", ++n);
212       */
213   }
214 }
215