1 /* $Id: plog.h,v 1.81 1996/08/06 04:04:29 bsmith Exp bsmith $ */ 2 3 /* 4 Defines profile/logging in PETSc. 5 */ 6 7 #if !defined(__PLOG_PACKAGE) 8 #define __PLOG_PACKAGE 9 #include "petsc.h" 10 11 /* 12 Lists all PETSc events that are logged/profiled. 13 14 If you add an event here, make sure you add it to 15 petsc/bin/petscview.cfg, 16 petsc/bin/petscview, 17 petsc/src/plog/src/plog.c, 18 petsc/src/plog/src/plogmpe.c and 19 petsc/include/FINCLUDE/plog.h!!! 20 */ 21 #define MAT_Mult 0 22 #define MAT_MatrixFreeMult 1 23 #define MAT_AssemblyBegin 2 24 #define MAT_AssemblyEnd 3 25 #define MAT_GetReordering 4 26 #define MAT_MultTrans 5 27 #define MAT_MultAdd 6 28 #define MAT_MultTransAdd 7 29 #define MAT_LUFactor 8 30 #define MAT_CholeskyFactor 9 31 #define MAT_LUFactorSymbolic 10 32 #define MAT_ILUFactorSymbolic 11 33 #define MAT_CholeskyFactorSymbolic 12 34 #define MAT_IncompleteCholeskyFactorSymbolic 13 35 #define MAT_LUFactorNumeric 14 36 #define MAT_CholeskyFactorNumeric 15 37 #define MAT_Relax 16 38 #define MAT_Copy 17 39 #define MAT_Convert 18 40 #define MAT_Scale 19 41 #define MAT_ZeroEntries 20 42 #define MAT_Solve 21 43 #define MAT_SolveAdd 22 44 #define MAT_SolveTrans 23 45 #define MAT_SolveTransAdd 24 46 #define MAT_SetValues 25 47 #define MAT_ForwardSolve 26 48 #define MAT_BackwardSolve 27 49 #define MAT_Load 28 50 #define MAT_View 29 51 #define MAT_ILUFactor 30 52 53 #define MAT_GetSubMatrices 32 54 #define MAT_GetValues 33 55 #define MAT_IncreaseOverlap 34 56 #define MAT_GetRow 35 57 58 #define VEC_Dot 40 59 #define VEC_Norm 41 60 #define VEC_Max 42 61 #define VEC_Min 43 62 #define VEC_TDot 44 63 #define VEC_Scale 45 64 #define VEC_Copy 46 65 #define VEC_Set 47 66 #define VEC_AXPY 48 67 #define VEC_AYPX 49 68 #define VEC_Swap 50 69 #define VEC_WAXPY 51 70 #define VEC_AssemblyBegin 52 71 #define VEC_AssemblyEnd 53 72 #define VEC_MTDot 54 73 #define VEC_MDot 55 74 #define VEC_MAXPY 56 75 #define VEC_PMult 57 76 #define VEC_SetValues 58 77 #define VEC_Load 59 78 #define VEC_View 60 79 #define VEC_ScatterBegin 61 80 #define VEC_ScatterEnd 62 81 #define VEC_SetRandom 63 82 83 #define SLES_Solve 70 84 #define SLES_SetUp 71 85 86 #define KSP_GMRESOrthogonalization 72 87 88 #define PC_SetUp 75 89 #define PC_SetUpOnBlocks 76 90 #define PC_Apply 77 91 #define PC_ApplySymmetricLeft 78 92 #define PC_ApplySymmetricRight 79 93 94 #define SNES_Solve 80 95 #define SNES_LineSearch 81 96 #define SNES_FunctionEval 82 97 #define SNES_JacobianEval 83 98 #define SNES_MinimizationFunctionEval 84 99 #define SNES_GradientEval 85 100 #define SNES_HessianEval 86 101 102 #define TS_Step 90 103 104 #define Petsc_Barrier 100 105 106 #define DFVec_RefineVector 110 107 #define DFVec_AssembleFullVector 111 108 #define DFVec_GetComponentVectors 112 109 #define DFVec_DrawContours 113 110 111 /* 112 Event numbers PLOG_USER_EVENT_LOW to PLOG_USER_EVENT_HIGH are reserved 113 for applications. Make sure that src/plog/src/plog.c defines enough 114 entries in (*name)[] to go up to PLOG_USER_EVENT_HIGH. 115 */ 116 #define PLOG_USER_EVENT_LOW_STATIC 120 117 #define PLOG_USER_EVENT_HIGH 200 118 119 /* Global flop counter */ 120 extern double _TotalFlops; 121 122 /* General logging of information; different from event logging */ 123 extern int PLogInfo(void*,char*,...); 124 extern int PLogInfoDeactivateClass(int); 125 extern int PLogInfoActivateClass(int); 126 127 #if defined(PETSC_LOG) /* --------------------------------------------*/ 128 129 #define PLogFlops(n) {_TotalFlops += (n);} 130 131 #if defined (HAVE_MPE) 132 #include "mpe.h" 133 #define MPEBEGIN 1000 134 extern int PLogMPEBegin(); 135 extern int PLogMPEDump(char *); 136 extern int UseMPE,PLogEventMPEFlags[]; 137 extern int PLogEventMPEActivate(int); 138 extern int PLogEventMPEDeactivate(int); 139 #else 140 #define PLogEventMPEActivate(a) 141 #define PLogEventMPEDeactivate(a) 142 #endif 143 144 extern int PLogEventActivate(int); 145 extern int PLogEventDeactivate(int); 146 147 extern int PLogEventActivateClass(); 148 extern int PLogEventDeactivateClass(); 149 150 extern int PLogEventFlags[]; 151 extern int (*_PLB)(int,int,PetscObject,PetscObject,PetscObject,PetscObject); 152 extern int (*_PLE)(int,int,PetscObject,PetscObject,PetscObject,PetscObject); 153 extern int (*_PHC)(PetscObject); 154 extern int (*_PHD)(PetscObject); 155 156 #if defined(HAVE_MPE) 157 #define PLogEventBegin(e,o1,o2,o3,o4) {static int _tacky = 0; \ 158 { _tacky++; \ 159 if (_PLB && PLogEventFlags[e]) \ 160 (*_PLB)(e,_tacky,(PetscObject)(o1),(PetscObject)(o2),(PetscObject)(o3),(PetscObject)(o4));\ 161 if (_tacky == 1 && UseMPE && PLogEventMPEFlags[e])\ 162 MPE_Log_event(MPEBEGIN+2*e,0,"");\ 163 } 164 #else 165 #define PLogEventBegin(e,o1,o2,o3,o4) {static int _tacky = 0; \ 166 { _tacky++; \ 167 if (_PLB && PLogEventFlags[e]) \ 168 (*_PLB)(e,_tacky,(PetscObject)(o1),(PetscObject)(o2),(PetscObject)(o3),(PetscObject)(o4));\ 169 } 170 #endif 171 172 #if defined(HAVE_MPE) 173 #define PLogEventEnd(e,o1,o2,o3,o4) {\ 174 if (_PLE && PLogEventFlags[e]) \ 175 (*_PLE)(e,_tacky,(PetscObject)(o1),(PetscObject)(o2),(PetscObject)(o3),(PetscObject)(o4));\ 176 if (_tacky == 1 && UseMPE && PLogEventMPEFlags[e])\ 177 MPE_Log_event(MPEBEGIN+2*e+1,0,"");\ 178 } _tacky--;} 179 #else 180 #define PLogEventEnd(e,o1,o2,o3,o4) {\ 181 if (_PLE && PLogEventFlags[e]) \ 182 (*_PLE)(e,_tacky,(PetscObject)(o1),(PetscObject)(o2),(PetscObject)(o3),(PetscObject)(o4));\ 183 } _tacky--;} 184 #endif 185 186 187 #define PLogObjectParent(p,c) {PetscValidHeader((PetscObject)c); \ 188 PetscValidHeader((PetscObject)p);\ 189 ((PetscObject)(c))->parent = (PetscObject) p;} 190 #define PLogObjectParents(p,n,d) {int _i; for ( _i=0; _i<n; _i++ ) \ 191 PLogObjectParent(p,(d)[_i]);} 192 #define PLogObjectCreate(h) {if (_PHC) (*_PHC)((PetscObject)h);} 193 #define PLogObjectDestroy(h) {if (_PHD) (*_PHD)((PetscObject)h);} 194 #define PLogObjectMemory(p,m) {PetscValidHeader((PetscObject)p);\ 195 ((PetscObject)(p))->mem += (m);} 196 extern int PLogObjectState(PetscObject,char *,...); 197 extern int PLogDestroy(); 198 extern int PLogStagePush(int); 199 extern int PLogStagePop(); 200 extern int PLogStageRegister(int,char*); 201 extern int PLogPrintSummary(MPI_Comm,FILE *); 202 extern int PLogBegin(); 203 extern int PLogAllBegin(); 204 extern int PLogDump(char*); 205 extern int PLogEventRegister(int*,char*,char*); 206 extern double PetscGetFlops(); 207 208 extern double irecv_ct, isend_ct, wait_ct, wait_any_ct, recv_ct, send_ct; 209 extern double irecv_len, isend_len, recv_len, send_len; 210 extern double wait_all_ct,allreduce_ct,sum_of_waits_ct; 211 /* 212 This does not use for MPI-Uni because our src/mpiuni/mpi.h file 213 uses macros to defined the MPI operations. 214 215 It does not work correctly from HP-UX because it processes the 216 macros in a way that sometimes it double counts. 217 */ 218 #if !defined(PETSC_USING_MPIUNI) && !defined(PARCH_hpux) 219 /* 220 Logging of MPI activities 221 */ 222 223 #define TypeSize(buff,count,type) \ 224 { \ 225 if (type == MPIU_SCALAR) { \ 226 buff += (double) ((count)*sizeof(Scalar)); \ 227 } else if (type == MPI_INT) { \ 228 buff += (double) ((count)*sizeof(int)); \ 229 } else { \ 230 int _size; MPI_Type_size(type,&_size); buff += (double) ((count)*_size); \ 231 } \ 232 } 233 234 #define MPI_Irecv( buf, count, datatype, source, tag, comm, request) \ 235 { \ 236 MPI_Irecv( buf, count, datatype, source, tag, comm, request);\ 237 irecv_ct++; TypeSize(irecv_len,count,datatype); \ 238 } 239 240 #define MPI_Isend( buf, count, datatype, dest, tag, comm, request) \ 241 { \ 242 MPI_Isend( buf, count, datatype, dest, tag, comm, request); \ 243 isend_ct++; TypeSize(isend_len,count,datatype); \ 244 } 245 246 #define MPI_Recv( buf, count, datatype, source, tag, comm, status) \ 247 { \ 248 MPI_Recv( buf, count, datatype, source, tag, comm, status); \ 249 recv_ct++; TypeSize(recv_len,count,datatype); \ 250 } 251 252 #define MPI_Send( buf, count, datatype, dest, tag, comm) \ 253 { \ 254 MPI_Send( buf, count, datatype, dest, tag, comm); \ 255 send_ct++; TypeSize(send_len,count,datatype); \ 256 } 257 258 #define MPI_Wait(request, status) \ 259 ( \ 260 wait_ct++, sum_of_waits_ct++,\ 261 MPI_Wait(request, status) \ 262 ) 263 264 #define MPI_Waitany(a, b, c, d) \ 265 ( \ 266 wait_any_ct++, sum_of_waits_ct++, \ 267 MPI_Waitany(a, b, c, d)\ 268 ) 269 270 #define MPI_Waitall(count, array_of_requests, array_of_statuses) \ 271 ( \ 272 wait_all_ct++, sum_of_waits_ct += (double) (count),\ 273 MPI_Waitall(count, array_of_requests, array_of_statuses) \ 274 ) 275 276 #define MPI_Allreduce( sendbuf, recvbuf, count, datatype, op, comm) \ 277 ( \ 278 allreduce_ct++, \ 279 MPI_Allreduce( sendbuf, recvbuf, count, datatype, op, comm) \ 280 ) 281 #endif /* ! PETSC_USING_MPIUNI && ! PARCH_hpux */ 282 283 #else /* ------------------------------------------------------------*/ 284 285 #define PLogFlops(n) 286 287 #if defined (HAVE_MPE) 288 #define MPEBEGIN 1000 289 extern int PLogMPEBegin(); 290 extern int PLogMPEDump(char *); 291 #else 292 #define PLogEventMPEActivate(a) 293 #define PLogEventMPEDeactivate(a) 294 #endif 295 296 #define PLogEventActivate(a) 297 #define PLogEventDeactivate(a) 298 299 #define PLogEventActivateClass() 300 #define PLogEventDeactivateClass() 301 302 #define _PLB 0 303 #define _PLE 0 304 #define _PHC 0 305 #define _PHD 0 306 #define PetscGetFlops 0.0 307 #define PLogEventBegin(e,o1,o2,o3,o4) 308 #define PLogEventEnd(e,o1,o2,o3,o4) 309 #define PLogObjectParent(p,c) 310 #define PLogObjectParents(p,n,c) 311 #define PLogObjectCreate(h) 312 #define PLogObjectDestroy(h) 313 #define PLogObjectMemory(p,m) 314 #define PLogDestroy() 315 #define PLogStagePush(int) 316 #define PLogStagePop() 317 #define PLogStageRegister(a,b) 318 #define PLogPrintSummary(comm,file) 319 #define PLogBegin() 320 #define PLogAllBegin() 321 #define PLogDump(char) 322 #define PLogEventRegister(a,b,c) 323 #define PLogMPEBegin() 324 #define PLogMPEDump(a) 325 extern int PLogObjectState(PetscObject,char *,...); 326 #endif 327 328 /*MC 329 PLogFlops - Adds floating point operations to the global counter. 330 331 Input Parameter: 332 . f - flop counter 333 334 Synopsis: 335 void PLogFlops(int f) 336 337 Notes: 338 A global counter logs all PETSc flop counts. The user can use 339 PLogFlops() to increment this counter to include flops for the 340 application code. 341 342 PETSc automatically logs library events if the code has been 343 compiled with -DPETSC_LOG (which is the default), and -log, 344 -log_summary, or -log_all are specified. PLogFlops() is 345 intended for logging user flops to supplement this PETSc 346 information. 347 348 Example of Usage: 349 $ int USER_EVENT; 350 $ PLogEventRegister(&USER_EVENT,"User event","Color:"); 351 $ PLogEventBegin(USER_EVENT,0,0,0,0); 352 $ [code segment to monitor] 353 $ PLogFlops(user_flops) 354 $ PLogEventEnd(USER_EVENT,0,0,0,0); 355 356 .seealso: PLogEventRegister(), PLogEventBegin(), PLogEventEnd(), PetscGetFlops() 357 358 .keywords: log, flops, floating point operations 359 M*/ 360 361 362 /*MC 363 PLogEventBegin - Logs the beginning of a user event. 364 365 Input Parameters: 366 . e - integer associated with the event obtained from PLogEventRegister() 367 . o1,o2,o3,o4 - objects associated with the event, or 0 368 369 Synopsis: 370 void PLogEventBegin(int e,PetscObject o1,PetscObject o2,PetscObject o3, 371 PetscObject o4) 372 373 Notes: 374 You should also register each integer event with the command 375 PLogRegisterEvent(). The source code must be compiled with 376 -DPETSC_LOG, which is the default. 377 378 PETSc automatically logs library events if the code has been 379 compiled with -DPETSC_LOG, and -log, -log_summary, or -log_all are 380 specified. PLogEventBegin() is intended for logging user events 381 to supplement this PETSc information. 382 383 Example of Usage: 384 $ int USER_EVENT; 385 $ int user_event_flops; 386 $ PLogEventRegister(&USER_EVENT,"User event","Color:"); 387 $ PLogEventBegin(&USER_EVENT,0,0,0,0); 388 $ [code segment to monitor] 389 $ PLogFlops(user_event_flops); 390 $ PLogEventEnd(&USER_EVENT,0,0,0,0); 391 392 .seealso: PLogEventRegister(), PLogEventEnd(), PLogFlops() 393 394 .keywords: log, event, begin 395 M*/ 396 397 /*MC 398 PLogEventEnd - Log the end of a user event. 399 400 Input Parameters: 401 . e - integer associated with the event obtained with PLogEventRegister() 402 . o1,o2,o3,o4 - objects associated with the event, or 0 403 404 Synopsis: 405 void PLogEventEnd(int e,PetscObject o1,PetscObject o2,PetscObject o3, 406 PetscObject o4) 407 408 Notes: 409 You should also register each integer event with the command 410 PLogRegisterEvent(). Source code must be compiled with 411 -DPETSC_LOG, which is the default. 412 413 PETSc automatically logs library events if the code has been 414 compiled with -DPETSC_LOG, and -log, -log_summary, or -log_all are 415 specified. PLogEventEnd() is intended for logging user events 416 to supplement this PETSc information. 417 418 Example of Usage: 419 $ int USER_EVENT; 420 $ int user_event_flops; 421 $ PLogEventRegister(&USER_EVENT,"User event","Color:"); 422 $ PLogEventBegin(USER_EVENT,0,0,0,0); 423 $ [code segment to monitor] 424 $ PLogFlops(user_event_flops); 425 $ PLogEventEnd(USER_EVENT,0,0,0,0); 426 427 .seealso: PLogEventRegister(), PLogEventBegin(), PLogFlops() 428 429 .keywords: log, event, end 430 M*/ 431 432 433 #endif 434 435 436 437