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