1 /* $Id: petsclog.h,v 1.120 1998/04/15 18:03:04 balay 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/petsclog.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_GetColoring 31 53 #define MAT_GetSubMatrices 32 54 #define MAT_GetValues 33 55 #define MAT_IncreaseOverlap 34 56 #define MAT_GetRow 35 57 #define MAT_Partitioning 36 58 59 #define VEC_ScatterBarrier 39 60 #define VEC_Dot 40 61 #define VEC_Norm 41 62 #define VEC_Max 42 63 #define VEC_Min 43 64 #define VEC_TDot 44 65 #define VEC_Scale 45 66 #define VEC_Copy 46 67 #define VEC_Set 47 68 #define VEC_AXPY 48 69 #define VEC_AYPX 49 70 #define VEC_Swap 50 71 #define VEC_WAXPY 51 72 #define VEC_AssemblyBegin 52 73 #define VEC_AssemblyEnd 53 74 #define VEC_MTDot 54 75 #define VEC_MDot 55 76 #define VEC_MAXPY 56 77 #define VEC_PMult 57 78 #define VEC_SetValues 58 79 #define VEC_Load 59 80 #define VEC_View 60 81 #define VEC_ScatterBegin 61 82 #define VEC_ScatterEnd 62 83 #define VEC_SetRandom 63 84 85 #define VEC_NormBarrier 64 86 #define VEC_NormComm 65 87 #define VEC_DotBarrier 66 88 #define VEC_DotComm 67 89 #define VEC_MDotBarrier 68 90 #define VEC_MDotComm 69 91 92 #define SLES_Solve 70 93 #define SLES_SetUp 71 94 95 #define KSP_GMRESOrthogonalization 72 96 97 #define PC_ModifySubMatrices 74 98 #define PC_SetUp 75 99 #define PC_SetUpOnBlocks 76 100 #define PC_Apply 77 101 #define PC_ApplySymmetricLeft 78 102 #define PC_ApplySymmetricRight 79 103 104 #define SNES_Solve 80 105 #define SNES_LineSearch 81 106 #define SNES_FunctionEval 82 107 #define SNES_JacobianEval 83 108 #define SNES_MinimizationFunctionEval 84 109 #define SNES_GradientEval 85 110 #define SNES_HessianEval 86 111 112 #define TS_Step 90 113 #define TS_PseudoComputeTimeStep 91 114 115 #define Petsc_Barrier 100 116 117 #define EC_SetUp 105 118 #define EC_Solve 106 119 120 #define DFVec_RefineVector 110 121 #define DFVec_AssembleFullVector 111 122 #define DFVec_GetComponentVectors 112 123 #define DFVec_DrawContours 113 124 125 /* 126 Event numbers PLOG_USER_EVENT_LOW to PLOG_USER_EVENT_HIGH are reserved 127 for applications. Make sure that src/plog/src/plog.c defines enough 128 entries in (*name)[] to go up to PLOG_USER_EVENT_HIGH. 129 */ 130 #define PLOG_USER_EVENT_LOW_STATIC 120 131 #define PLOG_USER_EVENT_HIGH 200 132 133 /* Global flop counter */ 134 extern PLogDouble _TotalFlops; 135 136 /* General logging of information; different from event logging */ 137 extern int PLogInfo(void*,char*,...); 138 extern int PLogInfoDeactivateClass(int); 139 extern int PLogInfoActivateClass(int); 140 extern int PLogPrintInfo; /* if 1, indicates PLogInfo() is turned on */ 141 142 #if defined(USE_PETSC_LOG) /* --- Logging is turned on --------------------------------*/ 143 144 /* 145 Flop counting: We count each arithmetic operation (e.g., addition, multiplication) separately. 146 147 For the complex numbers version, note that 148 1 complex addition = 2 flops 149 1 complex multiplication = 6 flops, 150 where we define 1 flop as that for a double precision scalar. We roughly approximate 151 flop counting for complex numbers by multiplying the total flops by 4; this corresponds 152 to the assumption that we're counting mostly additions and multiplications -- and 153 roughly the same number of each. More accurate counting could be done by distinguishing 154 among the various arithmetic operations. 155 */ 156 157 #if defined(USE_PETSC_COMPLEX) 158 #define PLogFlops(n) {_TotalFlops += (4*n);} 159 #else 160 #define PLogFlops(n) {_TotalFlops += (n);} 161 #endif 162 163 #if defined (HAVE_MPE) 164 #include "mpe.h" 165 #define MPEBEGIN 1000 166 extern int PLogMPEBegin(void); 167 extern int PLogMPEDump(char *); 168 extern int UseMPE,PLogEventMPEFlags[]; 169 extern int PLogEventMPEActivate(int); 170 extern int PLogEventMPEDeactivate(int); 171 #else 172 #define PLogEventMPEActivate(a) 0 173 #define PLogEventMPEDeactivate(a) 0 174 #endif 175 176 extern int PLogEventActivate(int); 177 extern int PLogEventDeactivate(int); 178 179 extern int PLogEventActivateClass(int); 180 extern int PLogEventDeactivateClass(int); 181 182 extern int PLogEventFlags[]; 183 extern int (*_PLogPLB)(int,int,PetscObject,PetscObject,PetscObject,PetscObject); 184 extern int (*_PLogPLE)(int,int,PetscObject,PetscObject,PetscObject,PetscObject); 185 extern int (*_PLogPHC)(PetscObject); 186 extern int (*_PLogPHD)(PetscObject); 187 188 #if defined(HAVE_MPE) 189 #define PLogEventBarrierBegin(e,o1,o2,o3,o4,cm) \ 190 { \ 191 if (_PLogPLB && PLogEventFlags[e]) { \ 192 PLogEventBegin((e),o1,o2,o3,o4); \ 193 if (UseMPE && PLogEventMPEFlags[(e)])\ 194 MPE_Log_event(MPEBEGIN+2*(e),0,"");\ 195 MPI_Barrier(cm); \ 196 PLogEventEnd((e),o1,o2,o3,o4); \ 197 if (UseMPE && PLogEventMPEFlags[(e)])\ 198 MPE_Log_event(MPEBEGIN+2*((e)+1),0,"");\ 199 } \ 200 PLogEventBegin(e+1,o1,o2,o3,o4); \ 201 if (UseMPE && PLogEventMPEFlags[(e)+1])\ 202 MPE_Log_event(MPEBEGIN+2*((e)+1),0,"");\ 203 } 204 #define PLogEventBegin(e,o1,o2,o3,o4) \ 205 { \ 206 if (_PLogPLB && PLogEventFlags[(e)]) \ 207 (*_PLogPLB)((e),0,(PetscObject)(o1),(PetscObject)(o2),(PetscObject)(o3),(PetscObject)(o4));\ 208 if (UseMPE && PLogEventMPEFlags[(e)])\ 209 MPE_Log_event(MPEBEGIN+2*(e),0,"");\ 210 } 211 #else 212 #define PLogEventBarrierBegin(e,o1,o2,o3,o4,cm) \ 213 { \ 214 if (_PLogPLB && PLogEventFlags[(e)]) { \ 215 PLogEventBegin((e),o1,o2,o3,o4); \ 216 MPI_Barrier(cm); \ 217 PLogEventEnd((e),o1,o2,o3,o4); \ 218 } \ 219 PLogEventBegin((e)+1,o1,o2,o3,o4); \ 220 } 221 #define PLogEventBegin(e,o1,o2,o3,o4) \ 222 { \ 223 if (_PLogPLB && PLogEventFlags[(e)]) \ 224 (*_PLogPLB)((e),0,(PetscObject)(o1),(PetscObject)(o2),(PetscObject)(o3),(PetscObject)(o4));\ 225 } 226 #endif 227 228 #if defined(HAVE_MPE) 229 #define PLogEventBarrierEnd(e,o1,o2,o3,o4,cm) {\ 230 if (_PLogPLE && PLogEventFlags[(e)+1]) \ 231 (*_PLogPLE)((e)+1,0,(PetscObject)(o1),(PetscObject)(o2),(PetscObject)(o3),(PetscObject)(o4));\ 232 if (UseMPE && PLogEventMPEFlags[(e)+1])\ 233 MPE_Log_event(MPEBEGIN+2*((e)+1)+1,0,"");\ 234 } 235 #define PLogEventEnd(e,o1,o2,o3,o4) {\ 236 if (_PLogPLE && PLogEventFlags[(e)]) \ 237 (*_PLogPLE)((e),0,(PetscObject)(o1),(PetscObject)(o2),(PetscObject)(o3),(PetscObject)(o4));\ 238 if (UseMPE && PLogEventMPEFlags[(e)])\ 239 MPE_Log_event(MPEBEGIN+2*(e)+1,0,"");\ 240 } 241 #else 242 #define PLogEventBarrierEnd(e,o1,o2,o3,o4,cm) {\ 243 if (_PLogPLE && PLogEventFlags[(e)+1]) \ 244 (*_PLogPLE)((e)+1,0,(PetscObject)(o1),(PetscObject)(o2),(PetscObject)(o3),(PetscObject)(o4));\ 245 } 246 #define PLogEventEnd(e,o1,o2,o3,o4) {\ 247 if (_PLogPLE && PLogEventFlags[(e)]) \ 248 (*_PLogPLE)((e),0,(PetscObject)(o1),(PetscObject)(o2),(PetscObject)(o3),(PetscObject)(o4));\ 249 } 250 #endif 251 252 253 #define PLogObjectParent(p,c) if (c) {PetscValidHeader((PetscObject)(c)); \ 254 PetscValidHeader((PetscObject)(p));\ 255 ((PetscObject)(c))->parent = (PetscObject) (p);} 256 #define PLogObjectParents(p,n,d) {int _i; for ( _i=0; _i<n; _i++ ) \ 257 PLogObjectParent(p,(d)[_i]);} 258 #define PLogObjectCreate(h) {if (_PLogPHC) (*_PLogPHC)((PetscObject)h);} 259 #define PLogObjectDestroy(h) {if (_PLogPHD) (*_PLogPHD)((PetscObject)h);} 260 #define PLogObjectMemory(p,m) {PetscValidHeader((PetscObject)p);\ 261 ((PetscObject)(p))->mem += (m);} 262 extern int PLogObjectState(PetscObject,char *,...); 263 extern int PLogDestroy(void); 264 extern int PLogStagePush(int); 265 extern int PLogStagePop(void); 266 extern int PLogStageRegister(int,char*); 267 extern int PLogPrintSummary(MPI_Comm,char *); 268 extern int PLogBegin(void); 269 extern int PLogTraceBegin(FILE *); 270 extern int PLogAllBegin(void); 271 extern int PLogSet(int (*)(int,int,PetscObject,PetscObject,PetscObject,PetscObject), 272 int (*)(int,int,PetscObject,PetscObject,PetscObject,PetscObject)); 273 extern int PLogDump(char*); 274 extern int PLogEventRegister(int*,char*,char*); 275 extern int PetscGetFlops(PLogDouble*); 276 277 extern PLogDouble irecv_ct, isend_ct, wait_ct, wait_any_ct, recv_ct, send_ct; 278 extern PLogDouble irecv_len, isend_len, recv_len, send_len; 279 extern PLogDouble wait_all_ct,allreduce_ct,sum_of_waits_ct; 280 extern int PETSC_DUMMY,PETSC_DUMMY_SIZE; 281 282 /* 283 This does not work for MPI-Uni because our src/mpiuni/mpi.h file 284 uses macros to defined the MPI operations. 285 286 It does not work correctly from HP-UX because it processes the 287 macros in a way that sometimes it double counts, hence 288 HAVE_BROKEN_RECURSIVE_MACRO 289 290 It does not work with Windows NT because winmpich lacks MPI_Type_size() 291 */ 292 #if !defined(PETSC_USING_MPIUNI) && !defined(HAVE_BROKEN_RECURSIVE_MACRO) 293 /* 294 Logging of MPI activities 295 */ 296 297 #define TypeSize(buff,count,type) \ 298 ( \ 299 MPI_Type_size(type,&PETSC_DUMMY_SIZE), buff += ((PLogDouble) ((count)*PETSC_DUMMY_SIZE)) \ 300 ) 301 302 #define MPI_Irecv( buf, count, datatype, source, tag, comm, request) \ 303 ( \ 304 PETSC_DUMMY = MPI_Irecv( buf, count, datatype, source, tag, comm, request), \ 305 irecv_ct++, TypeSize(irecv_len,count,datatype),PETSC_DUMMY \ 306 ) 307 308 #define MPI_Isend( buf, count, datatype, dest, tag, comm, request) \ 309 ( \ 310 PETSC_DUMMY = MPI_Isend( buf, count, datatype, dest, tag, comm, request), \ 311 isend_ct++, TypeSize(isend_len,count,datatype),PETSC_DUMMY \ 312 ) 313 314 #define MPI_Startall_irecv( count,number,requests) \ 315 ( \ 316 PETSC_DUMMY = MPI_Startall( number, requests), \ 317 irecv_ct += (PLogDouble)(number), irecv_len += ((PLogDouble) (count*sizeof(Scalar))),PETSC_DUMMY \ 318 ) 319 320 #define MPI_Startall_isend( count,number,requests) \ 321 ( \ 322 PETSC_DUMMY = MPI_Startall( number, requests), \ 323 isend_ct += (PLogDouble)(number), isend_len += ((PLogDouble) (count*sizeof(Scalar))),PETSC_DUMMY \ 324 ) 325 326 #define MPI_Start_isend(count, requests)\ 327 (\ 328 PETSC_DUMMY = MPI_Start( requests),\ 329 isend_ct++, isend_len += ((PLogDouble) (count*sizeof(Scalar))),PETSC_DUMMY\ 330 ) 331 332 #define MPI_Recv( buf, count, datatype, source, tag, comm, status) \ 333 ( \ 334 PETSC_DUMMY = MPI_Recv( buf, count, datatype, source, tag, comm, status), \ 335 recv_ct++, TypeSize(recv_len,count,datatype), PETSC_DUMMY \ 336 ) 337 338 #define MPI_Send( buf, count, datatype, dest, tag, comm) \ 339 ( \ 340 PETSC_DUMMY = MPI_Send( buf, count, datatype, dest, tag, comm), \ 341 send_ct++, TypeSize(send_len,count,datatype),PETSC_DUMMY \ 342 ) 343 344 #define MPI_Wait(request, status) \ 345 ( \ 346 wait_ct++, sum_of_waits_ct++, \ 347 MPI_Wait(request, status) \ 348 ) 349 350 #define MPI_Waitany(a, b, c, d) \ 351 ( \ 352 wait_any_ct++, sum_of_waits_ct++, \ 353 MPI_Waitany(a, b, c, d) \ 354 ) 355 356 #define MPI_Waitall(count, array_of_requests, array_of_statuses) \ 357 ( \ 358 wait_all_ct++, sum_of_waits_ct += (PLogDouble) (count), \ 359 MPI_Waitall(count, array_of_requests, array_of_statuses) \ 360 ) 361 362 #define MPI_Allreduce( sendbuf, recvbuf, count, datatype, op, comm) \ 363 (allreduce_ct++,MPI_Allreduce( sendbuf, recvbuf, count, datatype, op, comm)) 364 365 #else 366 367 #define MPI_Startall_irecv( count,number,requests) \ 368 ( \ 369 MPI_Startall( number, requests) \ 370 ) 371 372 #define MPI_Startall_isend( count,number,requests) \ 373 ( \ 374 MPI_Startall( number, requests) \ 375 ) 376 377 #define MPI_Start_isend(count, requests) \ 378 ( \ 379 MPI_Start( requests) \ 380 ) 381 382 #endif /* ! PETSC_USING_MPIUNI && ! HAVE_BROKEN_RECURSIVE_MACRO */ 383 384 #else /* ---Logging is turned off --------------------------------------------*/ 385 386 #define PLogFlops(n) 387 388 /* 389 With logging turned off, then MPE has to be turned off 390 */ 391 #define MPEBEGIN 1000 392 #define PLogMPEBegin() 393 #define PLogMPEDump(a) 394 #define PLogEventMPEActivate(a) 0 395 #define PLogEventMPEDeactivate(a) 0 396 397 #define PLogEventActivate(a) 0 398 #define PLogEventDeactivate(a) 0 399 400 #define PLogEventActivateClass(a) 0 401 #define PLogEventDeactivateClass(a) 0 402 403 #define _PLogPLB 0 404 #define _PLogPLE 0 405 #define _PLogPHC 0 406 #define _PLogPHD 0 407 #define PetscGetFlops(a) (*(a) = 0.0,0) 408 #define PLogEventBegin(e,o1,o2,o3,o4) 409 #define PLogEventEnd(e,o1,o2,o3,o4) 410 #define PLogEventBarrierBegin(e,o1,o2,o3,o4,cm) 411 #define PLogEventBarrierEnd(e,o1,o2,o3,o4,cm) 412 #define PLogObjectParent(p,c) 413 #define PLogObjectParents(p,n,c) 414 #define PLogObjectCreate(h) 415 #define PLogObjectDestroy(h) 416 #define PLogObjectMemory(p,m) 417 #define PLogDestroy() 418 #define PLogStagePush(a) 419 #define PLogStagePop() 420 #define PLogStageRegister(a,b) 421 #define PLogPrintSummary(comm,file) 422 #define PLogBegin() 423 #define PLogTraceBegin(file) 0 424 #define PLogSet(lb,le) 425 #define PLogAllBegin() 426 #define PLogDump(char) 427 #define PLogEventRegister(a,b,c) 0 428 #define PLogMPEBegin() 429 #define PLogMPEDump(a) 430 extern int PLogObjectState(PetscObject,char *,...); 431 432 /* If USE_PETSC_LOG is NOT defined, these still need to be! */ 433 #define MPI_Startall_irecv( count,number,requests) MPI_Startall( number, requests) 434 435 #define MPI_Startall_isend( count,number,requests) MPI_Startall( number, requests) 436 437 #define MPI_Start_isend(count, requests) MPI_Start( requests) 438 439 #endif /* USE_PETSC_LOG */ 440 441 /*MC 442 PLogFlops - Adds floating point operations to the global counter. 443 444 Input Parameter: 445 . f - flop counter 446 447 Synopsis: 448 void PLogFlops(int f) 449 450 Notes: 451 A global counter logs all PETSc flop counts. The user can use 452 PLogFlops() to increment this counter to include flops for the 453 application code. 454 455 PETSc automatically logs library events if the code has been 456 compiled with -DUSE_PETSC_LOG (which is the default), and -log, 457 -log_summary, or -log_all are specified. PLogFlops() is 458 intended for logging user flops to supplement this PETSc 459 information. 460 461 Example of Usage: 462 $ int USER_EVENT; 463 $ PLogEventRegister(&USER_EVENT,"User event","Color:"); 464 $ PLogEventBegin(USER_EVENT,0,0,0,0); 465 $ [code segment to monitor] 466 $ PLogFlops(user_flops) 467 $ PLogEventEnd(USER_EVENT,0,0,0,0); 468 469 .seealso: PLogEventRegister(), PLogEventBegin(), PLogEventEnd(), PetscGetFlops() 470 471 .keywords: log, flops, floating point operations 472 M*/ 473 474 475 /*MC 476 PLogEventBegin - Logs the beginning of a user event. 477 478 Input Parameters: 479 . e - integer associated with the event obtained from PLogEventRegister() 480 . o1,o2,o3,o4 - objects associated with the event, or 0 481 482 Synopsis: 483 void PLogEventBegin(int e,PetscObject o1,PetscObject o2,PetscObject o3, 484 PetscObject o4) 485 486 Notes: 487 You should also register each integer event with the command 488 PLogRegisterEvent(). The source code must be compiled with 489 -DUSE_PETSC_LOG, which is the default. 490 491 PETSc automatically logs library events if the code has been 492 compiled with -DUSE_PETSC_LOG, and -log, -log_summary, or -log_all are 493 specified. PLogEventBegin() is intended for logging user events 494 to supplement this PETSc information. 495 496 Example of Usage: 497 $ int USER_EVENT; 498 $ int user_event_flops; 499 $ PLogEventRegister(&USER_EVENT,"User event","Color:"); 500 $ PLogEventBegin(&USER_EVENT,0,0,0,0); 501 $ [code segment to monitor] 502 $ PLogFlops(user_event_flops); 503 $ PLogEventEnd(&USER_EVENT,0,0,0,0); 504 505 .seealso: PLogEventRegister(), PLogEventEnd(), PLogFlops() 506 507 .keywords: log, event, begin 508 M*/ 509 510 /*MC 511 PLogEventEnd - Log the end of a user event. 512 513 Input Parameters: 514 . e - integer associated with the event obtained with PLogEventRegister() 515 . o1,o2,o3,o4 - objects associated with the event, or 0 516 517 Synopsis: 518 void PLogEventEnd(int e,PetscObject o1,PetscObject o2,PetscObject o3, 519 PetscObject o4) 520 521 Notes: 522 You should also register each additional integer event with the command 523 PLogRegisterEvent(). Source code must be compiled with 524 -DUSE_PETSC_LOG, which is the default. 525 526 PETSc automatically logs library events if the code has been 527 compiled with -DUSE_PETSC_LOG, and -log, -log_summary, or -log_all are 528 specified. PLogEventEnd() is intended for logging user events 529 to supplement this PETSc information. 530 531 Example of Usage: 532 $ int USER_EVENT; 533 $ int user_event_flops; 534 $ PLogEventRegister(&USER_EVENT,"User event","Color:"); 535 $ PLogEventBegin(USER_EVENT,0,0,0,0); 536 $ [code segment to monitor] 537 $ PLogFlops(user_event_flops); 538 $ PLogEventEnd(USER_EVENT,0,0,0,0); 539 540 .seealso: PLogEventRegister(), PLogEventBegin(), PLogFlops() 541 542 .keywords: log, event, end 543 M*/ 544 545 /*MC 546 PLogEventBarrierBegin - Logs the time in a barrier before an event. 547 548 Input Parameters: 549 . e - integer associated with the event obtained from PLogEventRegister() 550 . o1,o2,o3,o4 - objects associated with the event, or 0 551 . comm - communicator the barrier takes place over 552 553 Synopsis: 554 void PLogEventBarrierBegin(int e,PetscObject o1,PetscObject o2,PetscObject o3, 555 PetscObject o4,MPI_Comm comm) 556 557 Notes: 558 This is for logging the amount of time spent in a barrier for an event 559 that requires synchronization. 560 561 Example of Usage: 562 $ PLogEventBarrierBegin(VEC_NormBarrier,0,0,0,0,comm); 563 $ MPI_Allreduce() 564 $ PLogEventBarrierEnd(VEC_NormBarrier,0,0,0,0,comm); 565 566 Additional Notes: 567 Synchronization events always come in pairs; for example, VEC_NormBarrier and 568 VEC_NormComm = VEC_NormBarrier + 1 569 570 .seealso: PLogEventRegister(), PLogEventEnd(), PLogFlops(), PLogEventBegin(), 571 PLogEventBarrierEnd() 572 573 .keywords: log, event, begin, barrier 574 M*/ 575 576 /*MC 577 PLogEventBarrierEnd - Logs the time in a barrier before an event. 578 579 Input Parameters: 580 . e - integer associated with the event obtained from PLogEventRegister() 581 . o1,o2,o3,o4 - objects associated with the event, or 0 582 . comm - communicator the barrier takes place over 583 584 Synopsis: 585 void PLogEventBarrierEnd(int e,PetscObject o1,PetscObject o2,PetscObject o3, 586 PetscObject o4,MPI_Comm comm) 587 588 Notes: 589 This is for logging the amount of time spent in a barrier for an event 590 that requires synchronization. 591 592 Example of Usage: 593 $ PLogEventBarrierBegin(VEC_NormBarrier,0,0,0,0,comm); 594 $ MPI_Allreduce() 595 $ PLogEventBarrierEnd(VEC_NormBarrier,0,0,0,0,comm); 596 597 Additional Notes: 598 Synchronization events always come in pairs; for example, VEC_NormBarrier and 599 VEC_NormComm = VEC_NormBarrier + 1 600 601 .seealso: PLogEventRegister(), PLogEventEnd(), PLogFlops(), PLogEventBegin(), 602 PLogEventBarrierBegin() 603 604 .keywords: log, event, begin, barrier 605 M*/ 606 607 #endif 608 609 610 611 612 613 614