Main Page | Class Hierarchy | Class List | File List | Class Members

prom_perf.hh

00001 // $Id: prom_perf.hh,v 1.3 2004/01/27 21:15:54 adams Exp $ 00002 // Author: Mark F. Adams 00003 // Copyright (c) 2000 by Mark F. Adams 00004 // Filename: prom_perf_mon.hh 00005 // 00006 #ifndef __PROM_PERF_H__ 00007 #define __PROM_PERF_H__ 00008 00009 #if defined(PROM_USE_PETSC) 00010 #define PROM_USE_PETSC_PERF_MON 00011 #endif 00012 00013 #if defined(PROM_USE_PETSC_PERF_MON) 00014 00015 class PromPerfMonitor // wraper form PETSc's (global) monitor 00016 { 00017 public: 00018 PromPerfMonitor() : time0_(0.0) { PetscGetTime ( &time0_ ); } 00019 int EventRegister( int *type, const char * const name, int cookie ){ 00020 assert(this!=NULL); 00021 return PetscLogEventRegister( type, name, cookie ); 00022 } 00023 int StageRegister( int *type, const char * const name ){ 00024 assert(this!=NULL); 00025 return PetscLogStageRegister( type, name ); 00026 } 00027 int Flops( int f ) { PetscLogFlops(f); return 0; } 00028 int StagePush(int a){ PetscLogStagePush(a); return 0; } 00029 int StagePop(){ PetscLogStagePop(); return 0; } 00030 int EventBegin( const int t ){ 00031 if(this == NULL ) return -1; 00032 int ierr; 00033 ierr = PetscLogEventBegin( t, 0, 0, 0, 0 );CHKERRQ(ierr); 00034 return 0; 00035 } 00036 int EventEnd( const int t ){ 00037 assert( this != NULL ); 00038 int ierr; 00039 ierr = PetscLogEventEnd( t, 0, 0, 0, 0 );CHKERRQ(ierr); 00040 return 0; 00041 } 00042 int Print( MPI_Comm comm, char *fname = NULL, bool print =FALSE ) const; 00043 // data 00044 PetscLogDouble time0_; 00045 }; 00046 00047 #else 00048 00049 #include <sys/types.h> 00050 #include <sys/time.h> 00051 00052 /* PromTime, PromTimeSubtract, PromTimeAdd */ 00053 /* ------------------------------------------------------------------ 00054 Some machines have very fast MPI_Wtime() 00055 */ 00056 #if (defined(PARCH_IRIX64) || defined(PARCH_t3d) ) 00057 #define PromTime(v) (v)=MPI_Wtime(); 00058 00059 #define PromTimeSubtract(v) (v)-=MPI_Wtime(); 00060 00061 #define PromTimeAdd(v) (v)+=MPI_Wtime(); 00062 00063 /* ------------------------------------------------------------------ 00064 Power1,2,3,PC machines have a fast clock read_real_time() 00065 */ 00066 #elif defined(PARCH_rs6000) 00067 extern PetscLogDouble rs6000_time(void); 00068 #define PromTime(v) (v)=rs6000_time(); 00069 00070 #define PromTimeSubtract(v) (v)-=rs6000_time(); 00071 00072 #define PromTimeAdd(v) (v)+=rs6000_time(); 00073 00074 /* ------------------------------------------------------------------ 00075 Dec Alpha has a very fast system clock accessible through getclock() 00076 getclock() doesn't seem to have a prototype for C++ 00077 */ 00078 #elif (defined(PARCH_alpha) || defined(PARCH_alpha_mpich) ) 00079 extern "C" { 00080 extern int getclock(int clock_type,struct timespec *tp); 00081 } 00082 00083 00084 #define PromTime(v) {static struct timespec _tp; \ 00085 getclock(TIMEOFDAY,&_tp); \ 00086 (v)=((PetscLogDouble)_tp.tv_sec)+(1.0e-9)*(_tp.tv_nsec);} 00087 00088 #define PromTimeSubtract(v) {static struct timespec _tp; \ 00089 getclock(TIMEOFDAY,&_tp); \ 00090 (v)-=((PetscLogDouble)_tp.tv_sec)+(1.0e-9)*(_tp.tv_nsec);} 00091 00092 #define PromTimeAdd(v) {static struct timespec _tp; \ 00093 getclock(TIMEOFDAY,&_tp); \ 00094 (v)+=((PetscLogDouble)_tp.tv_sec)+(1.0e-9)*(_tp.tv_nsec);} 00095 00096 /* ------------------------------------------------------------------ 00097 ASCI RED machine has a fast clock accessiable through dclock() 00098 */ 00099 #elif defined (PARCH_ascired) 00100 #include <nx.h> 00101 extern "C" { 00102 extern double dclock(); 00103 } 00104 00105 #define PromTime(v) (v)=dclock(); 00106 00107 #define PromTimeSubtract(v) (v)-=dclock(); 00108 00109 #define PromTimeAdd(v) (v)+=dclock(); 00110 00111 /* ------------------------------------------------------------------ 00112 The usual Unix time routines. 00113 */ 00114 #else 00115 #define PromTime(v) {static struct timeval _tp; \ 00116 gettimeofday(&_tp,(struct timezone *)0);\ 00117 (v)=((PetscLogDouble)_tp.tv_sec)+(1.0e-6)*(_tp.tv_usec);} 00118 00119 #define PromTimeSubtract(v) {static struct timeval _tp; \ 00120 gettimeofday(&_tp,(struct timezone *)0);\ 00121 (v)-=((PetscLogDouble)_tp.tv_sec)+(1.0e-6)*(_tp.tv_usec);} 00122 00123 #define PromTimeAdd(v) {static struct timeval _tp; \ 00124 gettimeofday(&_tp,(struct timezone *)0);\ 00125 (v)+=((PetscLogDouble)_tp.tv_sec)+(1.0e-6)*(_tp.tv_usec);} 00126 #endif 00127 00128 /* struct PromPerfEvent 00129 * 00130 */ 00131 class PromPerfEvent 00132 { 00133 public: 00134 PromPerfEvent() { 00135 for( int ii = 0 ; ii < 17-1 ; ii++ ) name_[ii] = ' '; 00136 name_[17-1] = '\0'; 00137 for( int jj = 0 ; jj < 10 ; jj++ ) { 00138 bits_[jj].reged = 0; bits_[jj].nactive = 0; bits_[jj].count = 0; 00139 time_[jj] = flops_[jj] = 0.; 00140 } 00141 } 00142 ~PromPerfEvent(){} 00143 // data 00144 PetscLogDouble time_[10]; 00145 PetscLogDouble flops_[10]; 00146 struct bitsTAG { 00147 unsigned int reged : 1; 00148 unsigned int nactive : 15; // should only need 1 00149 unsigned int count : 16; 00150 }bits_[10]; 00151 char name_[17]; 00152 }; 00153 00154 /* class PromPerfMonitor 00155 * 00156 */ 00157 class PromPerfMonitor{ 00158 public: 00159 PromPerfMonitor(int size=LOG_TOT):flops_(0.),size_(size),eventTable_(NULL), 00160 ecount_(0),scount_(0){ 00161 assert(size>0); 00162 eventTable_ = new PromPerfEvent[size]; //assert(eventTable_ != NULL); 00163 for( int st = 0 ; st < 11 ; st++ ){ 00164 for(int ii = 0 ; ii < 14-1 ; ii++) stagenames_[st][ii] = ' '; 00165 stagenames_[st][14-1] = '\0'; 00166 stagenames_[st][14] = 'x'; 00167 } 00168 stageList_.addHead(0+1); // default stage 00169 } 00170 ~PromPerfMonitor(){ 00171 //assert(eventTable_[0].bits_[1].reged == 0); 00172 delete [] eventTable_; 00173 //for(int st=0;st<10;st++)assert(stagenames_[st][14]=='x'); 00174 } 00175 // 00176 int StageRegister( int *stage, const char * const name ){ 00177 assert(this!=NULL); 00178 int ii,t = *stage = scount_++,len = strlen( name ); 00179 if(scount_ > 11)SETERRQ2(1,"scount(%d) > size_(%d)",scount_,11); 00180 if(len < 14-1){strcpy(stagenames_[t],name); stagenames_[t][len]=' ';} 00181 else for( ii = 0 ; ii < 14-1 ; ii++ ) stagenames_[t][ii] = name[ii]; 00182 return 0; 00183 } 00184 int EventRegister( int *type, const char * const name, int cookie ){ 00185 assert(this!=NULL); 00186 int t = *type = ecount_++; 00187 if(ecount_ > size_) SETERRQ2(1,"count(%d) > size_(%d)",ecount_,size_); 00188 PromPerfEvent *ev = &eventTable_[t]; 00189 //assert(ev->bits_[1].reged == 0); 00190 if( ev->bits_[0].reged == 0 ) { 00191 ev->bits_[0].reged = 1; 00192 if( name != NULL ) { 00193 int ii,len = strlen( name ); 00194 if(len < 17-1){ strcpy( ev->name_, name); ev->name_[len] = ' '; } 00195 else for( ii = 0 ; ii < 17-1 ; ii++ ) ev->name_[ii] = name[ii]; 00196 } 00197 } 00198 return 0; 00199 } 00200 int Flops( int f ) { 00201 assert(this!=NULL); 00202 flops_ += (PetscLogDouble)f; 00203 return 0; 00204 } 00205 int EventBegin( const int type ) { 00206 if(this==NULL)SETERRQ(1,"this==NULL"); 00207 //assert(t>=0 && t<size_); 00208 assert( !stageList_.isEmpty() ); // unbalanced stages! 00209 int st = stageList_.getHead() - 1; //assert(st>=0 && st<10); 00210 PromPerfEvent *perFev = &eventTable_[type]; 00211 if(perFev->bits_[0].reged==1 && perFev->bits_[st].nactive++ == 0){ 00212 perFev->bits_[st].count++; 00213 PetscLogDouble _tm; PromTime(_tm); 00214 perFev->time_[st] -= _tm; 00215 perFev->flops_[st] -= flops_; 00216 } 00217 //else assert(0); 00218 return 0; 00219 } 00220 int EventEnd( const int type ){ 00221 assert(this!=NULL); 00222 //assert(t>=0 && t<size_); 00223 assert( !stageList_.isEmpty() ); // unbalanced stages! 00224 int st = stageList_.getHead() - 1; //assert(st>=0 && st<10); 00225 PromPerfEvent *perFev = &eventTable_[type]; 00226 if(perFev->bits_[0].reged==1 && perFev->bits_[st].nactive-- == 1){ 00227 PromTimeAdd( perFev->time_[st] ); 00228 perFev->flops_[st] += flops_; 00229 } 00230 return 0; 00231 } 00232 int StagePush(int a) { 00233 if(this==NULL)SETERRQ(1,"this==NULL"); 00234 stageList_.addHead(a+1); //assert(a>=0 && a<10); 00235 return 0; 00236 } 00237 int StagePop(){ 00238 assert(this!=NULL); 00239 assert( !stageList_.isEmpty() ); // unbalanced stages! 00240 stageList_.removeHead(); 00241 return 0; 00242 } 00243 int Print( MPI_Comm comm, char *fname = NULL, bool print =FALSE ) const; 00244 private: 00245 // data 00246 const int size_; 00247 int ecount_,scount_; 00248 char stagenames_[11][14+1]; 00249 PromPerfEvent *eventTable_; 00250 PetscLogDouble flops_; 00251 PromList<int> stageList_; 00252 }; 00253 00254 #endif // PROM_USE_PETSC_PERF_MON 00255 #endif // __PROM_PERF_H__

Generated on Fri May 21 14:17:54 2004 by doxygen 1.3.7