00001 #ifndef CH_TIMER_H
00002 #define CH_TIMER_H
00003
00004 #ifdef CH_AIX
00005 #define FOUR_COUNTERS
00006 #endif
00007
00008 #include <cstdio>
00009
00010 #ifdef CH_MPI
00011 #include "mpi.h"
00012 #endif
00013
00014 extern "C" {
00015
00016 #include <unistd.h>
00017 #include <sys/time.h>
00018
00019
00020
00021 #ifdef PAPI
00022 #include <papi.h>
00023 #endif
00024 }
00025
00026 #ifndef TIMER_COUNTER
00027 #define TIMER_COUNTER 0
00028 #endif
00029
00030 #include <list>
00031 #include <string>
00032 using namespace std;
00033
00034 namespace Chombo {
00035 class Timer {
00036
00037 public:
00038
00039 Timer();
00040 Timer(const string&, const int);
00041 Timer(const string&, Timer&, const int);
00042 Timer(const string&, Timer&);
00043 Timer(const string&, Timer&, const int, bool);
00044
00045 ~Timer();
00046
00047 void setup();
00048 void start();
00049 void stop();
00050 void clear();
00051
00052 inline double getTimeStampWC();
00053 double wc_time() { return m_accumulated_WCtime; }
00054
00055 #ifdef PAPI
00056 long long int papi_counter0() { return m_accumulated_counter0; }
00057 long long int papi_counter1() { return m_accumulated_counter1; }
00058 double total_papi_counter0() { return m_totalPapiCounter0; }
00059 double total_papi_counter1() { return m_totalPapiCounter1; }
00060 #ifdef FOUR_COUNTERS
00061 long long int papi_counter2() { return m_accumulated_counter2; }
00062 long long int papi_counter3() { return m_accumulated_counter3; }
00063 double total_papi_counter2() { return m_totalPapiCounter2; }
00064 double total_papi_counter3() { return m_totalPapiCounter3; }
00065 #endif
00066 #endif
00067
00068 string Name() { return m_name; }
00069 long long int Count() { return m_count; }
00070 int tableID() { return m_tableID; }
00071
00072 static list<Timer*> *TimerList;
00073
00074 static void TimerSummary(const int bert, const int ernie) {
00075 TimerSummary();
00076 }
00077
00078 static void TimerInit(const int rank);
00079 static void TimerSummary(void);
00080
00081 private:
00082
00083
00084 static void TimerSummary_(void);
00085 static void writeParentTables(FILE *out, const double TimerCost);
00086 static void writeDiagnosticTables(FILE *out, const double TimerCost);
00087
00088
00089 int m_tableID;
00090
00091 double m_accumulated_WCtime, m_last_WCtime_stamp;
00092
00093
00094 #ifndef CH_MPI
00095 struct timeval tv;
00096 struct timezone tz;
00097 #endif
00098
00099 int m_ID;
00100 string m_name;
00101 bool m_diagnostic;
00102 Timer& m_Parent;
00103
00104 double m_avgWC, m_minWC, m_maxWC, m_avgCount;
00105
00106 #ifdef PAPI
00107 long long int m_accumulated_counter0;
00108 long long int m_accumulated_counter1;
00109 long long int m_previous_counter0;
00110 long long int m_previous_counter1;
00111 double m_totalPapiCounter0;
00112 double m_totalPapiCounter1;
00113 #ifdef FOUR_COUNTERS
00114 long long int m_values[4];
00115 long long int m_accumulated_counter2;
00116 long long int m_accumulated_counter3;
00117 long long int m_previous_counter2;
00118 long long int m_previous_counter3;
00119 double m_totalPapiCounter2;
00120 double m_totalPapiCounter3;
00121 #else
00122 long long int m_values[2];
00123 #endif
00124
00125 #endif
00126
00127 long long int m_count;
00128 long long int m_totalCount;
00129 };
00130 }
00131
00132 #endif // CH_TIMER_H