*** empty log message ***
[charm.git] / examples / ampi / alltoall / mpibench.c
1 #include "mpi.h"
2 #include <stdio.h>
3 #include <stdlib.h>
4 #include <sys/time.h>
5 #include <unistd.h>
6
7 #define NUMTIMES 50
8 #define REPS 100
9 #define MAX_SIZE 131072
10 #define NUM_SIZES 9
11
12 #ifndef MPIWTIME
13 void getclockvalue(double *retval)
14 {
15   static long zsec = 0;
16   static long zusec = 0;
17   struct timeval tp;
18   struct timezone tzp;
19
20   gettimeofday(&tp, &tzp);
21
22   if ( zsec == 0 ) zsec = tp.tv_sec;
23   if ( zusec == 0 ) zusec = tp.tv_usec;
24
25   *retval = (tp.tv_sec - zsec) + (tp.tv_usec - zusec ) * 0.000001 ;
26 }
27 #endif
28
29 int main(argc,argv)
30 int argc;
31 char *argv[];
32 {
33     int myid, root, numprocs, i, j, k, size, num_sizes, times,reps;
34     double startwtime, endwtime, opertime[NUMTIMES][NUM_SIZES];
35     double mean[NUM_SIZES],min[NUM_SIZES],max[NUM_SIZES];
36     int  namelen;
37     char processor_name[MPI_MAX_PROCESSOR_NAME];
38     int *sendb, *recvb;
39     MPI_Status status;
40     int msgsizes[NUM_SIZES];
41
42     msgsizes[0] = 2;
43     msgsizes[1] = 8;
44     msgsizes[2] = 32;
45     msgsizes[3] = 128;
46     msgsizes[4] = 512;
47     msgsizes[5] = 2048;
48     msgsizes[6] = 8192;
49     msgsizes[7] = 32768;
50     msgsizes[8] = 131072;
51
52     MPI_Init(&argc,&argv);
53     MPI_Comm_size(MPI_COMM_WORLD,&numprocs);
54     MPI_Comm_rank(MPI_COMM_WORLD,&myid);
55     MPI_Get_processor_name(processor_name,&namelen);
56
57 #ifdef DEBUG
58     fprintf(stdout,"Process %d of %d on %s \n",
59             myid, numprocs, processor_name);
60 #endif
61
62 /* Initialize memory buffers */
63
64     sendb = (int *)malloc(MAX_SIZE*sizeof(int)*numprocs);
65     recvb = (int *)malloc(MAX_SIZE*sizeof(int)*numprocs);
66
67 #ifdef MPIWTIME
68     startwtime = MPI_Wtime();
69 #else
70     getclockvalue (&startwtime);
71     getclockvalue (&endwtime);
72 #endif
73
74     MPI_Barrier(MPI_COMM_WORLD);
75
76     for (i=0; i<NUMTIMES; i++)
77     {
78         for (num_sizes=0; num_sizes<NUM_SIZES; num_sizes++) {
79                 size = msgsizes[num_sizes];
80                 for (j=0; j<size*numprocs; j++) {
81                         sendb[j] = j;
82                         recvb[j] = 0;
83                 }
84                 MPI_Alltoall(sendb,size,MPI_INT,recvb,size,MPI_INT,MPI_COMM_WORLD);
85                 MPI_Barrier(MPI_COMM_WORLD);
86 #ifdef MPIWTIME
87                 startwtime = MPI_Wtime();
88 #else
89                 getclockvalue (&startwtime);
90 #endif
91                 for (k=0; k< REPS ; k++) {
92                         MPI_Alltoall(sendb,size,MPI_INT,recvb,size,MPI_INT,MPI_COMM_WORLD);
93                 }
94 #ifdef MPIWTIME
95                 endwtime = MPI_Wtime();
96 #else
97                 getclockvalue (&endwtime);
98 #endif
99                 opertime[i][num_sizes] = 
100                         (endwtime-startwtime)/(float)(REPS) ;
101         }
102     }
103     MPI_Barrier(MPI_COMM_WORLD);
104
105 /* Report results */
106     if (myid==0) {
107       for (num_sizes=0; num_sizes < NUM_SIZES; num_sizes++) {
108         mean[num_sizes] = 0.0;
109         min[num_sizes] = 100000. ;
110         max[num_sizes] = 0.0 ;
111       }
112
113       for (i=0; i<NUMTIMES; i++) {
114         for (num_sizes=0; num_sizes < NUM_SIZES; num_sizes++) {
115 #ifdef DEBUG
116                 printf("%d %d %g\n",i,msgsizes[num_sizes],
117                         opertime[i][num_sizes]) ;
118 #endif
119                 mean[num_sizes] += opertime[i][num_sizes] ;
120                 if (min[num_sizes] > opertime[i][num_sizes])
121                         min[num_sizes] = opertime[i][num_sizes] ;
122                 if (max[num_sizes] < opertime[i][num_sizes])
123                         max[num_sizes] = opertime[i][num_sizes] ;
124         }
125 #ifdef DEBUG
126         printf("\n");
127 #endif
128       }
129
130       for (num_sizes=0; num_sizes < NUM_SIZES; num_sizes++) 
131         mean[num_sizes] /= (float)NUMTIMES;
132
133 #ifdef DEBUG
134       for (num_sizes=0; num_sizes < NUM_SIZES; num_sizes++) {
135         printf("%d %g %g %g\n",msgsizes[num_sizes],mean[num_sizes] * 1000000., 
136                         min[num_sizes] * 1000000., max[num_sizes] * 1000000. ); 
137       }
138       printf("================================================\n");
139 #endif
140
141       times=NUMTIMES; reps=REPS;
142       printf("#Alltoall: P=%d, NUMTIMES=%d, REPS=%d\n",
143         numprocs, times, reps);
144       printf("%d ",numprocs);
145       for (num_sizes=0; num_sizes < NUM_SIZES; num_sizes++) 
146                 printf("%g ",mean[num_sizes] * 1000000.);
147       printf("\n");
148     }
149
150     MPI_Finalize();
151     return 0;
152 }
153
154