*** empty log message ***
authorChao Huang <chuang10@uiuc.edu>
Fri, 14 Jul 2006 06:37:37 +0000 (06:37 +0000)
committerChao Huang <chuang10@uiuc.edu>
Fri, 14 Jul 2006 06:37:37 +0000 (06:37 +0000)
examples/ampi/alltoall/mpibench.c

index a15a2140e725ff0ea4b2f66de7625d8f12633ac1..47db6887d99f2a70eac1e05cc336f5bcc3ac045a 100644 (file)
-#include <stdio.h>\r
-#include <stdlib.h>\r
-#include "mpi.h"\r
-#include <sys/time.h>\r
-#include <stdlib.h>\r
-\r
-#define INIT_SEC 1000000\r
-\r
-#define USE_ALLTOALL\r
-//#define USE_BCAST\r
-\r
-struct itimerval *tim;\r
-unsigned int Timers = 0;\r
-\r
-void   Create_Timers (int n);\r
-void   Start_Timer   (int i, int which);\r
-float  Read_Timer    (int i, int which);\r
-\r
-void Create_Timers (int n)\r
-{\r
-  if( Timers > 0 )\r
-    {\r
-      fprintf (stderr, "Create_Timers: timers already created!\n");\r
-      exit (-1);\r
-    }\r
-  \r
-  tim = (struct itimerval*) malloc (n * sizeof (struct itimerval));\r
-  Timers = n;\r
-}\r
-\r
-void Start_Timer (int i, int which)\r
-{\r
-  if( i >= Timers )\r
-    {\r
-      fprintf (stderr, "Start_Timers: out-of-range timer index %d\n", i);\r
-      exit (-1);\r
-    }\r
-  \r
-  tim[i].it_value.tv_sec = INIT_SEC;\r
-  tim[i].it_value.tv_usec = 0;\r
-  tim[i].it_interval.tv_sec = INIT_SEC;\r
-  tim[i].it_interval.tv_usec = 0;\r
-  \r
-  setitimer (which, &(tim[i]), NULL);\r
-}\r
-\r
-float Read_Timer (int i, int which)\r
-{\r
-  float elapsed_time;\r
-  \r
-  if( i >= Timers )\r
-    {\r
-      fprintf (stderr, "Read_Timer: out-of-range timer index %d\n", i);\r
-      exit (-1);\r
-    }\r
-  \r
-  getitimer (which, &(tim[i]));\r
-  \r
-  elapsed_time = ( (float)INIT_SEC - tim[i].it_value.tv_sec ) -\r
-    ( (float)tim[i].it_value.tv_usec/1000000 );\r
-  \r
-  return elapsed_time;\r
-}\r
-\r
-main(int argc, char **argv)\r
-{\r
-  int my_id;           /* process id */\r
-  int p=0;             /* number of processes */\r
-  char* message;       /* storage for the message */\r
-  int i,j, count, k, max_msgs, msg_size;\r
-  float elapsed_time_msec;\r
-  float bandwidth;\r
-  char *sendbuf, *recvbuf;\r
-  int nsteps=100;\r
-  \r
-  MPI_Request *request_recv = (MPI_Request *) malloc(p * sizeof(MPI_Request));\r
-  MPI_Status *status = (MPI_Status *)malloc(p * sizeof(MPI_Status));\r
-  MPI_Init( &argc, &argv );\r
-  MPI_Comm_rank( MPI_COMM_WORLD, &my_id );\r
-  MPI_Comm_size( MPI_COMM_WORLD, &p );\r
-  \r
-  if (argc < 2) {\r
-    fprintf (stderr, "need msg size as params\n");\r
-    goto EXIT;\r
-  }\r
-  if ((sscanf (argv[1], "%d", &msg_size) < 1) ){\r
-    fprintf (stderr, "need msg size as params\n");\r
-    goto EXIT;\r
-  }\r
-  max_msgs = 1000; \r
-  if(argc >2) \r
-    sscanf (argv[2], "%d", &max_msgs) ;\r
-  \r
-  /* don't start timer until everybody is ok */\r
-  MPI_Barrier(MPI_COMM_WORLD); \r
-  Create_Timers (1);\r
-  \r
-  sendbuf = (char *)malloc(msg_size * sizeof(char) );\r
-  recvbuf = (char *)malloc(msg_size * sizeof(char) * p);\r
-  \r
-  if(my_id==0) printf("Starting benchmark on %d processors with %d iterations\n", p, max_msgs); \r
-  Start_Timer (0, ITIMER_REAL);\r
-  \r
-  for(i=0; i<nsteps; i++) {\r
-    for(j=0; j<max_msgs; j++) {\r
-      MPI_Send(sendbuf, msg_size, MPI_CHAR, (my_id+1)%2, j, MPI_COMM_WORLD);\r
-#if 1\r
-      MPI_Recv(recvbuf, msg_size, MPI_CHAR, (my_id+1)%2, j, MPI_COMM_WORLD,&status[j]); \r
-    }\r
-#else\r
-      MPI_Irecv(recvbuf, msg_size, MPI_CHAR, (my_id+1)%2, j, MPI_COMM_WORLD,&request_recv[j]); \r
-    }\r
-    MPI_Waitall(max_msgs, request_recv, status); \r
-#endif\r
-    MPI_Barrier(MPI_COMM_WORLD); \r
-  }\r
-  \r
-  MPI_Barrier(MPI_COMM_WORLD); \r
-  if(my_id==0){\r
-    elapsed_time_msec = Read_Timer (0, ITIMER_REAL) * 1000.0 / max_msgs; \r
-    bandwidth = 2 * 8 * msg_size / (1000.0 * elapsed_time_msec);\r
-    \r
-    fprintf (stdout, "%5d %7d\t ", max_msgs, msg_size);\r
-    fprintf (stdout,"%8.4lf msec,\t %8.3f Mbits/sec\n",\r
-            elapsed_time_msec/max_msgs, bandwidth);\r
-  }\r
-  free(sendbuf);\r
-  free(recvbuf);\r
-  free(request_recv);\r
-  free(status);\r
- EXIT:\r
-  MPI_Finalize();\r
-}\r
+#include "mpi.h"
+#include <stdio.h>
+#include <stdlib.h>
+#include <sys/time.h>
+#include <unistd.h>
+
+#define NUMTIMES 50
+#define REPS 10
+#define MAX_SIZE 32768
+#define NUM_SIZES 8
+
+#ifndef MPIWTIME
+void getclockvalue(double *retval)
+{
+  static long zsec = 0;
+  static long zusec = 0;
+  struct timeval tp;
+  struct timezone tzp;
+
+  gettimeofday(&tp, &tzp);
+
+  if ( zsec == 0 ) zsec = tp.tv_sec;
+  if ( zusec == 0 ) zusec = tp.tv_usec;
+
+  *retval = (tp.tv_sec - zsec) + (tp.tv_usec - zusec ) * 0.000001 ;
+}
+#endif
+
+int main(argc,argv)
+int argc;
+char *argv[];
+{
+    int myid, root, numprocs, i, j, k, size, num_sizes, times,reps;
+    double startwtime, endwtime, opertime[NUMTIMES][NUM_SIZES];
+    double mean[NUM_SIZES],min[NUM_SIZES],max[NUM_SIZES];
+    int  namelen;
+    char processor_name[MPI_MAX_PROCESSOR_NAME];
+    int *sendb, *recvb;
+    MPI_Status status;
+    int msgsizes[NUM_SIZES];
+
+    msgsizes[0] = 2;
+    msgsizes[1] = 8;
+    msgsizes[2] = 32;
+    msgsizes[3] = 128;
+    msgsizes[4] = 512;
+    msgsizes[5] = 2048;
+    msgsizes[6] = 8192;
+    msgsizes[7] = 32768;
+
+    MPI_Init(&argc,&argv);
+    MPI_Comm_size(MPI_COMM_WORLD,&numprocs);
+    MPI_Comm_rank(MPI_COMM_WORLD,&myid);
+    MPI_Get_processor_name(processor_name,&namelen);
+
+#ifdef DEBUG
+    fprintf(stdout,"Process %d of %d on %s \n",
+           myid, numprocs, processor_name);
+#endif
+
+/* Initialize memory buffers */
+
+    sendb = (int *)malloc(MAX_SIZE*sizeof(int)*numprocs);
+    recvb = (int *)malloc(MAX_SIZE*sizeof(int)*numprocs);
+
+#ifdef MPIWTIME
+    startwtime = MPI_Wtime();
+#else
+    getclockvalue (&startwtime);
+    getclockvalue (&endwtime);
+#endif
+
+    MPI_Barrier(MPI_COMM_WORLD);
+
+    for (i=0; i<NUMTIMES; i++)
+    {
+       for (num_sizes=0; num_sizes<NUM_SIZES; num_sizes++) {
+               size = msgsizes[num_sizes];
+               for (j=0; j<size*numprocs; j++) {
+                       sendb[j] = j;
+                       recvb[j] = 0;
+               }
+               MPI_Alltoall(sendb,size,MPI_INT,recvb,size,MPI_INT,MPI_COMM_WORLD);
+               MPI_Barrier(MPI_COMM_WORLD);
+#ifdef MPIWTIME
+               startwtime = MPI_Wtime();
+#else
+               getclockvalue (&startwtime);
+#endif
+               for (k=0; k< REPS ; k++) {
+                       MPI_Alltoall(sendb,size,MPI_INT,recvb,size,MPI_INT,MPI_COMM_WORLD);
+               }
+#ifdef MPIWTIME
+               endwtime = MPI_Wtime();
+#else
+               getclockvalue (&endwtime);
+#endif
+               opertime[i][num_sizes] = 
+                       (endwtime-startwtime)/(float)(REPS) ;
+        }
+    }
+    MPI_Barrier(MPI_COMM_WORLD);
+
+/* Report results */
+    if (myid==0) {
+      for (num_sizes=0; num_sizes < NUM_SIZES; num_sizes++) {
+       mean[num_sizes] = 0.0;
+       min[num_sizes] = 100000. ;
+       max[num_sizes] = 0.0 ;
+      }
+
+      for (i=0; i<NUMTIMES; i++) {
+       for (num_sizes=0; num_sizes < NUM_SIZES; num_sizes++) {
+#ifdef DEBUG
+               printf("%d %d %g\n",i,msgsizes[num_sizes],
+                       opertime[i][num_sizes]) ;
+#endif
+               mean[num_sizes] += opertime[i][num_sizes] ;
+               if (min[num_sizes] > opertime[i][num_sizes])
+                       min[num_sizes] = opertime[i][num_sizes] ;
+               if (max[num_sizes] < opertime[i][num_sizes])
+                       max[num_sizes] = opertime[i][num_sizes] ;
+       }
+#ifdef DEBUG
+       printf("\n");
+#endif
+      }
+
+      for (num_sizes=0; num_sizes < NUM_SIZES; num_sizes++) 
+       mean[num_sizes] /= (float)NUMTIMES;
+
+#ifdef DEBUG
+      for (num_sizes=0; num_sizes < NUM_SIZES; num_sizes++) {
+       printf("%d %g %g %g\n",msgsizes[num_sizes],mean[num_sizes] * 1000000., 
+                       min[num_sizes] * 1000000., max[num_sizes] * 1000000. ); 
+      }
+      printf("================================================\n");
+#endif
+
+      times=NUMTIMES; reps=REPS;
+      printf("#Alltoall: P=%d, NUMTIMES=%d, REPS=%d\n",
+       numprocs, times, reps);
+      printf("%d ",numprocs);
+      for (num_sizes=0; num_sizes < NUM_SIZES; num_sizes++) 
+               printf("%g ",mean[num_sizes] * 1000000.);
+      printf("\n");
+    }
+
+    MPI_Finalize();
+    return 0;
+}
+
+