Ignore:
Timestamp:
01/17/25 15:18:37 (3 weeks ago)
Author:
hshepherd
Message:

Port across changes from the patching - Not yet tested

File:
1 edited

Legend:

Unmodified
Added
Removed
  • XIOS2/dev/hshepherd/reduce_output_log/src/server.cpp

    r2503 r2704  
    1414#include "timer.hpp" 
    1515#include "mem_checker.hpp" 
     16#include "timestats.hpp" 
    1617#include "event_scheduler.hpp" 
    1718#include "string_tools.hpp" 
     
    3435    bool CServer::finished=false ; 
    3536    bool CServer::is_MPI_Initialized ; 
     37    bool CServer::writeLogFromRank; 
    3638    CEventScheduler* CServer::eventScheduler = 0; 
    3739 
     
    397399      if (rank==0) isRoot=true; 
    398400      else isRoot=false; 
     401 
     402      writeLogFromRank = determineWriteLogFromRank(); 
    399403       
    400404      eventScheduler = new CEventScheduler(intraComm) ; 
    401405    } 
    402406 
     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 
    403457    void CServer::finalize(void) 
    404458    { 
     459      present_collated_timings(); 
     460      MPI_Barrier(intraComm); 
     461 
    405462      CTimer::get("XIOS").suspend() ; 
    406463      
     
    430487        else MPI_Finalize() ; 
    431488      } 
     489 
     490      if (CXios::reduceLogFiles) report(0) << "Performance summary from the first rank in this intraComm." << endl; 
     491 
    432492      report(0)<<"Performance report : Time spent for XIOS : "<<CTimer::get("XIOS server").getCumulatedTime()<<endl  ; 
    433493      report(0)<<"Performance report : Time spent in processing events : "<<CTimer::get("Process events").getCumulatedTime()<<endl  ; 
     
    907967    } 
    908968 
     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 
    909978    /*! 
    910979    * \brief Open a file stream to write the info logs 
     
    915984    void CServer::openInfoStream(const StdString& fileName) 
    916985    { 
    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      } 
    922994    } 
    923995 
     
    925997    void CServer::openInfoStream() 
    926998    { 
    927       info.write2StdOut(); 
    928       report.write2StdOut(); 
     999      if (writeLogFromRank) 
     1000      { 
     1001        info.write2StdOut(); 
     1002        report.write2StdOut(); 
     1003      } 
    9291004    } 
    9301005 
     
    9321007    void CServer::closeInfoStream() 
    9331008    { 
    934       if (m_infoStream.is_open()) m_infoStream.close(); 
     1009      if (writeLogFromRank) 
     1010      { 
     1011        if (m_infoStream.is_open()) m_infoStream.close(); 
     1012      } 
    9351013    } 
    9361014 
     
    9431021    void CServer::openErrorStream(const StdString& fileName) 
    9441022    { 
    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      } 
    9491030    } 
    9501031 
     
    9521033    void CServer::openErrorStream() 
    9531034    { 
    954       error.write2StdErr(); 
     1035      if (writeLogFromRank) 
     1036      { 
     1037        error.write2StdErr(); 
     1038      } 
    9551039    } 
    9561040 
     
    9581042    void CServer::closeErrorStream() 
    9591043    { 
    960       if (m_errorStream.is_open()) m_errorStream.close(); 
     1044      if (writeLogFromRank) 
     1045      { 
     1046        if (m_errorStream.is_open()) m_errorStream.close(); 
     1047      } 
    9611048    } 
    9621049} 
Note: See TracChangeset for help on using the changeset viewer.