// ping_pong.cc // // Datendurchsatz in Abhaengigkeit von Paketgroesse ermitteln #include #include #include #include "mpi.h" using namespace std; const int max_packet_size=0x400000; // maximale Groesse einer Nachricht const int count=100; // Zahl der Nachrichten je Messung char buff[max_packet_size]; // Sende- und Empfangspuffer int main(void) { MPI::Init(); // initialisiere MPI int rank=MPI::COMM_WORLD.Get_rank(); // eigenen Rang und int size=MPI::COMM_WORLD.Get_size(); // Zahl der Prozesse ermitteln if (size==2) { // Programm soll mit genau zwei Prozessen laufen ofstream out; if (rank==0) { // Ausgabefile oeffnen out.open("ping_pong.dat"); if (!out) MPI::COMM_WORLD.Abort(EXIT_FAILURE); out << "# Datendurchsatz in Abhaengigkeit von Paketgroesse" << endl << "# Zeitaufloesung " << MPI::Wtick() << " s" << endl << "# Paketgroesse\tmittlere Zeit\tmaximale Zeit" << endl; } // Schleife ueber verschiedene Paketgroessen int packet_size=1; while (packet_size<=max_packet_size) { double t_av=0.0; double t_max=0.0; // Schleife ueber viele Nachrichten for (int i=0; it_max) t_max=t; } else { MPI::COMM_WORLD.Barrier(); // Prozesse synchronisieren MPI::COMM_WORLD.Recv(buff, packet_size, MPI::CHAR, 0, 0); MPI::COMM_WORLD.Barrier(); // Prozesse synchronisieren } } if (rank==0) { // Ergebnisse ausgeben t_av/=count; out << packet_size << "\t\t" << t_av << "\t" << t_max << endl; } packet_size*=2; // Paketgroesse verdoppeln } if (rank==0) // Ausgabefile schliessen out.close(); } MPI::Finalize(); // beende MPI return EXIT_SUCCESS; }