MPQC
2.3.1
|
00001 // 00002 // regtime.h 00003 // 00004 // Copyright (C) 1996 Limit Point Systems, Inc. 00005 // 00006 // Author: Curtis Janssen <cljanss@limitpt.com> 00007 // Maintainer: LPS 00008 // 00009 // This file is part of the SC Toolkit. 00010 // 00011 // The SC Toolkit is free software; you can redistribute it and/or modify 00012 // it under the terms of the GNU Library General Public License as published by 00013 // the Free Software Foundation; either version 2, or (at your option) 00014 // any later version. 00015 // 00016 // The SC Toolkit is distributed in the hope that it will be useful, 00017 // but WITHOUT ANY WARRANTY; without even the implied warranty of 00018 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 00019 // GNU Library General Public License for more details. 00020 // 00021 // You should have received a copy of the GNU Library General Public License 00022 // along with the SC Toolkit; see the file COPYING.LIB. If not, write to 00023 // the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. 00024 // 00025 // The U.S. Government is granted a limited license as per AL 91-7. 00026 // 00027 00028 #ifdef __GNUC__ 00029 #pragma interface 00030 #endif 00031 00032 #ifndef _util_misc_regtime_h 00033 #define _util_misc_regtime_h 00034 00035 #include <iostream> 00036 #include <string> 00037 #include <util/class/class.h> 00038 00039 namespace sc { 00040 00041 class TimedRegion { 00042 private: 00043 char *name_; 00044 TimedRegion *up_; 00045 TimedRegion *subregions_; 00046 TimedRegion *next_; 00047 TimedRegion *prev_; 00048 double cpu_time_; 00049 double wall_time_; 00050 double cpu_enter_; 00051 double wall_enter_; 00052 double flops_; 00053 double flops_enter_; 00054 00055 TimedRegion *insert_after(const char *name); 00056 TimedRegion *insert_before(const char *name); 00057 public: 00058 TimedRegion(const char *name); 00059 ~TimedRegion(); 00060 const char *name() const { return name_; } 00061 TimedRegion *findinsubregion(const char *); 00062 void cpu_enter(double); 00063 void wall_enter(double); 00064 void flops_enter(double); 00065 void cpu_exit(double); 00066 void wall_exit(double); 00067 void flops_exit(double); 00068 void cpu_add(double t) { cpu_time_ += t; } 00069 void wall_add(double t) { wall_time_ += t; } 00070 void flops_add(double t) { flops_ += t; } 00071 TimedRegion *up() const { return up_; } 00072 TimedRegion *subregions() const { return subregions_; } 00073 TimedRegion *next() const { return next_; } 00074 TimedRegion *prev() const { return prev_; } 00075 00076 int nregion(); 00077 void get_region_names(const char *names[]); 00078 void get_wall_times(double *); 00079 void get_cpu_times(double *); 00080 void get_flops(double *); 00081 void get_depth(int *, int depth = 0); 00082 }; 00083 00089 class RegionTimer: public DescribedClass { 00090 protected: 00091 int wall_time_; 00092 int cpu_time_; 00093 int flops_; 00094 00095 TimedRegion *top_; 00096 TimedRegion *current_; 00097 TimedRegion *default_; 00098 00099 public: 00100 RegionTimer(const char *topname = "total", 00101 int cpu_time = 0, int wall_time = 1); 00102 RegionTimer(const Ref<KeyVal> &); 00103 ~RegionTimer(); 00104 void enter(const char * = 0); 00105 void change(const char *newname, const char * oldname = 0); 00106 void exit(const char * = 0, bool do_not_throw = false); 00107 void set_default(const char *); 00108 void unset_default(); 00109 void enter_default(); 00110 void exit_default(); 00111 virtual void print(std::ostream& = ExEnv::out0()) const; 00112 00113 void update_top() const; 00114 00115 int nregion() const; 00116 void get_region_names(const char *names[]) const; 00117 void get_wall_times(double *) const; 00118 void get_cpu_times(double *) const; 00119 void get_flops(double *) const; 00120 void get_depth(int *) const; 00121 00122 double get_wall_time() const; 00123 double get_cpu_time() const; 00124 double get_flops() const; 00125 00126 void add_wall_time(const char *, double); 00127 void add_cpu_time(const char *, double); 00128 void add_flops(const char *, double); 00129 00130 static RegionTimer *default_regiontimer(); 00131 static void set_default_regiontimer(const Ref<RegionTimer> &); 00132 }; 00133 00140 class Timer { 00141 Ref<RegionTimer> timer_; 00142 std::string name_; 00143 bool active_; 00144 public: 00148 Timer(const char *name); 00151 Timer(const Ref<RegionTimer> &, const char *name); 00153 ~Timer(); 00157 void reset(const char * = 0); 00158 }; 00159 00160 } 00161 00162 #endif 00163 00164 // Local Variables: 00165 // mode: c++ 00166 // c-file-style: "CLJ" 00167 // End: