1 /* 2 Defines profile/logging in PETSc. 3 */ 4 5 #if !defined(__PetscLog_H) 6 #define __PetscLog_H 7 #include "petsc.h" 8 PETSC_EXTERN_CXX_BEGIN 9 10 #define PETSC_EVENT 1311311 11 extern PetscLogEvent PETSC_LARGEST_EVENT; 12 13 /* Global flop counter */ 14 extern PetscLogDouble PETSC_DLLEXPORT _TotalFlops; 15 extern PetscLogDouble petsc_tmp_flops; 16 17 /* General logging of information; different from event logging */ 18 EXTERN PetscErrorCode PETSC_DLLEXPORT PetscInfo_Private(const char[],void*,const char[],...) PETSC_PRINTF_FORMAT_CHECK(3,4); 19 #if defined(PETSC_USE_INFO) 20 #define PetscInfo(A,S) PetscInfo_Private(__FUNCT__,A,S) 21 #define PetscInfo1(A,S,a1) PetscInfo_Private(__FUNCT__,A,S,a1) 22 #define PetscInfo2(A,S,a1,a2) PetscInfo_Private(__FUNCT__,A,S,a1,a2) 23 #define PetscInfo3(A,S,a1,a2,a3) PetscInfo_Private(__FUNCT__,A,S,a1,a2,a3) 24 #define PetscInfo4(A,S,a1,a2,a3,a4) PetscInfo_Private(__FUNCT__,A,S,a1,a2,a3,a4) 25 #define PetscInfo5(A,S,a1,a2,a3,a4,a5) PetscInfo_Private(__FUNCT__,A,S,a1,a2,a3,a4,a5) 26 #define PetscInfo6(A,S,a1,a2,a3,a4,a5,a6) PetscInfo_Private(__FUNCT__,A,S,a1,a2,a3,a4,a5,a6) 27 #define PetscInfo7(A,S,a1,a2,a3,a4,a5,a6,a7) PetscInfo_Private(__FUNCT__,A,S,a1,a2,a3,a4,a5,a6,a7) 28 #else 29 #define PetscInfo(A,S) 0 30 #define PetscInfo1(A,S,a1) 0 31 #define PetscInfo2(A,S,a1,a2) 0 32 #define PetscInfo3(A,S,a1,a2,a3) 0 33 #define PetscInfo4(A,S,a1,a2,a3,a4) 0 34 #define PetscInfo5(A,S,a1,a2,a3,a4,a5) 0 35 #define PetscInfo6(A,S,a1,a2,a3,a4,a5,a6) 0 36 #define PetscInfo7(A,S,a1,a2,a3,a4,a5,a6,a7) 0 37 #endif 38 EXTERN PetscErrorCode PETSC_DLLEXPORT PetscInfoDeactivateClass(PetscCookie); 39 EXTERN PetscErrorCode PETSC_DLLEXPORT PetscInfoActivateClass(PetscCookie); 40 extern PetscTruth PETSC_DLLEXPORT PetscLogPrintInfo; /* if true, indicates PetscInfo() is turned on */ 41 42 /* We must make these structures available if we are to access the event 43 activation flags in the PetscLogEventBegin/End() macros. If we forced a 44 function call each time, we could make these private. 45 */ 46 /* Default log */ 47 typedef struct _n_StageLog *StageLog; 48 extern PETSC_DLLEXPORT StageLog _stageLog; 49 50 /* A simple stack (should replace) */ 51 typedef struct _n_IntStack *IntStack; 52 53 /* The structures for logging performance */ 54 typedef struct { 55 int id; /* The integer identifying this section */ 56 PetscTruth active; /* The flag to activate logging */ 57 PetscTruth visible; /* The flag to print info in summary */ 58 int depth; /* The nesting depth of the event call */ 59 int count; /* The number of times this section was executed */ 60 PetscLogDouble flops; /* The flops used in this section */ 61 PetscLogDouble time; /* The time taken for this section */ 62 PetscLogDouble numMessages; /* The number of messages in this section */ 63 PetscLogDouble messageLength; /* The total message lengths in this section */ 64 PetscLogDouble numReductions; /* The number of reductions in this section */ 65 } EventPerfInfo; 66 67 typedef struct { 68 int id; /* The integer identifying this class */ 69 int creations; /* The number of objects of this class created */ 70 int destructions; /* The number of objects of this class destroyed */ 71 PetscLogDouble mem; /* The total memory allocated by objects of this class */ 72 PetscLogDouble descMem; /* The total memory allocated by descendents of these objects */ 73 } ClassPerfInfo; 74 75 /* The structures for logging registration */ 76 typedef struct { 77 char *name; /* The class name */ 78 PetscCookie cookie; /* The integer identifying this class */ 79 } ClassRegInfo; 80 81 typedef struct { 82 char *name; /* The name of this event */ 83 PetscCookie cookie; /* The class id for this event (should maybe give class ID instead) */ 84 #if defined (PETSC_HAVE_MPE) 85 int mpe_id_begin; /* MPE IDs that define the event */ 86 int mpe_id_end; 87 #endif 88 } EventRegInfo; 89 90 typedef struct _n_EventRegLog *EventRegLog; 91 struct _n_EventRegLog { 92 int numEvents; /* The number of registered events */ 93 int maxEvents; /* The maximum number of events */ 94 EventRegInfo *eventInfo; /* The registration information for each event */ 95 }; 96 97 typedef struct _n_EventPerfLog *EventPerfLog; 98 struct _n_EventPerfLog { 99 int numEvents; /* The number of logging events */ 100 int maxEvents; /* The maximum number of events */ 101 EventPerfInfo *eventInfo; /* The performance information for each event */ 102 }; 103 104 /* The structure for logging class information */ 105 typedef struct _n_ClassRegLog *ClassRegLog; 106 struct _n_ClassRegLog { 107 int numClasses; /* The number of classes registered */ 108 int maxClasses; /* The maximum number of classes */ 109 ClassRegInfo *classInfo; /* The structure for class information (cookies are monotonicly increasing) */ 110 }; 111 112 typedef struct _n_ClassPerfLog *ClassPerfLog; 113 struct _n_ClassPerfLog { 114 int numClasses; /* The number of logging classes */ 115 int maxClasses; /* The maximum number of classes */ 116 ClassPerfInfo *classInfo; /* The structure for class information (cookies are monotonicly increasing) */ 117 }; 118 119 /* The structures for logging in stages */ 120 typedef struct _StageInfo { 121 char *name; /* The stage name */ 122 PetscTruth used; /* The stage was pushed on this processor */ 123 EventPerfInfo perfInfo; /* The stage performance information */ 124 EventPerfLog eventLog; /* The event information for this stage */ 125 ClassPerfLog classLog; /* The class information for this stage */ 126 } StageInfo; 127 128 struct _n_StageLog { 129 /* Size information */ 130 int numStages; /* The number of registered stages */ 131 int maxStages; /* The maximum number of stages */ 132 /* Runtime information */ 133 IntStack stack; /* The stack for active stages */ 134 int curStage; /* The current stage (only used in macros so we don't call StackTop) */ 135 /* Stage specific information */ 136 StageInfo *stageInfo; /* The information for each stage */ 137 EventRegLog eventLog; /* The registered events */ 138 ClassRegLog classLog; /* The registered classes */ 139 }; 140 141 #if defined(PETSC_USE_LOG) /* --- Logging is turned on --------------------------------*/ 142 143 /* 144 Flop counting: We count each arithmetic operation (e.g., addition, multiplication) separately. 145 146 For the complex numbers version, note that 147 1 complex addition = 2 flops 148 1 complex multiplication = 6 flops, 149 where we define 1 flop as that for a double precision scalar. We roughly approximate 150 flop counting for complex numbers by multiplying the total flops by 4; this corresponds 151 to the assumption that we're counting mostly additions and multiplications -- and 152 roughly the same number of each. More accurate counting could be done by distinguishing 153 among the various arithmetic operations. 154 */ 155 156 #if defined(PETSC_USE_COMPLEX) 157 #define PETSC_FLOPS_PER_OP 4.0 158 #else 159 #define PETSC_FLOPS_PER_OP 1.0 160 #endif 161 162 #if defined(PETSC_USE_DEBUG) 163 #define PetscLogFlops(n) (petsc_tmp_flops = (PETSC_FLOPS_PER_OP*((PetscLogDouble)n)), ((petsc_tmp_flops < 0) ? PETSC_ERR_FLOP_COUNT : (_TotalFlops += petsc_tmp_flops,0))) 164 #define PetscLogFlopsNoError(n) (_TotalFlops += PETSC_FLOPS_PER_OP*((PetscLogDouble)n)) 165 #else 166 #define PetscLogFlops(n) (_TotalFlops += PETSC_FLOPS_PER_OP*((PetscLogDouble)n),0) 167 #define PetscLogFlopsNoError(n) (_TotalFlops += PETSC_FLOPS_PER_OP*((PetscLogDouble)n)) 168 #endif 169 170 #if defined (PETSC_HAVE_MPE) 171 #include "mpe.h" 172 EXTERN PetscErrorCode PETSC_DLLEXPORT PetscLogMPEBegin(void); 173 EXTERN PetscErrorCode PETSC_DLLEXPORT PetscLogMPEDump(const char[]); 174 extern PetscTruth UseMPE; 175 #define PETSC_LOG_EVENT_MPE_BEGIN(e) \ 176 ((UseMPE && _stageLog->stageInfo[_stageLog->curStage].eventLog->eventInfo[e].active) ? \ 177 MPE_Log_event(_stageLog->eventLog->eventInfo[e].mpe_id_begin,0,NULL) : 0) 178 179 #define PETSC_LOG_EVENT_MPE_END(e) \ 180 ((UseMPE && _stageLog->stageInfo[_stageLog->curStage].eventLog->eventInfo[e].active) ? \ 181 MPE_Log_event(_stageLog->eventLog->eventInfo[e].mpe_id_end,0,NULL) : 0) 182 183 #else 184 #define PETSC_LOG_EVENT_MPE_BEGIN(e) 0 185 #define PETSC_LOG_EVENT_MPE_END(e) 0 186 #endif 187 188 EXTERN PETSC_DLLEXPORT PetscErrorCode (*_PetscLogPLB)(PetscLogEvent,int,PetscObject,PetscObject,PetscObject,PetscObject); 189 EXTERN PETSC_DLLEXPORT PetscErrorCode (*_PetscLogPLE)(PetscLogEvent,int,PetscObject,PetscObject,PetscObject,PetscObject); 190 EXTERN PETSC_DLLEXPORT PetscErrorCode (*_PetscLogPHC)(PetscObject); 191 EXTERN PETSC_DLLEXPORT PetscErrorCode (*_PetscLogPHD)(PetscObject); 192 193 #define PetscLogObjectParent(p,c) \ 194 ((c && p) ? ((PetscObject)(c))->parent = (PetscObject)(p),((PetscObject)(c))->parentid = ((PetscObject)p)->id : 0, 0) 195 196 #define PetscLogObjectParents(p,n,d) 0;{int _i; for (_i=0; _i<n; _i++) {ierr = PetscLogObjectParent(p,(d)[_i]);CHKERRQ(ierr);}} 197 #define PetscLogObjectCreate(h) ((_PetscLogPHC) ? (*_PetscLogPHC)((PetscObject)h) : 0) 198 #define PetscLogObjectDestroy(h) ((_PetscLogPHD) ? (*_PetscLogPHD)((PetscObject)h) : 0) 199 #define PetscLogObjectMemory(p,m) (((PetscObject)(p))->mem += (m),0) 200 /* Initialization functions */ 201 EXTERN PetscErrorCode PETSC_DLLEXPORT PetscLogBegin(void); 202 EXTERN PetscErrorCode PETSC_DLLEXPORT PetscLogAllBegin(void); 203 EXTERN PetscErrorCode PETSC_DLLEXPORT PetscLogTraceBegin(FILE *); 204 EXTERN PetscErrorCode PETSC_DLLEXPORT PetscLogActions(PetscTruth); 205 EXTERN PetscErrorCode PETSC_DLLEXPORT PetscLogObjects(PetscTruth); 206 /* General functions */ 207 EXTERN PetscErrorCode PETSC_DLLEXPORT PetscLogGetRGBColor(const char*[]); 208 EXTERN PetscErrorCode PETSC_DLLEXPORT PetscLogDestroy(void); 209 EXTERN PetscErrorCode PETSC_DLLEXPORT PetscLogSet(PetscErrorCode (*)(int, int, PetscObject, PetscObject, PetscObject, PetscObject), 210 PetscErrorCode (*)(int, int, PetscObject, PetscObject, PetscObject, PetscObject)); 211 EXTERN PetscErrorCode PETSC_DLLEXPORT PetscLogObjectState(PetscObject, const char[], ...) PETSC_PRINTF_FORMAT_CHECK(2,3); 212 /* Output functions */ 213 EXTERN PetscErrorCode PETSC_DLLEXPORT PetscLogPrintSummary(MPI_Comm, const char[]); 214 EXTERN PetscErrorCode PETSC_DLLEXPORT PetscLogPrintDetailed(MPI_Comm, const char[]); 215 EXTERN PetscErrorCode PETSC_DLLEXPORT PetscLogDump(const char[]); 216 /* Counter functions */ 217 EXTERN PetscErrorCode PETSC_DLLEXPORT PetscGetFlops(PetscLogDouble *); 218 /* Stage functions */ 219 EXTERN PetscErrorCode PETSC_DLLEXPORT PetscLogStageRegister(const char[],PetscLogStage*); 220 EXTERN PetscErrorCode PETSC_DLLEXPORT PetscLogStagePush(PetscLogStage); 221 EXTERN PetscErrorCode PETSC_DLLEXPORT PetscLogStagePop(void); 222 EXTERN PetscErrorCode PETSC_DLLEXPORT PetscLogStageSetActive(PetscLogStage, PetscTruth); 223 EXTERN PetscErrorCode PETSC_DLLEXPORT PetscLogStageGetActive(PetscLogStage, PetscTruth *); 224 EXTERN PetscErrorCode PETSC_DLLEXPORT PetscLogStageSetVisible(PetscLogStage, PetscTruth); 225 EXTERN PetscErrorCode PETSC_DLLEXPORT PetscLogStageGetVisible(PetscLogStage, PetscTruth *); 226 EXTERN PetscErrorCode PETSC_DLLEXPORT PetscLogStageGetId(const char [], PetscLogStage *); 227 /* Event functions */ 228 EXTERN PetscErrorCode PETSC_DLLEXPORT PetscLogEventRegister(const char[], PetscCookie,PetscLogEvent*); 229 EXTERN PetscErrorCode PETSC_DLLEXPORT PetscLogEventActivate(PetscLogEvent); 230 EXTERN PetscErrorCode PETSC_DLLEXPORT PetscLogEventDeactivate(PetscLogEvent); 231 EXTERN PetscErrorCode PETSC_DLLEXPORT PetscLogEventSetActiveAll(PetscLogEvent, PetscTruth); 232 EXTERN PetscErrorCode PETSC_DLLEXPORT PetscLogEventActivateClass(PetscCookie); 233 EXTERN PetscErrorCode PETSC_DLLEXPORT PetscLogEventDeactivateClass(PetscCookie); 234 235 236 /* Global counters */ 237 extern PETSC_DLLEXPORT PetscLogDouble irecv_ct; 238 extern PETSC_DLLEXPORT PetscLogDouble isend_ct; 239 extern PETSC_DLLEXPORT PetscLogDouble recv_ct; 240 extern PETSC_DLLEXPORT PetscLogDouble send_ct; 241 extern PETSC_DLLEXPORT PetscLogDouble irecv_len; 242 extern PETSC_DLLEXPORT PetscLogDouble isend_len; 243 extern PETSC_DLLEXPORT PetscLogDouble recv_len; 244 extern PETSC_DLLEXPORT PetscLogDouble send_len; 245 extern PETSC_DLLEXPORT PetscLogDouble allreduce_ct; 246 extern PETSC_DLLEXPORT PetscLogDouble gather_ct; 247 extern PETSC_DLLEXPORT PetscLogDouble scatter_ct; 248 extern PETSC_DLLEXPORT PetscLogDouble wait_ct; 249 extern PETSC_DLLEXPORT PetscLogDouble wait_any_ct; 250 extern PETSC_DLLEXPORT PetscLogDouble wait_all_ct; 251 extern PETSC_DLLEXPORT PetscLogDouble sum_of_waits_ct; 252 253 #define PetscLogEventBarrierBegin(e,o1,o2,o3,o4,cm) \ 254 (((_PetscLogPLB && _stageLog->stageInfo[_stageLog->curStage].perfInfo.active && _stageLog->stageInfo[_stageLog->curStage].eventLog->eventInfo[e].active) ? \ 255 (PetscLogEventBegin((e),o1,o2,o3,o4) || MPI_Barrier(cm) || PetscLogEventEnd((e),o1,o2,o3,o4)) : 0 ) || \ 256 PetscLogEventBegin((e)+1,o1,o2,o3,o4)) 257 258 #define PetscLogEventBegin(e,o1,o2,o3,o4) \ 259 (((_PetscLogPLB && _stageLog->stageInfo[_stageLog->curStage].perfInfo.active && _stageLog->stageInfo[_stageLog->curStage].eventLog->eventInfo[e].active) ? \ 260 (*_PetscLogPLB)((e),0,(PetscObject)(o1),(PetscObject)(o2),(PetscObject)(o3),(PetscObject)(o4)) : 0 ) || \ 261 PETSC_LOG_EVENT_MPE_BEGIN(e)) 262 263 #define PetscLogEventBarrierEnd(e,o1,o2,o3,o4,cm) PetscLogEventEnd(e+1,o1,o2,o3,o4) 264 265 #define PetscLogEventEnd(e,o1,o2,o3,o4) \ 266 (((_PetscLogPLE && _stageLog->stageInfo[_stageLog->curStage].perfInfo.active && _stageLog->stageInfo[_stageLog->curStage].eventLog->eventInfo[e].active) ? \ 267 (*_PetscLogPLE)((e),0,(PetscObject)(o1),(PetscObject)(o2),(PetscObject)(o3),(PetscObject)(o4)) : 0 ) || \ 268 PETSC_LOG_EVENT_MPE_END(e)) 269 270 /* Creation and destruction functions */ 271 EXTERN PetscErrorCode PETSC_DLLEXPORT StageLogCreate(StageLog *); 272 EXTERN PetscErrorCode PETSC_DLLEXPORT StageLogDestroy(StageLog); 273 /* Registration functions */ 274 EXTERN PetscErrorCode PETSC_DLLEXPORT StageLogRegister(StageLog, const char [], int *); 275 /* Runtime functions */ 276 EXTERN PetscErrorCode PETSC_DLLEXPORT PetscLogGetStageLog(StageLog *); 277 EXTERN PetscErrorCode PETSC_DLLEXPORT StageLogPush(StageLog, int); 278 EXTERN PetscErrorCode PETSC_DLLEXPORT StageLogPop(StageLog); 279 EXTERN PetscErrorCode PETSC_DLLEXPORT StageLogGetCurrent(StageLog, int *); 280 EXTERN PetscErrorCode PETSC_DLLEXPORT StageLogSetActive(StageLog, int, PetscTruth); 281 EXTERN PetscErrorCode PETSC_DLLEXPORT StageLogGetActive(StageLog, int, PetscTruth *); 282 EXTERN PetscErrorCode PETSC_DLLEXPORT StageLogSetVisible(StageLog, int, PetscTruth); 283 EXTERN PetscErrorCode PETSC_DLLEXPORT StageLogGetVisible(StageLog, int, PetscTruth *); 284 EXTERN PetscErrorCode PETSC_DLLEXPORT StageLogGetStage(StageLog, const char [], int *); 285 EXTERN PetscErrorCode PETSC_DLLEXPORT StageLogGetClassRegLog(StageLog, ClassRegLog *); 286 EXTERN PetscErrorCode PETSC_DLLEXPORT StageLogGetEventRegLog(StageLog, EventRegLog *); 287 EXTERN PetscErrorCode PETSC_DLLEXPORT StageLogGetClassPerfLog(StageLog, int, ClassPerfLog *); 288 EXTERN PetscErrorCode PETSC_DLLEXPORT StageLogGetEventPerfLog(StageLog, int, EventPerfLog *); 289 290 EXTERN PetscErrorCode PETSC_DLLEXPORT EventRegLogGetEvent(EventRegLog, const char [], PetscLogEvent *); 291 292 EXTERN PetscErrorCode PetscLogEventGetFlops(PetscLogEvent, PetscLogDouble*); 293 EXTERN PetscErrorCode PetscLogEventZeroFlops(PetscLogEvent); 294 295 /* 296 These are used internally in the PETSc routines to keep a count of MPI messages and 297 their sizes. 298 299 This does not work for MPI-Uni because our include/mpiuni/mpi.h file 300 uses macros to defined the MPI operations. 301 302 It does not work correctly from HP-UX because it processes the 303 macros in a way that sometimes it double counts, hence 304 PETSC_HAVE_BROKEN_RECURSIVE_MACRO 305 306 It does not work with Windows because winmpich lacks MPI_Type_size() 307 */ 308 #if !defined(__MPIUNI_H) && !defined(PETSC_HAVE_BROKEN_RECURSIVE_MACRO) && !defined (PETSC_HAVE_MPI_MISSING_TYPESIZE) 309 /* 310 Logging of MPI activities 311 */ 312 PETSC_STATIC_INLINE PetscErrorCode TypeSize(PetscLogDouble *buff,PetscMPIInt count,MPI_Datatype type) 313 { 314 PetscMPIInt mysize; return (MPI_Type_size(type,&mysize) || ((*buff += (PetscLogDouble) (count*mysize)),0)); 315 } 316 317 #define MPI_Irecv(buf,count,datatype,source,tag,comm,request) \ 318 ((irecv_ct++,0) || TypeSize(&irecv_len,count,datatype) || MPI_Irecv(buf,count,datatype,source,tag,comm,request)) 319 320 #define MPI_Isend(buf,count,datatype,dest,tag,comm,request) \ 321 ((isend_ct++,0) || TypeSize(&isend_len,count,datatype) || MPI_Isend(buf,count,datatype,dest,tag,comm,request)) 322 323 #define MPI_Startall_irecv(count,number,requests) \ 324 ((irecv_ct += (PetscLogDouble)(number),0) || TypeSize(&irecv_len,count,MPIU_SCALAR) || MPI_Startall(number,requests)) 325 326 #define MPI_Startall_isend(count,number,requests) \ 327 ((isend_ct += (PetscLogDouble)(number),0) || TypeSize(&isend_len,count,MPIU_SCALAR) || MPI_Startall(number,requests)) 328 329 #define MPI_Start_isend(count,requests) \ 330 ((isend_ct++,0) || TypeSize(&isend_len,count,MPIU_SCALAR) || MPI_Start(requests)) 331 332 #define MPI_Recv(buf,count,datatype,source,tag,comm,status) \ 333 ((recv_ct++,0) || TypeSize(&recv_len,count,datatype) || MPI_Recv(buf,count,datatype,source,tag,comm,status)) 334 335 #define MPI_Send(buf,count,datatype,dest,tag,comm) \ 336 ((send_ct++,0) || TypeSize(&send_len,count,datatype) || MPI_Send(buf,count,datatype,dest,tag,comm)) 337 338 #define MPI_Wait(request,status) \ 339 ((wait_ct++,sum_of_waits_ct++,0) || MPI_Wait(request,status)) 340 341 #define MPI_Waitany(a,b,c,d) \ 342 ((wait_any_ct++,sum_of_waits_ct++,0) || MPI_Waitany(a,b,c,d)) 343 344 #define MPI_Waitall(count,array_of_requests,array_of_statuses) \ 345 ((wait_all_ct++,sum_of_waits_ct += (PetscLogDouble) (count),0) || MPI_Waitall(count,array_of_requests,array_of_statuses)) 346 347 #define MPI_Allreduce(sendbuf,recvbuf,count,datatype,op,comm) \ 348 ((allreduce_ct++,0) || MPI_Allreduce(sendbuf,recvbuf,count,datatype,op,comm)) 349 350 #define MPI_Allgather(sendbuf,sendcount,sendtype,recvbuf,recvcount,recvtype,comm) \ 351 ((gather_ct++,0) || MPI_Allgather(sendbuf,sendcount,sendtype,recvbuf,recvcount,recvtype,comm)) 352 353 #define MPI_Allgatherv(sendbuf,sendcount,sendtype,recvbuf,recvcount,displs,recvtype,comm) \ 354 ((gather_ct++,0) || MPI_Allgatherv(sendbuf,sendcount,sendtype,recvbuf,recvcount,displs,recvtype,comm)) 355 356 #define MPI_Gather(sendbuf,sendcount,sendtype,recvbuf,recvcount,recvtype,root,comm) \ 357 ((gather_ct++,0) || TypeSize(&send_len,sendcount,sendtype) || MPI_Gather(sendbuf,sendcount,sendtype,recvbuf,recvcount,recvtype,root,comm)) 358 359 #define MPI_Gatherv(sendbuf,sendcount,sendtype,recvbuf,recvcount,displs,recvtype,root,comm) \ 360 ((gather_ct++,0) || TypeSize(&send_len,sendcount,sendtype) || MPI_Gatherv(sendbuf,sendcount,sendtype,recvbuf,recvcount,displs,recvtype,root,comm)) 361 362 #define MPI_Scatter(sendbuf,sendcount,sendtype,recvbuf,recvcount,recvtype,root,comm) \ 363 ((scatter_ct++,0) || TypeSize(&recv_len,recvcount,recvtype) || MPI_Scatter(sendbuf,sendcount,sendtype,recvbuf,recvcount,recvtype,root,comm)) 364 365 #define MPI_Scatterv(sendbuf,sendcount,displs,sendtype,recvbuf,recvcount,recvtype,root,comm) \ 366 ((scatter_ct++,0) || TypeSize(&recv_len,recvcount,recvtype) || MPI_Scatterv(sendbuf,sendcount,displs,sendtype,recvbuf,recvcount,recvtype,root,comm)) 367 368 #else 369 370 #define MPI_Startall_irecv(count,number,requests) \ 371 (MPI_Startall(number,requests)) 372 373 #define MPI_Startall_isend(count,number,requests) \ 374 (MPI_Startall(number,requests)) 375 376 #define MPI_Start_isend(count,requests) \ 377 (MPI_Start(requests)) 378 379 #endif /* !__MPIUNI_H && ! PETSC_HAVE_BROKEN_RECURSIVE_MACRO */ 380 381 #else /* ---Logging is turned off --------------------------------------------*/ 382 383 #define PetscLogFlops(n) 0 384 #define PetscLogFlopsNoError(n) 385 386 /* 387 With logging turned off, then MPE has to be turned off 388 */ 389 #define PetscLogMPEBegin() 0 390 #define PetscLogMPEDump(a) 0 391 392 #define PetscLogEventActivate(a) 0 393 #define PetscLogEventDeactivate(a) 0 394 395 #define PetscLogEventActivateClass(a) 0 396 #define PetscLogEventDeactivateClass(a) 0 397 #define PetscLogEventSetActiveAll(a,b) 0 398 399 #define _PetscLogPLB 0 400 #define _PetscLogPLE 0 401 #define _PetscLogPHC 0 402 #define _PetscLogPHD 0 403 #define PetscGetFlops(a) (*(a) = 0.0,0) 404 #define PetscLogEventBegin(e,o1,o2,o3,o4) 0 405 #define PetscLogEventEnd(e,o1,o2,o3,o4) 0 406 #define PetscLogEventBarrierBegin(e,o1,o2,o3,o4,cm) 0 407 #define PetscLogEventBarrierEnd(e,o1,o2,o3,o4,cm) 0 408 #define PetscLogObjectParent(p,c) 0 409 #define PetscLogObjectParents(p,n,c) 0 410 #define PetscLogObjectCreate(h) 0 411 #define PetscLogObjectDestroy(h) 0 412 #define PetscLogObjectMemory(p,m) 0 413 #define PetscLogDestroy() 0 414 #define PetscLogStagePush(a) 0 415 #define PetscLogStagePop() 0 416 #define PetscLogStageRegister(a,b) 0 417 #define PetscLogStagePrint(a,flg) 0 418 #define PetscLogPrintSummary(comm,file) 0 419 #define PetscLogPrintDetailed(comm,file) 0 420 #define PetscLogBegin() 0 421 #define PetscLogTraceBegin(file) 0 422 #define PetscLogSet(lb,le) 0 423 #define PetscLogAllBegin() 0 424 #define PetscLogDump(c) 0 425 #define PetscLogEventRegister(a,b,c) 0 426 #define PetscLogObjects(a) 0 427 #define PetscLogActions(a) 0 428 EXTERN PetscErrorCode PETSC_DLLEXPORT PetscLogObjectState(PetscObject,const char[],...) PETSC_PRINTF_FORMAT_CHECK(2,3); 429 430 /* If PETSC_USE_LOG is NOT defined, these still need to be! */ 431 #define MPI_Startall_irecv(count,number,requests) MPI_Startall(number,requests) 432 #define MPI_Startall_isend(count,number,requests) MPI_Startall(number,requests) 433 #define MPI_Start_isend(count,requests) MPI_Start(requests) 434 435 /* Creation and destruction functions */ 436 #define StageLogCreate(stageLog) 0 437 #define StageLogDestroy(stageLog) 0 438 /* Registration functions */ 439 #define StageLogRegister(stageLog, name, stage) 0 440 /* Runtime functions */ 441 #define PetscLogGetStageLog(stageLog) 0 442 #define StageLogPush(stageLog, stage) 0 443 #define StageLogPop(stageLog) 0 444 #define StageLogGetCurrent(stageLog, stage) 0 445 #define StageLogSetActive(stageLog, stage, active) 0 446 #define StageLogGetActive(stageLog, stage, active) 0 447 #define StageLogSetVisible(stageLog, stage, visible) 0 448 #define StageLogGetVisible(stageLog, stage, visible) 0 449 #define StageLogGetStage(stageLog, name, stage) 0 450 #define PetscLogStageGetId(a,b) (*(b)=0,0) 451 #define PetscLogStageSetActive(a,b) 0 452 #define PetscLogStageGetActive(a,b) 0 453 #define PetscLogStageGetVisible(a,b) 0 454 #define PetscLogStageSetVisible(a,b) 0 455 456 #endif /* PETSC_USE_LOG */ 457 458 /* Special support for C++ */ 459 #include "petsclog.hh" 460 461 #define PreLoadBegin(flag,name) \ 462 {\ 463 PetscTruth PreLoading = flag;\ 464 int PreLoadMax,PreLoadIt;\ 465 PetscLogStage _stageNum;\ 466 PetscErrorCode _3_ierr; \ 467 _3_ierr = PetscOptionsGetTruth(PETSC_NULL,"-preload",&PreLoading,PETSC_NULL);CHKERRQ(_3_ierr);\ 468 PreLoadMax = (int)(PreLoading);\ 469 PetscPreLoadingUsed = PreLoading ? PETSC_TRUE : PetscPreLoadingUsed;\ 470 for (PreLoadIt=0; PreLoadIt<=PreLoadMax; PreLoadIt++) {\ 471 PetscPreLoadingOn = PreLoading;\ 472 _3_ierr = PetscBarrier(PETSC_NULL);CHKERRQ(_3_ierr);\ 473 if (PreLoadIt>0) {\ 474 _3_ierr = PetscLogStageGetId(name,&_stageNum);CHKERRQ(_3_ierr);\ 475 } else {\ 476 _3_ierr = PetscLogStageRegister(name,&_stageNum);CHKERRQ(_3_ierr); \ 477 }\ 478 _3_ierr = PetscLogStageSetActive(_stageNum,(PetscTruth)(!PreLoadMax || PreLoadIt));\ 479 _3_ierr = PetscLogStagePush(_stageNum);CHKERRQ(_3_ierr); 480 481 #define PreLoadEnd() \ 482 _3_ierr = PetscLogStagePop();CHKERRQ(_3_ierr);\ 483 PreLoading = PETSC_FALSE;\ 484 }\ 485 } 486 487 #define PreLoadStage(name) \ 488 _3_ierr = PetscLogStagePop();CHKERRQ(_3_ierr);\ 489 if (PreLoadIt>0) {\ 490 _3_ierr = PetscLogStageGetId(name,&_stageNum);CHKERRQ(_3_ierr);\ 491 } else {\ 492 _3_ierr = PetscLogStageRegister(name,&_stageNum);CHKERRQ(_3_ierr); \ 493 }\ 494 _3_ierr = PetscLogStageSetActive(_stageNum,(PetscTruth)(!PreLoadMax || PreLoadIt));\ 495 _3_ierr = PetscLogStagePush(_stageNum);CHKERRQ(_3_ierr); 496 497 PETSC_EXTERN_CXX_END 498 #endif 499