1 /* $Id: plog.h,v 1.78 1996/08/04 23:09:47 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 #define MAT_GetSubMatrix 31 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 /* 209 This does not use for MPI-Uni because our src/mpiuni/mpi.h file 210 uses macros to defined the MPI operations. 211 */ 212 #if !defined(PETSC_USING_MPIUNI) 213 /* 214 Logging of MPI activities 215 */ 216 extern double irecv_ct, isend_ct, wait_ct, wait_any_ct, recv_ct, send_ct; 217 extern double irecv_len, isend_len, recv_len, send_len; 218 extern double wait_all_ct,allreduce_ct,sum_of_waits_ct; 219 220 #define TypeSize(buff,count,type) \ 221 { \ 222 if (type == MPIU_SCALAR) { \ 223 buff += (double) ((count)*sizeof(Scalar)); \ 224 } else if (type == MPI_INT) { \ 225 buff += (double) ((count)*sizeof(int)); \ 226 } else { \ 227 int _size; MPI_Type_size(type,&_size); buff += (double) ((count)*_size); \ 228 } \ 229 } 230 231 #if defined(PARCH_hpux) 232 /* 233 This is a tacky fix. The CPP on HP-UX scans the macros twice 234 thus it double counted the send/receive operations. 235 */ 236 #define MPI_Irecv( buf, count, datatype, source, tag, comm, request) \ 237 { \ 238 MPI_Irecv( buf, count, datatype, source, tag, comm, request);\ 239 irecv_ct += .5; TypeSize(irecv_len,.5*count,datatype); \ 240 } 241 #define MPI_Isend( buf, count, datatype, dest, tag, comm, request) \ 242 { \ 243 MPI_Isend( buf, count, datatype, dest, tag, comm, request); \ 244 isend_ct += .5; TypeSize(isend_len,.5*count,datatype); \ 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 += .5; TypeSize(recv_len,.5*count,datatype); \ 250 } 251 #define MPI_Send( buf, count, datatype, dest, tag, comm) \ 252 { \ 253 MPI_Send( buf, count, datatype, dest, tag, comm); \ 254 send_ct += .5; TypeSize(send_len,.5*count,datatype); \ 255 } 256 #else 257 #define MPI_Irecv( buf, count, datatype, source, tag, comm, request) \ 258 { \ 259 MPI_Irecv( buf, count, datatype, source, tag, comm, request);\ 260 irecv_ct++; TypeSize(irecv_len,count,datatype); \ 261 } 262 #define MPI_Isend( buf, count, datatype, dest, tag, comm, request) \ 263 { \ 264 MPI_Isend( buf, count, datatype, dest, tag, comm, request); \ 265 isend_ct++; TypeSize(isend_len,count,datatype); \ 266 } 267 #define MPI_Recv( buf, count, datatype, source, tag, comm, status) \ 268 { \ 269 MPI_Recv( buf, count, datatype, source, tag, comm, status); \ 270 recv_ct++; TypeSize(recv_len,count,datatype); \ 271 } 272 #define MPI_Send( buf, count, datatype, dest, tag, comm) \ 273 { \ 274 MPI_Send( buf, count, datatype, dest, tag, comm); \ 275 send_ct++; TypeSize(send_len,count,datatype); \ 276 } 277 #endif 278 279 #define MPI_Wait(request, status) \ 280 ( \ 281 wait_ct++, sum_of_waits_ct++,\ 282 MPI_Wait(request, status) \ 283 ) 284 285 #define MPI_Waitany(a, b, c, d) \ 286 ( \ 287 wait_any_ct++, sum_of_waits_ct++, \ 288 MPI_Waitany(a, b, c, d)\ 289 ) 290 291 #define MPI_Waitall(count, array_of_requests, array_of_statuses) \ 292 ( \ 293 wait_all_ct++, sum_of_waits_ct += (double) (count),\ 294 MPI_Waitall(count, array_of_requests, array_of_statuses) \ 295 ) 296 297 #define MPI_Allreduce( sendbuf, recvbuf, count, datatype, op, comm) \ 298 ( \ 299 allreduce_ct++, \ 300 MPI_Allreduce( sendbuf, recvbuf, count, datatype, op, comm) \ 301 ) 302 #endif /* ! PETSC_USING_MPIUNI */ 303 304 #else /* ------------------------------------------------------------*/ 305 306 #define PLogFlops(n) 307 308 #if defined (HAVE_MPE) 309 #define MPEBEGIN 1000 310 extern int PLogMPEBegin(); 311 extern int PLogMPEDump(char *); 312 #else 313 #define PLogEventMPEActivate(a) 314 #define PLogEventMPEDeActivate(a) 315 #endif 316 317 #define PLogEventActivate(a) 318 #define PLogEventDeActivate(a) 319 320 #define PLogEventActivateClass() 321 #define PLogEventDeActivateClass() 322 323 #define _PLB 0 324 #define _PLE 0 325 #define _PHC 0 326 #define _PHD 0 327 #define PetscGetFlops 0.0 328 #define PLogEventBegin(e,o1,o2,o3,o4) 329 #define PLogEventEnd(e,o1,o2,o3,o4) 330 #define PLogObjectParent(p,c) 331 #define PLogObjectParents(p,n,c) 332 #define PLogObjectCreate(h) 333 #define PLogObjectDestroy(h) 334 #define PLogObjectMemory(p,m) 335 #define PLogDestroy() 336 #define PLogStagePush(int) 337 #define PLogStagePop() 338 #define PLogStageRegister(a,b) 339 #define PLogPrintSummary(comm,file) 340 #define PLogBegin() 341 #define PLogAllBegin() 342 #define PLogDump(char) 343 #define PLogEventRegister(a,b,c) 344 #define PLogMPEBegin() 345 #define PLogMPEDump(a) 346 extern int PLogObjectState(PetscObject,char *,...); 347 #endif 348 349 /*MC 350 PLogFlops - Adds floating point operations to the global counter. 351 352 Input Parameter: 353 . f - flop counter 354 355 Synopsis: 356 void PLogFlops(int f) 357 358 Notes: 359 A global counter logs all PETSc flop counts. The user can use 360 PLogFlops() to increment this counter to include flops for the 361 application code. 362 363 PETSc automatically logs library events if the code has been 364 compiled with -DPETSC_LOG (which is the default), and -log, 365 -log_summary, or -log_all are specified. PLogFlops() is 366 intended for logging user flops to supplement this PETSc 367 information. 368 369 Example of Usage: 370 $ int USER_EVENT; 371 $ PLogEventRegister(&USER_EVENT,"User event","Color:"); 372 $ PLogEventBegin(USER_EVENT,0,0,0,0); 373 $ [code segment to monitor] 374 $ PLogFlops(user_flops) 375 $ PLogEventEnd(USER_EVENT,0,0,0,0); 376 377 .seealso: PLogEventRegister(), PLogEventBegin(), PLogEventEnd(), PetscGetFlops() 378 379 .keywords: log, flops, floating point operations 380 M*/ 381 382 383 /*MC 384 PLogEventBegin - Logs the beginning of a user event. 385 386 Input Parameters: 387 . e - integer associated with the event obtained from PLogEventRegister() 388 . o1,o2,o3,o4 - objects associated with the event, or 0 389 390 Synopsis: 391 void PLogEventBegin(int e,PetscObject o1,PetscObject o2,PetscObject o3, 392 PetscObject o4) 393 394 Notes: 395 You should also register each integer event with the command 396 PLogRegisterEvent(). The source code must be compiled with 397 -DPETSC_LOG, which is the default. 398 399 PETSc automatically logs library events if the code has been 400 compiled with -DPETSC_LOG, and -log, -log_summary, or -log_all are 401 specified. PLogEventBegin() is intended for logging user events 402 to supplement this PETSc information. 403 404 Example of Usage: 405 $ int USER_EVENT; 406 $ int user_event_flops; 407 $ PLogEventRegister(&USER_EVENT,"User event","Color:"); 408 $ PLogEventBegin(&USER_EVENT,0,0,0,0); 409 $ [code segment to monitor] 410 $ PLogFlops(user_event_flops); 411 $ PLogEventEnd(&USER_EVENT,0,0,0,0); 412 413 .seealso: PLogEventRegister(), PLogEventEnd(), PLogFlops() 414 415 .keywords: log, event, begin 416 M*/ 417 418 /*MC 419 PLogEventEnd - Log the end of a user event. 420 421 Input Parameters: 422 . e - integer associated with the event obtained with PLogEventRegister() 423 . o1,o2,o3,o4 - objects associated with the event, or 0 424 425 Synopsis: 426 void PLogEventEnd(int e,PetscObject o1,PetscObject o2,PetscObject o3, 427 PetscObject o4) 428 429 Notes: 430 You should also register each integer event with the command 431 PLogRegisterEvent(). Source code must be compiled with 432 -DPETSC_LOG, which is the default. 433 434 PETSc automatically logs library events if the code has been 435 compiled with -DPETSC_LOG, and -log, -log_summary, or -log_all are 436 specified. PLogEventEnd() is intended for logging user events 437 to supplement this PETSc information. 438 439 Example of Usage: 440 $ int USER_EVENT; 441 $ int user_event_flops; 442 $ PLogEventRegister(&USER_EVENT,"User event","Color:"); 443 $ PLogEventBegin(USER_EVENT,0,0,0,0); 444 $ [code segment to monitor] 445 $ PLogFlops(user_event_flops); 446 $ PLogEventEnd(USER_EVENT,0,0,0,0); 447 448 .seealso: PLogEventRegister(), PLogEventBegin(), PLogFlops() 449 450 .keywords: log, event, end 451 M*/ 452 453 454 #endif 455 456 457 458