c2cc0870f3d9380cc0780314e9c76507ff5a9743
[charm.git] / examples / ampi / pingpong / pingpong-1way.c
1 /***********************************************
2           MPI / AMPI pingpong test program
3           Prints bandwidth and latency for a specific message size
4        
5           Sameer Kumar 02/08/05
6 **************************************/
7  
8 #include <stdio.h>
9 #include <stdlib.h>
10 #include <mpi.h>
11
12 int main(int argc, char **argv)
13 {
14   int my_id;            /* process id */
15   int p;                /* number of processes */
16   char* message_s, *message_r;  /* storage for the message */
17   int i, max_msgs, msg_size;
18   MPI_Status status;    /* return status for receive */
19   double elapsed_time_sec;
20   double bandwidth;
21   double startTime = 0;
22   
23   MPI_Init( &argc, &argv );
24   
25   MPI_Comm_rank( MPI_COMM_WORLD, &my_id );
26   MPI_Comm_size( MPI_COMM_WORLD, &p );
27   
28   if ((sscanf (argv[1], "%d", &max_msgs) < 1) ||
29       (sscanf (argv[2], "%d", &msg_size) < 1)) {
30     fprintf (stderr, "need msg count and msg size as params\n");
31     goto EXIT;
32   }
33
34   message_s = (char*)malloc (msg_size);  
35   message_r = (char*)malloc (msg_size);
36
37   /* don't start timer until everybody is ok */
38   MPI_Barrier(MPI_COMM_WORLD); 
39   
40   if( my_id < p/2 ) {
41     startTime = MPI_Wtime();
42 #ifdef AMPI
43     AMPI_Install_Idle_Timer();
44 #endif
45     
46     for(i=0; i<max_msgs; i++){
47       MPI_Send(message_s, msg_size, MPI_CHAR, my_id+p/2, 0, MPI_COMM_WORLD);
48       MPI_Recv(message_r, msg_size, MPI_CHAR, my_id+p/2, 0, MPI_COMM_WORLD, 
49                &status); 
50     }
51     
52     MPI_Barrier(MPI_COMM_WORLD); 
53
54     elapsed_time_sec = MPI_Wtime() - startTime; 
55 #ifdef AMPI
56     AMPI_Uninstall_Idle_Timer();
57 #endif
58     fprintf(stdout, "Totaltime: %8.3f s\n",elapsed_time_sec);
59     elapsed_time_sec /= 2;  //We want the ping performance not round-trip.
60     elapsed_time_sec /= max_msgs; //time for each message
61     bandwidth = msg_size / elapsed_time_sec; //bandwidth
62     
63     fprintf (stdout, "%5d %7d\t ", max_msgs, msg_size);
64     fprintf (stdout,"%8.3f us,\t %8.3f MB/sec\n",
65              elapsed_time_sec * 1e6, bandwidth / 1e6);
66     
67   }
68   else {
69 #ifdef AMPI
70     AMPI_Install_Idle_Timer();
71 #endif
72     for(i=0; i<max_msgs; i++){
73       MPI_Recv(message_r, msg_size, MPI_CHAR, my_id-p/2, 0, MPI_COMM_WORLD, 
74                &status); 
75       MPI_Send(message_s, msg_size, MPI_CHAR, my_id-p/2, 0, MPI_COMM_WORLD);
76     }
77     
78     MPI_Barrier(MPI_COMM_WORLD); 
79 #ifdef AMPI
80     AMPI_Uninstall_Idle_Timer();
81 #endif
82   }         
83   
84   free(message_s);
85   free(message_r);
86  EXIT:
87   MPI_Finalize();
88   
89   return 0;
90 }
91