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