# include # include # include # include # include using namespace std; int main ( int argc, char *argv[] ); void timestamp ( ); //****************************************************************************80 int main ( int argc, char *argv[] ) //****************************************************************************80 // // Purpose: // // MAIN is the main program for HELLO_MPI. // // Discussion: // // This is a simple MPI test program. // Each process prints out a "Hello, world!" message. // The master process also prints out a short message. // // Modified to use the C MPI bindings, 14 June 2016. // // Licensing: // // This code is distributed under the MIT license. // // Modified: // // 14 June 2016 // // Author: // // John Burkardt // // Reference: // // William Gropp, Ewing Lusk, Anthony Skjellum, // Using MPI: Portable Parallel Programming with the // Message-Passing Interface, // Second Edition, // MIT Press, 1999, // ISBN: 0262571323, // LC: QA76.642.G76. // { int id; int ierr; int p; double wtime; // // Initialize MPI. // ierr = MPI_Init ( &argc, &argv ); if ( ierr != 0 ) { cout << "\n"; cout << "HELLO_MPI - Fatal error!\n"; cout << " MPI_Init returned nonzero ierr.\n"; exit ( 1 ); } // // Get the number of processes. // ierr = MPI_Comm_size ( MPI_COMM_WORLD, &p ); // // Get the individual process ID. // ierr = MPI_Comm_rank ( MPI_COMM_WORLD, &id ); // // Process 0 prints an introductory message. // if ( id == 0 ) { timestamp ( ); cout << "\n"; cout << "P" << id << ": HELLO_MPI - Master process:\n"; cout << "P" << id << ": C++/MPI version\n"; cout << "P" << id << ": An MPI example program.\n"; cout << "\n"; cout << "P" << id << ": The number of processes is " << p << "\n"; cout << "\n"; } // // Every process prints a hello. // if ( id == 0 ) { wtime = MPI_Wtime ( ); } cout << "P" << id << ": 'Hello, world!'\n"; // // Process 0 says goodbye. // if ( id == 0 ) { wtime = MPI_Wtime ( ) - wtime; cout << "P" << id << ": Elapsed wall clock time = " << wtime << " seconds.\n"; } // // Terminate MPI. // MPI_Finalize ( ); // // Terminate. // if ( id == 0 ) { cout << "\n"; cout << "P" << id << ": HELLO_MPI:\n"; cout << "P" << id << ": Normal end of execution.\n"; cout << "\n"; timestamp ( ); } return 0; } //****************************************************************************80 void timestamp ( ) //****************************************************************************80 // // Purpose: // // TIMESTAMP prints the current YMDHMS date as a time stamp. // // Example: // // 31 May 2001 09:45:54 AM // // Licensing: // // This code is distributed under the MIT license. // // Modified: // // 08 July 2009 // // Author: // // John Burkardt // // Parameters: // // None // { # define TIME_SIZE 40 static char time_buffer[TIME_SIZE]; const struct std::tm *tm_ptr; std::time_t now; now = std::time ( NULL ); tm_ptr = std::localtime ( &now ); std::strftime ( time_buffer, TIME_SIZE, "%d %B %Y %I:%M:%S %p", tm_ptr ); std::cout << time_buffer << "\n"; return; # undef TIME_SIZE }