Changeset 2704 for XIOS2/dev/hshepherd/reduce_output_log/src/server.cpp
- Timestamp:
- 01/17/25 15:18:37 (3 weeks ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
XIOS2/dev/hshepherd/reduce_output_log/src/server.cpp
r2503 r2704 14 14 #include "timer.hpp" 15 15 #include "mem_checker.hpp" 16 #include "timestats.hpp" 16 17 #include "event_scheduler.hpp" 17 18 #include "string_tools.hpp" … … 34 35 bool CServer::finished=false ; 35 36 bool CServer::is_MPI_Initialized ; 37 bool CServer::writeLogFromRank; 36 38 CEventScheduler* CServer::eventScheduler = 0; 37 39 … … 397 399 if (rank==0) isRoot=true; 398 400 else isRoot=false; 401 402 writeLogFromRank = determineWriteLogFromRank(); 399 403 400 404 eventScheduler = new CEventScheduler(intraComm) ; 401 405 } 402 406 407 std::vector<double> CServer::collate_timings(std::string timing_param) 408 { 409 int myrank, comm_size; 410 MPI_Comm_rank(intraComm, &myrank); 411 MPI_Comm_size(intraComm, &comm_size); 412 413 std::vector<double> collated_results; 414 MPI_Barrier(intraComm); 415 if (myrank == 0) { 416 double recv_val = 0.; 417 collated_results.push_back(CTimer::get(timing_param).getCumulatedTime()); 418 for (int i = 1; i < comm_size; i++) { 419 MPI_Recv(&recv_val, 1, MPI_DOUBLE, i, 0, intraComm, MPI_STATUS_IGNORE); 420 collated_results.push_back(recv_val); 421 } 422 } else { 423 double snd_val = CTimer::get(timing_param).getCumulatedTime(); 424 MPI_Send(&snd_val, 1, MPI_DOUBLE, 0, 0, intraComm); 425 } 426 MPI_Barrier(intraComm); 427 return collated_results; 428 } 429 430 void CServer::present_collated_timings(void) 431 { 432 std::vector<double> processing_times = collate_timings("Process events"); 433 std::vector<double> xios_server_times = collate_timings("XIOS server"); 434 std::vector<double> ratio = percentage_ratio_vec_double(processing_times, xios_server_times); 435 // writeLogFromRank gives the lead rank for L1 servers and server pools 436 if (getRank() == 0) { 437 int n_ranks; 438 MPI_Comm_size(intraComm, &n_ranks); 439 report(0) << " Performance metrics across the intraComm communicator for this rank." << endl; 440 report(0) << " There are " << n_ranks << " ranks in this intraComm" << endl; 441 write_summary_timings(processing_times, "Processing events"); 442 write_summary_timings(ratio, "Ratio (Percentage)"); 443 } 444 } 445 446 447 void CServer::write_summary_timings(std::vector<double>& collated_results, 448 std::string results_label) 449 { 450 report(0) << " " << results_label << " average " << calc_mean_double(collated_results) << endl; 451 report(0) << " " << results_label << " std dev " << calc_std_double(collated_results) << endl; 452 report(0) << " " << results_label << " min " << calc_min_double(collated_results) << endl; 453 report(0) << " " << results_label << " max " << calc_max_double(collated_results) << endl; 454 } 455 456 403 457 void CServer::finalize(void) 404 458 { 459 present_collated_timings(); 460 MPI_Barrier(intraComm); 461 405 462 CTimer::get("XIOS").suspend() ; 406 463 … … 430 487 else MPI_Finalize() ; 431 488 } 489 490 if (CXios::reduceLogFiles) report(0) << "Performance summary from the first rank in this intraComm." << endl; 491 432 492 report(0)<<"Performance report : Time spent for XIOS : "<<CTimer::get("XIOS server").getCumulatedTime()<<endl ; 433 493 report(0)<<"Performance report : Time spent in processing events : "<<CTimer::get("Process events").getCumulatedTime()<<endl ; … … 907 967 } 908 968 969 bool CServer::determineWriteLogFromRank() 970 { 971 // Write from rank zero of each intracomm, which will be the rank of 972 // the lead level one and two servers 973 if (!CXios::reduceLogFiles) return true; 974 if (getRank() == 0) return true; 975 return false; 976 } 977 909 978 /*! 910 979 * \brief Open a file stream to write the info logs … … 915 984 void CServer::openInfoStream(const StdString& fileName) 916 985 { 917 std::filebuf* fb = m_infoStream.rdbuf(); 918 openStream(fileName, ".out", fb); 919 920 info.write2File(fb); 921 report.write2File(fb); 986 if (writeLogFromRank) 987 { 988 std::filebuf* fb = m_infoStream.rdbuf(); 989 openStream(fileName, ".out", fb); 990 991 info.write2File(fb); 992 report.write2File(fb); 993 } 922 994 } 923 995 … … 925 997 void CServer::openInfoStream() 926 998 { 927 info.write2StdOut(); 928 report.write2StdOut(); 999 if (writeLogFromRank) 1000 { 1001 info.write2StdOut(); 1002 report.write2StdOut(); 1003 } 929 1004 } 930 1005 … … 932 1007 void CServer::closeInfoStream() 933 1008 { 934 if (m_infoStream.is_open()) m_infoStream.close(); 1009 if (writeLogFromRank) 1010 { 1011 if (m_infoStream.is_open()) m_infoStream.close(); 1012 } 935 1013 } 936 1014 … … 943 1021 void CServer::openErrorStream(const StdString& fileName) 944 1022 { 945 std::filebuf* fb = m_errorStream.rdbuf(); 946 openStream(fileName, ".err", fb); 947 948 error.write2File(fb); 1023 if (writeLogFromRank) 1024 { 1025 std::filebuf* fb = m_errorStream.rdbuf(); 1026 openStream(fileName, ".err", fb); 1027 1028 error.write2File(fb); 1029 } 949 1030 } 950 1031 … … 952 1033 void CServer::openErrorStream() 953 1034 { 954 error.write2StdErr(); 1035 if (writeLogFromRank) 1036 { 1037 error.write2StdErr(); 1038 } 955 1039 } 956 1040 … … 958 1042 void CServer::closeErrorStream() 959 1043 { 960 if (m_errorStream.is_open()) m_errorStream.close(); 1044 if (writeLogFromRank) 1045 { 1046 if (m_errorStream.is_open()) m_errorStream.close(); 1047 } 961 1048 } 962 1049 }
Note: See TracChangeset
for help on using the changeset viewer.