tProfiling.cc - pism - [fork] customized build of PISM, the parallel ice sheet model (tillflux branch)
 (HTM) git clone git://src.adamsgaard.dk/pism
 (DIR) Log
 (DIR) Files
 (DIR) Refs
 (DIR) LICENSE
       ---
       tProfiling.cc (3686B)
       ---
            1 /* Copyright (C) 2015, 2016 PISM Authors
            2  *
            3  * This file is part of PISM.
            4  *
            5  * PISM is free software; you can redistribute it and/or modify it under the
            6  * terms of the GNU General Public License as published by the Free Software
            7  * Foundation; either version 3 of the License, or (at your option) any later
            8  * version.
            9  *
           10  * PISM is distributed in the hope that it will be useful, but WITHOUT ANY
           11  * WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
           12  * FOR A PARTICULAR PURPOSE.  See the GNU General Public License for more
           13  * details.
           14  *
           15  * You should have received a copy of the GNU General Public License
           16  * along with PISM; if not, write to the Free Software
           17  * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
           18  */
           19 
           20 #include <petscviewer.h>
           21 
           22 #include "Profiling.hh"
           23 #include "error_handling.hh"
           24 
           25 namespace pism {
           26 
           27 // PETSc profiling events
           28 
           29 Profiling::Profiling() {
           30   PetscErrorCode ierr = PetscClassIdRegister("PISM", &m_classid);
           31   PISM_CHK(ierr, "PetscClassIdRegister");
           32 }
           33 
           34 //! Enable PETSc logging.
           35 void Profiling::start() const {
           36 #if PETSC_VERSION_LE(3,6,3)
           37   PetscErrorCode ierr = PetscLogBegin(); PISM_CHK(ierr, "PetscLogBegin");
           38 #else
           39   PetscErrorCode ierr = PetscLogAllBegin(); PISM_CHK(ierr, "PetscLogAllBegin");
           40 #endif
           41 }
           42 
           43 //! Save detailed profiling data to a Python script.
           44 void Profiling::report(const std::string &filename) const {
           45   PetscErrorCode ierr;
           46   PetscViewer log_viewer;
           47 
           48   ierr = PetscViewerCreate(PETSC_COMM_WORLD, &log_viewer);
           49   PISM_CHK(ierr, "PetscViewerCreate");
           50 
           51   ierr = PetscViewerSetType(log_viewer, PETSCVIEWERASCII);
           52   PISM_CHK(ierr, "PetscViewerSetType");
           53 
           54   ierr = PetscViewerFileSetName(log_viewer, filename.c_str());
           55   PISM_CHK(ierr, "PetscViewerFileSetName");
           56 
           57   ierr = PetscViewerPushFormat(log_viewer, PETSC_VIEWER_ASCII_INFO_DETAIL);
           58   PISM_CHK(ierr, "PetscViewerPushFormat");
           59 
           60   ierr = PetscViewerSetUp(log_viewer);
           61   PISM_CHK(ierr, "PetscViewerSetUp");
           62 
           63   ierr = PetscLogView(log_viewer);
           64   PISM_CHK(ierr, "PetscLogView"); PISM_CHK(ierr, "PetscLogView");
           65 
           66   ierr = PetscViewerPopFormat(log_viewer);
           67   PISM_CHK(ierr, "PetscViewerPopFormat");
           68 
           69   ierr = PetscViewerDestroy(&log_viewer);
           70   PISM_CHK(ierr, "PetscViewerDestroy");
           71 }
           72 
           73 
           74 void Profiling::begin(const char * name) const {
           75   PetscLogEvent event = 0;
           76   PetscErrorCode ierr;
           77 
           78   if (m_events.find(name) == m_events.end()) {
           79     // not registered yet
           80     ierr = PetscLogEventRegister(name, m_classid, &event);
           81     PISM_CHK(ierr, "PetscLogEventRegister");
           82     m_events[name] = event;
           83   } else {
           84     event = m_events[name];
           85   }
           86   ierr = PetscLogEventBegin(event, 0, 0, 0, 0);
           87   PISM_CHK(ierr, "PetscLogEventBegin");
           88 }
           89 
           90 void Profiling::end(const char * name) const {
           91   PetscLogEvent event = 0;
           92   if (m_events.find(name) == m_events.end()) {
           93     throw RuntimeError::formatted(PISM_ERROR_LOCATION, "cannot end event \"%s\" because it was not started",
           94                                   name);
           95   } else {
           96     event = m_events[name];
           97   }
           98   PetscErrorCode ierr = PetscLogEventEnd(event, 0, 0, 0, 0);
           99   PISM_CHK(ierr, "PetscLogEventEnd");
          100 }
          101 
          102 void Profiling::stage_begin(const char * name) const {
          103   PetscLogStage stage = 0;
          104   PetscErrorCode ierr;
          105 
          106   if (m_stages.find(name) == m_stages.end()) {
          107     // not registered yet
          108     ierr = PetscLogStageRegister(name, &stage);
          109     PISM_CHK(ierr, "PetscLogStageRegister");
          110     m_stages[name] = stage;
          111   } else {
          112     stage = m_stages[name];
          113   }
          114   ierr = PetscLogStagePush(stage);
          115   PISM_CHK(ierr, "PetscLogStagePush");
          116 }
          117 
          118 void Profiling::stage_end(const char * name) const {
          119   (void) name;
          120   PetscErrorCode ierr = PetscLogStagePop();
          121   PISM_CHK(ierr, "PetscLogStagePop");
          122 }
          123 
          124 } // end of namespace pism