prom_perf.hh
00001
00002
00003
00004
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
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
00044 PetscLogDouble time0_;
00045 };
00046
00047 #else
00048
00049 #include <sys/types.h>
00050 #include <sys/time.h>
00051
00052
00053
00054
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
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
00076
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
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
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
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
00144 PetscLogDouble time_[10];
00145 PetscLogDouble flops_[10];
00146 struct bitsTAG {
00147 unsigned int reged : 1;
00148 unsigned int nactive : 15;
00149 unsigned int count : 16;
00150 }bits_[10];
00151 char name_[17];
00152 };
00153
00154
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];
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);
00169 }
00170 ~PromPerfMonitor(){
00171
00172 delete [] eventTable_;
00173
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
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
00208 assert( !stageList_.isEmpty() );
00209 int st = stageList_.getHead() - 1;
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
00218 return 0;
00219 }
00220 int EventEnd( const int type ){
00221 assert(this!=NULL);
00222
00223 assert( !stageList_.isEmpty() );
00224 int st = stageList_.getHead() - 1;
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);
00235 return 0;
00236 }
00237 int StagePop(){
00238 assert(this!=NULL);
00239 assert( !stageList_.isEmpty() );
00240 stageList_.removeHead();
00241 return 0;
00242 }
00243 int Print( MPI_Comm comm, char *fname = NULL, bool print =FALSE ) const;
00244 private:
00245
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
1.3.7