regtime.h

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:

Generated at Mon Dec 3 23:23:41 2007 for MPQC 2.3.1 using the documentation package Doxygen 1.5.2.