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