Removed windows line feeds.
[charm.git] / examples / ampi / alltoall / alltoall.c
1 #include <stdio.h>
2 #include "mpi.h"
3 #include <sys/time.h>
4 #include <stdlib.h>
5
6 #define INIT_SEC 1000000
7
8 struct itimerval *tim;
9 unsigned int Timers = 0;
10
11 void   Create_Timers (int n);
12 void   Start_Timer   (int i, int which);
13 float  Read_Timer    (int i, int which);
14
15 void Create_Timers (int n){
16   if( Timers > 0 ){
17     fprintf (stderr, "Create_Timers: timers already created!\n");
18     exit (-1);
19   }
20   
21   tim = (struct itimerval*) malloc (n * sizeof (struct itimerval));
22   Timers = n;
23 }
24
25 void Start_Timer (int i, int which){
26   if( i >= Timers ){
27     fprintf (stderr, "Start_Timers: out-of-range timer index %d\n", i);
28     exit (-1);
29   }
30   
31   tim[i].it_value.tv_sec = INIT_SEC;
32   tim[i].it_value.tv_usec = 0;
33   tim[i].it_interval.tv_sec = INIT_SEC;
34   tim[i].it_interval.tv_usec = 0;
35   
36   setitimer (which, &(tim[i]), NULL);
37 }
38
39 float Read_Timer (int i, int which){
40   float elapsed_time;
41   
42   if( i >= Timers ){
43     fprintf (stderr, "Read_Timer: out-of-range timer index %d\n", i);
44     exit (-1);
45   }
46   
47   getitimer (which, &(tim[i]));
48   
49   elapsed_time = ( (float)INIT_SEC - tim[i].it_value.tv_sec ) -
50     ( (float)tim[i].it_value.tv_usec/1000000 );
51   
52   return elapsed_time;
53 }
54
55 main(int argc, char **argv){
56   int my_id;            /* process id */
57   int p;                /* number of processes */
58   char* message;        /* storage for the message */
59   int i, k, max_msgs, msg_size;
60   MPI_Status status;    /* return status for receive */
61   float elapsed_time_msec;
62   float bandwidth;
63   char *sndbuf, *recvbuf;
64   
65   MPI_Init( &argc, &argv );
66   MPI_Comm_rank( MPI_COMM_WORLD, &my_id );
67   MPI_Comm_size( MPI_COMM_WORLD, &p );
68   
69   if (argc < 2) {
70     fprintf (stderr, "need msg size as params\n");
71     goto EXIT;
72   }
73   
74   if(sscanf (argv[1], "%d", &msg_size) < 1){
75     fprintf (stderr, "need msg size as params\n");
76     goto EXIT;
77   }
78   message = (char*)malloc (msg_size);
79
80   max_msgs = 1000;
81   if(argc>2) 
82     sscanf (argv[2], "%d", &max_msgs);
83   
84   /* don't start timer until everybody is ok */
85   MPI_Barrier(MPI_COMM_WORLD); 
86   
87   if( my_id == 0 ){
88     int flag=0;
89     printf("Starting benchmark on %d processors with %d iterations\n", p, max_msgs); 
90     Create_Timers (1);
91     Start_Timer (0, ITIMER_REAL);
92   }    
93   sndbuf = (char *)malloc(msg_size * sizeof(char) * p);
94   recvbuf = (char *)malloc(msg_size * sizeof(char) * p);
95   
96   for(i=0; i<max_msgs; i++) {
97     MPI_Alltoall(sndbuf, msg_size, MPI_CHAR, recvbuf, msg_size, MPI_CHAR, MPI_COMM_WORLD);
98   }
99   MPI_Barrier(MPI_COMM_WORLD); 
100
101   if(my_id==0){
102     elapsed_time_msec = Read_Timer (0, ITIMER_REAL) * 1000.0 / max_msgs;
103     bandwidth = 2 * 8 * msg_size / (1000.0 * elapsed_time_msec);
104     
105     fprintf (stdout, "%5d %7d\t ", max_msgs, msg_size);
106     fprintf (stdout,"%8.3f msec,\t %8.3f Mbits/sec\n",
107              elapsed_time_msec, bandwidth);
108   }
109   
110   free(sndbuf);
111   free(recvbuf);
112   
113   
114  EXIT:
115   MPI_Finalize();
116 }
117