xref: /petsc/include/petsclog.h (revision e80fee0d83fca2e79359165ac082b818fca7907f)
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