only start timer after warmup. and only reset memory count once
[charm.git] / examples / ampi / alltoall / alltoall_VPtest.c
1 #include <stdio.h>
2 #include "mpi.h"
3 #include <sys/time.h>
4 #include <stdlib.h>
5 #include <assert.h>
6
7 #define INIT_SEC 1000000
8
9 struct itimerval *tim;
10 unsigned int Timers = 0;
11
12 int  max_msgs = 2;
13
14 void   Create_Timers (int n);
15 void   Start_Timer   (int i, int which);
16 float  Read_Timer    (int i, int which);
17
18 void Create_Timers (int n){
19   if( Timers > 0 ){
20     fprintf (stderr, "Create_Timers: timers already created!\n");
21     exit (-1);
22   }
23   
24   tim = (struct itimerval*) malloc (n * sizeof (struct itimerval));
25   Timers = n;
26 }
27
28 void Start_Timer (int i, int which){
29   if( i >= Timers ){
30     fprintf (stderr, "Start_Timers: out-of-range timer index %d\n", i);
31     exit (-1);
32   }
33   
34   tim[i].it_value.tv_sec = INIT_SEC;
35   tim[i].it_value.tv_usec = 0;
36   tim[i].it_interval.tv_sec = INIT_SEC;
37   tim[i].it_interval.tv_usec = 0;
38   
39   setitimer (which, &(tim[i]), NULL);
40 }
41
42 float Read_Timer (int i, int which){
43   float elapsed_time;
44   
45   if( i >= Timers ){
46     fprintf (stderr, "Read_Timer: out-of-range timer index %d\n", i);
47     exit (-1);
48   }
49   
50   getitimer (which, &(tim[i]));
51   
52   elapsed_time = ( (float)INIT_SEC - tim[i].it_value.tv_sec ) -
53     ( (float)tim[i].it_value.tv_usec/1000000 );
54   
55   return elapsed_time;
56 }
57
58 main(int argc, char **argv){
59   int my_id;            /* process id */
60   int p;                /* number of processes */
61   char* message;        /* storage for the message */
62   int i, k, msg_size;
63   MPI_Status status;    /* return status for receive */
64   float elapsed_time_msec;
65   float bandwidth;
66   char *sndbuf, *recvbuf;
67   unsigned long memory_before, memory_after;
68   unsigned long memory_diff, local_memory_max, memory_max;
69
70   MPI_Init( &argc, &argv );
71   MPI_Comm_rank( MPI_COMM_WORLD, &my_id );
72   MPI_Comm_size( MPI_COMM_WORLD, &p );
73   
74   if (argc < 2) {
75     fprintf (stderr, "need msg size as params\n");
76     goto EXIT;
77   }
78   
79   if(sscanf (argv[1], "%d", &msg_size) < 1){
80     fprintf (stderr, "need msg size as params\n");
81     goto EXIT;
82   }
83   message = (char*)malloc (msg_size);
84
85   if(argc>2) 
86     sscanf (argv[2], "%d", &max_msgs);
87   
88   /* don't start timer until everybody is ok */
89   MPI_Barrier(MPI_COMM_WORLD); 
90   
91   if( my_id == 0 ){
92     int flag=0;
93  //   printf("Starting benchmark on %d processors with %d iterations\n", p, max_msgs); 
94   }    
95   sndbuf = (char *)malloc(msg_size * sizeof(char) * p);
96   recvbuf = (char *)malloc(msg_size * sizeof(char) * p);
97
98     // warm up, not instrumented
99   for(i=0; i<max_msgs; i++) {
100     MPI_Alltoall(sndbuf, msg_size, MPI_CHAR, recvbuf, msg_size, MPI_CHAR, MPI_COMM_WORLD);
101   }
102   MPI_Barrier(MPI_COMM_WORLD); 
103
104     // initial memory usage
105   memory_before = CmiMemoryUsage();
106   if(my_id == 0){
107     CmiResetMaxMemory();
108     Create_Timers (1);
109     Start_Timer (0, ITIMER_REAL); 
110   }
111   for(i=0; i<max_msgs; i++) {
112     MPI_Alltoall(sndbuf, msg_size, MPI_CHAR, recvbuf, msg_size, MPI_CHAR, MPI_COMM_WORLD);
113   }
114   MPI_Barrier(MPI_COMM_WORLD); 
115
116   memory_after = CmiMemoryUsage();
117   if (CmiMaxMemoryUsage() < memory_before)  
118     local_memory_max = 0;
119   else
120     local_memory_max = CmiMaxMemoryUsage() - memory_before;
121
122   // Reduce MAX here
123   assert(MPI_SUCCESS==MPI_Reduce(&local_memory_max, &memory_max, 1, MPI_UNSIGNED_LONG, MPI_MAX, 0, MPI_COMM_WORLD));
124
125   if(my_id==0){
126     elapsed_time_msec = Read_Timer (0, ITIMER_REAL) * 1000.0 / max_msgs;
127     bandwidth = 2 * 8 * msg_size / (1000.0 * elapsed_time_msec);
128     
129     //fprintf (stdout, "%5d %7d\t ", max_msgs, msg_size);
130     fprintf (stdout,"%8.3f msec,\t", elapsed_time_msec);
131 //    fprintf( %8.3f Mbits/sec\t",  bandwidth);
132
133     printf("Mem Usage=%ld Kb\tVP=%d\tMsgSize=%d\n", (memory_max) / 1024, p, msg_size);
134
135   }
136   
137   free(sndbuf);
138   free(recvbuf);
139  
140  EXIT:
141   MPI_Finalize();
142 }
143