1*3a40ed3dSBarry Smith /* $Id: petsclog.h,v 1.114 1997/09/09 20:27:02 curfman Exp bsmith $ */ 297bb86f7SLois Curfman McInnes 397bb86f7SLois Curfman McInnes /* 47588ac45SBarry Smith Defines profile/logging in PETSc. 597bb86f7SLois Curfman McInnes */ 697bb86f7SLois Curfman McInnes 797bb86f7SLois Curfman McInnes #if !defined(__PLOG_PACKAGE) 897bb86f7SLois Curfman McInnes #define __PLOG_PACKAGE 997bb86f7SLois Curfman McInnes #include "petsc.h" 1097bb86f7SLois Curfman McInnes 1197bb86f7SLois Curfman McInnes /* 127588ac45SBarry Smith Lists all PETSc events that are logged/profiled. 137588ac45SBarry Smith 14a2ce50c7SBarry Smith If you add an event here, make sure you add it to 15a2ce50c7SBarry Smith petsc/bin/petscview.cfg, 16a2ce50c7SBarry Smith petsc/bin/petscview, 17a2ce50c7SBarry Smith petsc/src/plog/src/plog.c, 182ee1dbe0SBarry Smith petsc/src/plog/src/plogmpe.c, and 19e10960a1SSatish Balay petsc/include/FINCLUDE/petsclog.h!!! 2097bb86f7SLois Curfman McInnes */ 2197bb86f7SLois Curfman McInnes #define MAT_Mult 0 221ff317f7SLois Curfman McInnes #define MAT_MatrixFreeMult 1 231ff317f7SLois Curfman McInnes #define MAT_AssemblyBegin 2 241ff317f7SLois Curfman McInnes #define MAT_AssemblyEnd 3 251ff317f7SLois Curfman McInnes #define MAT_GetReordering 4 261ff317f7SLois Curfman McInnes #define MAT_MultTrans 5 271ff317f7SLois Curfman McInnes #define MAT_MultAdd 6 281ff317f7SLois Curfman McInnes #define MAT_MultTransAdd 7 291ff317f7SLois Curfman McInnes #define MAT_LUFactor 8 301ff317f7SLois Curfman McInnes #define MAT_CholeskyFactor 9 311ff317f7SLois Curfman McInnes #define MAT_LUFactorSymbolic 10 321ff317f7SLois Curfman McInnes #define MAT_ILUFactorSymbolic 11 331ff317f7SLois Curfman McInnes #define MAT_CholeskyFactorSymbolic 12 341ff317f7SLois Curfman McInnes #define MAT_IncompleteCholeskyFactorSymbolic 13 351ff317f7SLois Curfman McInnes #define MAT_LUFactorNumeric 14 361ff317f7SLois Curfman McInnes #define MAT_CholeskyFactorNumeric 15 371ff317f7SLois Curfman McInnes #define MAT_Relax 16 381ff317f7SLois Curfman McInnes #define MAT_Copy 17 391ff317f7SLois Curfman McInnes #define MAT_Convert 18 401ff317f7SLois Curfman McInnes #define MAT_Scale 19 411ff317f7SLois Curfman McInnes #define MAT_ZeroEntries 20 421ff317f7SLois Curfman McInnes #define MAT_Solve 21 431ff317f7SLois Curfman McInnes #define MAT_SolveAdd 22 441ff317f7SLois Curfman McInnes #define MAT_SolveTrans 23 451ff317f7SLois Curfman McInnes #define MAT_SolveTransAdd 24 461ff317f7SLois Curfman McInnes #define MAT_SetValues 25 471ff317f7SLois Curfman McInnes #define MAT_ForwardSolve 26 481ff317f7SLois Curfman McInnes #define MAT_BackwardSolve 27 491ff317f7SLois Curfman McInnes #define MAT_Load 28 501ff317f7SLois Curfman McInnes #define MAT_View 29 511ff317f7SLois Curfman McInnes #define MAT_ILUFactor 30 523e584e2eSBarry Smith #define MAT_GetColoring 31 531ff317f7SLois Curfman McInnes #define MAT_GetSubMatrices 32 541ff317f7SLois Curfman McInnes #define MAT_GetValues 33 551ff317f7SLois Curfman McInnes #define MAT_IncreaseOverlap 34 56dd8bebb4SSatish Balay #define MAT_GetRow 35 5797bb86f7SLois Curfman McInnes 58005c665bSBarry Smith #define VEC_ScatterBarrier 39 594dcbc457SBarry Smith #define VEC_Dot 40 604dcbc457SBarry Smith #define VEC_Norm 41 614dcbc457SBarry Smith #define VEC_Max 42 624dcbc457SBarry Smith #define VEC_Min 43 634dcbc457SBarry Smith #define VEC_TDot 44 644dcbc457SBarry Smith #define VEC_Scale 45 654dcbc457SBarry Smith #define VEC_Copy 46 664dcbc457SBarry Smith #define VEC_Set 47 674dcbc457SBarry Smith #define VEC_AXPY 48 684dcbc457SBarry Smith #define VEC_AYPX 49 694dcbc457SBarry Smith #define VEC_Swap 50 704dcbc457SBarry Smith #define VEC_WAXPY 51 714dcbc457SBarry Smith #define VEC_AssemblyBegin 52 724dcbc457SBarry Smith #define VEC_AssemblyEnd 53 734dcbc457SBarry Smith #define VEC_MTDot 54 744dcbc457SBarry Smith #define VEC_MDot 55 754dcbc457SBarry Smith #define VEC_MAXPY 56 764dcbc457SBarry Smith #define VEC_PMult 57 774dcbc457SBarry Smith #define VEC_SetValues 58 784dcbc457SBarry Smith #define VEC_Load 59 794dcbc457SBarry Smith #define VEC_View 60 804dcbc457SBarry Smith #define VEC_ScatterBegin 61 814dcbc457SBarry Smith #define VEC_ScatterEnd 62 82bf5bf444SLois Curfman McInnes #define VEC_SetRandom 63 8397bb86f7SLois Curfman McInnes 84005c665bSBarry Smith #define VEC_NormBarrier 64 85005c665bSBarry Smith #define VEC_NormComm 65 86005c665bSBarry Smith #define VEC_DotBarrier 66 87005c665bSBarry Smith #define VEC_DotComm 67 88005c665bSBarry Smith #define VEC_MDotBarrier 68 89005c665bSBarry Smith #define VEC_MDotComm 69 90005c665bSBarry Smith 914dcbc457SBarry Smith #define SLES_Solve 70 924dcbc457SBarry Smith #define SLES_SetUp 71 9397bb86f7SLois Curfman McInnes 944dcbc457SBarry Smith #define KSP_GMRESOrthogonalization 72 9597bb86f7SLois Curfman McInnes 961bffabb2SLois Curfman McInnes #define PC_ModifySubMatrices 74 974dcbc457SBarry Smith #define PC_SetUp 75 9836058207SBarry Smith #define PC_SetUpOnBlocks 76 9932284f49SSatish Balay #define PC_Apply 77 100614700edSBarry Smith #define PC_ApplySymmetricLeft 78 101614700edSBarry Smith #define PC_ApplySymmetricRight 79 1024dcbc457SBarry Smith 1034dcbc457SBarry Smith #define SNES_Solve 80 1044dcbc457SBarry Smith #define SNES_LineSearch 81 1054dcbc457SBarry Smith #define SNES_FunctionEval 82 1064dcbc457SBarry Smith #define SNES_JacobianEval 83 1074dcbc457SBarry Smith #define SNES_MinimizationFunctionEval 84 1084dcbc457SBarry Smith #define SNES_GradientEval 85 1094dcbc457SBarry Smith #define SNES_HessianEval 86 1104dcbc457SBarry Smith 111682d7d0cSBarry Smith #define TS_Step 90 112bf343e40SBarry Smith #define TS_PseudoComputeTimeStep 91 11372936c9dSBarry Smith 11472936c9dSBarry Smith #define Petsc_Barrier 100 11555206aebSLois Curfman McInnes 1160513a670SBarry Smith #define EC_SetUp 105 1170513a670SBarry Smith #define EC_Solve 106 1180513a670SBarry Smith 11955206aebSLois Curfman McInnes #define DFVec_RefineVector 110 12055206aebSLois Curfman McInnes #define DFVec_AssembleFullVector 111 12155206aebSLois Curfman McInnes #define DFVec_GetComponentVectors 112 12255206aebSLois Curfman McInnes #define DFVec_DrawContours 113 12355206aebSLois Curfman McInnes 12441debaddSBarry Smith /* 125b3b1b5bfSLois Curfman McInnes Event numbers PLOG_USER_EVENT_LOW to PLOG_USER_EVENT_HIGH are reserved 12677c4ece6SBarry Smith for applications. Make sure that src/plog/src/plog.c defines enough 127b3b1b5bfSLois Curfman McInnes entries in (*name)[] to go up to PLOG_USER_EVENT_HIGH. 12841debaddSBarry Smith */ 12935aab85fSBarry Smith #define PLOG_USER_EVENT_LOW_STATIC 120 1304dcbc457SBarry Smith #define PLOG_USER_EVENT_HIGH 200 13197bb86f7SLois Curfman McInnes 13219b02663SBarry Smith /* Global flop counter */ 13347794344SBarry Smith extern PLogDouble _TotalFlops; 13419b02663SBarry Smith 135edde42fcSLois Curfman McInnes /* General logging of information; different from event logging */ 13694a424c1SBarry Smith extern int PLogInfo(void*,char*,...); 137cfd8f56bSLois Curfman McInnes extern int PLogInfoDeactivateClass(int); 138614700edSBarry Smith extern int PLogInfoActivateClass(int); 13943a90d84SBarry Smith extern int PLogPrintInfo; /* if 1, indicates PLogInfo() is turned on */ 140614700edSBarry Smith 141*3a40ed3dSBarry Smith #if defined(USE_PETSC_LOG) /* --- Logging is turned on --------------------------------*/ 142614700edSBarry Smith 143da63de55SLois Curfman McInnes /* 144da63de55SLois Curfman McInnes Flop counting: We count each arithmetic operation (e.g., addition, multiplication) separately. 145da63de55SLois Curfman McInnes 146da63de55SLois Curfman McInnes For the complex numbers version, note that 147da63de55SLois Curfman McInnes 1 complex addition = 2 flops 148da63de55SLois Curfman McInnes 1 complex multiplication = 6 flops, 149da63de55SLois Curfman McInnes where we define 1 flop as that for a double precision scalar. We roughly approximate 150da63de55SLois Curfman McInnes flop counting for complex numbers by multiplying the total flops by 4; this corresponds 151da63de55SLois Curfman McInnes to the assumption that we're counting mostly additions and multiplications -- and 152da63de55SLois Curfman McInnes roughly the same number of each. More accurate counting could be done by distinguishing 153da63de55SLois Curfman McInnes among the various arithmetic operations. 154da63de55SLois Curfman McInnes */ 155da63de55SLois Curfman McInnes 156*3a40ed3dSBarry Smith #if defined(USE_PETSC_COMPLEX) 157da63de55SLois Curfman McInnes #define PLogFlops(n) {_TotalFlops += (4*n);} 158da63de55SLois Curfman McInnes #else 159a2ce50c7SBarry Smith #define PLogFlops(n) {_TotalFlops += (n);} 160da63de55SLois Curfman McInnes #endif 16177c4ece6SBarry Smith 16277c4ece6SBarry Smith #if defined (HAVE_MPE) 16377c4ece6SBarry Smith #include "mpe.h" 164614700edSBarry Smith #define MPEBEGIN 1000 16577c4ece6SBarry Smith extern int PLogMPEBegin(); 16677c4ece6SBarry Smith extern int PLogMPEDump(char *); 167614700edSBarry Smith extern int UseMPE,PLogEventMPEFlags[]; 168614700edSBarry Smith extern int PLogEventMPEActivate(int); 169905e6a2fSBarry Smith extern int PLogEventMPEDeactivate(int); 170614700edSBarry Smith #else 171c74530a3SSatish Balay #define PLogEventMPEActivate(a) 0 172c74530a3SSatish Balay #define PLogEventMPEDeactivate(a) 0 17377c4ece6SBarry Smith #endif 17477c4ece6SBarry Smith 175614700edSBarry Smith extern int PLogEventActivate(int); 176905e6a2fSBarry Smith extern int PLogEventDeactivate(int); 177614700edSBarry Smith 1783e584e2eSBarry Smith extern int PLogEventActivateClass(int); 1793e584e2eSBarry Smith extern int PLogEventDeactivateClass(int); 180614700edSBarry Smith 181614700edSBarry Smith extern int PLogEventFlags[]; 182b3bbe94bSBarry Smith extern int (*_PLogPLB)(int,int,PetscObject,PetscObject,PetscObject,PetscObject); 183b3bbe94bSBarry Smith extern int (*_PLogPLE)(int,int,PetscObject,PetscObject,PetscObject,PetscObject); 184b3bbe94bSBarry Smith extern int (*_PLogPHC)(PetscObject); 185b3bbe94bSBarry Smith extern int (*_PLogPHD)(PetscObject); 18677c4ece6SBarry Smith 18777c4ece6SBarry Smith #if defined(HAVE_MPE) 188005c665bSBarry Smith #define PLogEventBarrierBegin(e,o1,o2,o3,o4,cm) \ 189005c665bSBarry Smith { \ 190005c665bSBarry Smith if (_PLogPLB && PLogEventFlags[e]) { \ 191005c665bSBarry Smith PLogEventBegin((e),o1,o2,o3,o4); \ 192005c665bSBarry Smith if (UseMPE && PLogEventMPEFlags[(e)])\ 193005c665bSBarry Smith MPE_Log_event(MPEBEGIN+2*(e),0,"");\ 194005c665bSBarry Smith MPI_Barrier(cm); \ 195005c665bSBarry Smith PLogEventEnd((e),o1,o2,o3,o4); \ 196005c665bSBarry Smith if (UseMPE && PLogEventMPEFlags[(e)])\ 197005c665bSBarry Smith MPE_Log_event(MPEBEGIN+2*((e)+1),0,"");\ 198005c665bSBarry Smith } \ 199005c665bSBarry Smith PLogEventBegin(e+1,o1,o2,o3,o4); \ 200005c665bSBarry Smith if (UseMPE && PLogEventMPEFlags[(e)+1])\ 201005c665bSBarry Smith MPE_Log_event(MPEBEGIN+2*((e)+1),0,"");\ 202005c665bSBarry Smith } 203a1b5d808SSatish Balay #define PLogEventBegin(e,o1,o2,o3,o4) \ 20456cd22aeSBarry Smith { \ 205005c665bSBarry Smith if (_PLogPLB && PLogEventFlags[(e)]) \ 206005c665bSBarry Smith (*_PLogPLB)((e),0,(PetscObject)(o1),(PetscObject)(o2),(PetscObject)(o3),(PetscObject)(o4));\ 207005c665bSBarry Smith if (UseMPE && PLogEventMPEFlags[(e)])\ 208005c665bSBarry Smith MPE_Log_event(MPEBEGIN+2*(e),0,"");\ 20977c4ece6SBarry Smith } 21077c4ece6SBarry Smith #else 211005c665bSBarry Smith #define PLogEventBarrierBegin(e,o1,o2,o3,o4,cm) \ 212005c665bSBarry Smith { \ 213005c665bSBarry Smith if (_PLogPLB && PLogEventFlags[(e)]) { \ 214005c665bSBarry Smith PLogEventBegin((e),o1,o2,o3,o4); \ 215005c665bSBarry Smith MPI_Barrier(cm); \ 216005c665bSBarry Smith PLogEventEnd((e),o1,o2,o3,o4); \ 217005c665bSBarry Smith } \ 218005c665bSBarry Smith PLogEventBegin((e)+1,o1,o2,o3,o4); \ 219005c665bSBarry Smith } 220a1b5d808SSatish Balay #define PLogEventBegin(e,o1,o2,o3,o4) \ 22156cd22aeSBarry Smith { \ 222005c665bSBarry Smith if (_PLogPLB && PLogEventFlags[(e)]) \ 223005c665bSBarry Smith (*_PLogPLB)((e),0,(PetscObject)(o1),(PetscObject)(o2),(PetscObject)(o3),(PetscObject)(o4));\ 22477c4ece6SBarry Smith } 22577c4ece6SBarry Smith #endif 22677c4ece6SBarry Smith 22777c4ece6SBarry Smith #if defined(HAVE_MPE) 228005c665bSBarry Smith #define PLogEventBarrierEnd(e,o1,o2,o3,o4,cm) {\ 229005c665bSBarry Smith if (_PLogPLE && PLogEventFlags[(e)+1]) \ 230005c665bSBarry Smith (*_PLogPLE)((e)+1,0,(PetscObject)(o1),(PetscObject)(o2),(PetscObject)(o3),(PetscObject)(o4));\ 231005c665bSBarry Smith if (UseMPE && PLogEventMPEFlags[(e)+1])\ 232005c665bSBarry Smith MPE_Log_event(MPEBEGIN+2*((e)+1)+1,0,"");\ 233005c665bSBarry Smith } 23477c4ece6SBarry Smith #define PLogEventEnd(e,o1,o2,o3,o4) {\ 235005c665bSBarry Smith if (_PLogPLE && PLogEventFlags[(e)]) \ 236005c665bSBarry Smith (*_PLogPLE)((e),0,(PetscObject)(o1),(PetscObject)(o2),(PetscObject)(o3),(PetscObject)(o4));\ 237005c665bSBarry Smith if (UseMPE && PLogEventMPEFlags[(e)])\ 238005c665bSBarry Smith MPE_Log_event(MPEBEGIN+2*(e)+1,0,"");\ 239a1b5d808SSatish Balay } 24077c4ece6SBarry Smith #else 241005c665bSBarry Smith #define PLogEventBarrierEnd(e,o1,o2,o3,o4,cm) {\ 242005c665bSBarry Smith if (_PLogPLE && PLogEventFlags[(e)+1]) \ 243005c665bSBarry Smith (*_PLogPLE)((e)+1,0,(PetscObject)(o1),(PetscObject)(o2),(PetscObject)(o3),(PetscObject)(o4));\ 244005c665bSBarry Smith } 24577c4ece6SBarry Smith #define PLogEventEnd(e,o1,o2,o3,o4) {\ 246005c665bSBarry Smith if (_PLogPLE && PLogEventFlags[(e)]) \ 247005c665bSBarry Smith (*_PLogPLE)((e),0,(PetscObject)(o1),(PetscObject)(o2),(PetscObject)(o3),(PetscObject)(o4));\ 248a1b5d808SSatish Balay } 24977c4ece6SBarry Smith #endif 25077c4ece6SBarry Smith 25177c4ece6SBarry Smith 252*3a40ed3dSBarry Smith #define PLogObjectParent(p,c) if (c) {PetscValidHeader((PetscObject)(c)); \ 253*3a40ed3dSBarry Smith PetscValidHeader((PetscObject)(p));\ 254*3a40ed3dSBarry Smith ((PetscObject)(c))->parent = (PetscObject) (p);} 25577c4ece6SBarry Smith #define PLogObjectParents(p,n,d) {int _i; for ( _i=0; _i<n; _i++ ) \ 25677c4ece6SBarry Smith PLogObjectParent(p,(d)[_i]);} 257b3bbe94bSBarry Smith #define PLogObjectCreate(h) {if (_PLogPHC) (*_PLogPHC)((PetscObject)h);} 258b3bbe94bSBarry Smith #define PLogObjectDestroy(h) {if (_PLogPHD) (*_PLogPHD)((PetscObject)h);} 25977c4ece6SBarry Smith #define PLogObjectMemory(p,m) {PetscValidHeader((PetscObject)p);\ 26077c4ece6SBarry Smith ((PetscObject)(p))->mem += (m);} 26177c4ece6SBarry Smith extern int PLogObjectState(PetscObject,char *,...); 26277c4ece6SBarry Smith extern int PLogDestroy(); 26377c4ece6SBarry Smith extern int PLogStagePush(int); 26477c4ece6SBarry Smith extern int PLogStagePop(); 26577c4ece6SBarry Smith extern int PLogStageRegister(int,char*); 2663044e3d5SSatish Balay extern int PLogPrintSummary(MPI_Comm,char *); 267edde42fcSLois Curfman McInnes extern int PLogBegin(); 268bc1211c7SBarry Smith extern int PLogTraceBegin(FILE *); 269edde42fcSLois Curfman McInnes extern int PLogAllBegin(); 270bc1211c7SBarry Smith extern int PLogSet(int (*)(int,int,PetscObject,PetscObject,PetscObject,PetscObject), 271bc1211c7SBarry Smith int (*)(int,int,PetscObject,PetscObject,PetscObject,PetscObject)); 272edde42fcSLois Curfman McInnes extern int PLogDump(char*); 273edde42fcSLois Curfman McInnes extern int PLogEventRegister(int*,char*,char*); 27447794344SBarry Smith extern PLogDouble PetscGetFlops(); 27577c4ece6SBarry Smith 27647794344SBarry Smith extern PLogDouble irecv_ct, isend_ct, wait_ct, wait_any_ct, recv_ct, send_ct; 27747794344SBarry Smith extern PLogDouble irecv_len, isend_len, recv_len, send_len; 27847794344SBarry Smith extern PLogDouble wait_all_ct,allreduce_ct,sum_of_waits_ct; 279ce85283eSBarry Smith /* 28084cb2905SBarry Smith This does not work for MPI-Uni because our src/mpiuni/mpi.h file 281ce85283eSBarry Smith uses macros to defined the MPI operations. 28215308354SBarry Smith 28315308354SBarry Smith It does not work correctly from HP-UX because it processes the 28415308354SBarry Smith macros in a way that sometimes it double counts. 2857c1e34a4SSatish Balay 2867c1e34a4SSatish Balay It does not work with Windows NT because winmpich lacks MPI_Type_size() 287ce85283eSBarry Smith */ 288a1f2733dSSatish Balay #if !defined(PETSC_USING_MPIUNI) && !defined(PARCH_hpux) && !defined (PARCH_nt) 28977a39924SBarry Smith /* 29077a39924SBarry Smith Logging of MPI activities 29177a39924SBarry Smith */ 29277a39924SBarry Smith 29377a39924SBarry Smith #define TypeSize(buff,count,type) \ 29477a39924SBarry Smith { \ 29577a39924SBarry Smith if (type == MPIU_SCALAR) { \ 29647794344SBarry Smith buff += (PLogDouble) ((count)*sizeof(Scalar)); \ 29777a39924SBarry Smith } else if (type == MPI_INT) { \ 29847794344SBarry Smith buff += (PLogDouble) ((count)*sizeof(int)); \ 29977a39924SBarry Smith } else { \ 30047794344SBarry Smith int _size; MPI_Type_size(type,&_size); buff += (PLogDouble) ((count)*_size); \ 30177a39924SBarry Smith } \ 30277a39924SBarry Smith } 30377a39924SBarry Smith 30477a39924SBarry Smith #define MPI_Irecv( buf, count, datatype, source, tag, comm, request) \ 30577a39924SBarry Smith { \ 30677a39924SBarry Smith MPI_Irecv( buf, count, datatype, source, tag, comm, request); \ 30777a39924SBarry Smith irecv_ct++; TypeSize(irecv_len,count,datatype); \ 30877a39924SBarry Smith } 30915308354SBarry Smith 31077a39924SBarry Smith #define MPI_Isend( buf, count, datatype, dest, tag, comm, request) \ 31177a39924SBarry Smith { \ 31277a39924SBarry Smith MPI_Isend( buf, count, datatype, dest, tag, comm, request); \ 313e0937024SBarry Smith isend_ct++; TypeSize(isend_len,count,datatype); \ 31477a39924SBarry Smith } 31515308354SBarry Smith 3160d4b0b6cSBarry Smith #define MPI_Startall_irecv( count,number,requests) \ 3170d4b0b6cSBarry Smith { \ 3180d4b0b6cSBarry Smith MPI_Startall( number, requests); \ 31947794344SBarry Smith irecv_ct += (PLogDouble)(number); irecv_len += (PLogDouble) (count*sizeof(Scalar)); \ 3200d4b0b6cSBarry Smith } 3210d4b0b6cSBarry Smith 3220d4b0b6cSBarry Smith #define MPI_Startall_isend( count,number,requests) \ 3230d4b0b6cSBarry Smith { \ 3240d4b0b6cSBarry Smith MPI_Startall( number, requests); \ 32547794344SBarry Smith isend_ct += (PLogDouble)(number); isend_len += (PLogDouble) (count*sizeof(Scalar)); \ 3260d4b0b6cSBarry Smith } 3270d4b0b6cSBarry Smith 3280d4b0b6cSBarry Smith #define MPI_Start_isend(count, requests) \ 3290d4b0b6cSBarry Smith { \ 3300d4b0b6cSBarry Smith MPI_Start( requests); \ 33147794344SBarry Smith isend_ct++; isend_len += (PLogDouble) (count*sizeof(Scalar)); \ 3320d4b0b6cSBarry Smith } 3330d4b0b6cSBarry Smith 334ce85283eSBarry Smith #define MPI_Recv( buf, count, datatype, source, tag, comm, status) \ 335ce85283eSBarry Smith { \ 336ce85283eSBarry Smith MPI_Recv( buf, count, datatype, source, tag, comm, status); \ 337ce85283eSBarry Smith recv_ct++; TypeSize(recv_len,count,datatype); \ 338ce85283eSBarry Smith } 33915308354SBarry Smith 34077a39924SBarry Smith #define MPI_Send( buf, count, datatype, dest, tag, comm) \ 34177a39924SBarry Smith { \ 34277a39924SBarry Smith MPI_Send( buf, count, datatype, dest, tag, comm); \ 343e0937024SBarry Smith send_ct++; TypeSize(send_len,count,datatype); \ 34477a39924SBarry Smith } 34577a39924SBarry Smith 34677a39924SBarry Smith #define MPI_Wait(request, status) \ 34777a39924SBarry Smith ( \ 348e0937024SBarry Smith wait_ct++, sum_of_waits_ct++, \ 34977a39924SBarry Smith MPI_Wait(request, status) \ 35077a39924SBarry Smith ) 35177a39924SBarry Smith 35277a39924SBarry Smith #define MPI_Waitany(a, b, c, d) \ 35377a39924SBarry Smith ( \ 354e0937024SBarry Smith wait_any_ct++, sum_of_waits_ct++, \ 35577a39924SBarry Smith MPI_Waitany(a, b, c, d) \ 35677a39924SBarry Smith ) 35777a39924SBarry Smith 35877a39924SBarry Smith #define MPI_Waitall(count, array_of_requests, array_of_statuses) \ 35977a39924SBarry Smith ( \ 36047794344SBarry Smith wait_all_ct++, sum_of_waits_ct += (PLogDouble) (count), \ 36177a39924SBarry Smith MPI_Waitall(count, array_of_requests, array_of_statuses) \ 36277a39924SBarry Smith ) 36377a39924SBarry Smith 36477a39924SBarry Smith #define MPI_Allreduce( sendbuf, recvbuf, count, datatype, op, comm) \ 365005c665bSBarry Smith (allreduce_ct++,MPI_Allreduce( sendbuf, recvbuf, count, datatype, op, comm)) 3663914022bSBarry Smith 3670d4b0b6cSBarry Smith #else 3680d4b0b6cSBarry Smith 3690d4b0b6cSBarry Smith #define MPI_Startall_irecv( count,number,requests) \ 3700d4b0b6cSBarry Smith { \ 3710d4b0b6cSBarry Smith MPI_Startall( number, requests); \ 3720d4b0b6cSBarry Smith } 3730d4b0b6cSBarry Smith 3740d4b0b6cSBarry Smith #define MPI_Startall_isend( count,number,requests) \ 3750d4b0b6cSBarry Smith { \ 3760d4b0b6cSBarry Smith MPI_Startall( number, requests); \ 3770d4b0b6cSBarry Smith } 3780d4b0b6cSBarry Smith 3790d4b0b6cSBarry Smith #define MPI_Start_isend(count, requests) \ 3800d4b0b6cSBarry Smith { \ 3810d4b0b6cSBarry Smith MPI_Start( requests); \ 3820d4b0b6cSBarry Smith } 3830d4b0b6cSBarry Smith 38415308354SBarry Smith #endif /* ! PETSC_USING_MPIUNI && ! PARCH_hpux */ 385614700edSBarry Smith 386df8cf0b5SBarry Smith #else /* ---Logging is turned off --------------------------------------------*/ 387614700edSBarry Smith 388614700edSBarry Smith #define PLogFlops(n) 389614700edSBarry Smith 390df8cf0b5SBarry Smith /* 391df8cf0b5SBarry Smith With logging turned off, then MPE has to be turned off 392df8cf0b5SBarry Smith */ 393614700edSBarry Smith #define MPEBEGIN 1000 394df8cf0b5SBarry Smith #define PLogMPEBegin() 395df8cf0b5SBarry Smith #define PLogMPEDump(a) 396bf343e40SBarry Smith #define PLogEventMPEActivate(a) 0 397bf343e40SBarry Smith #define PLogEventMPEDeactivate(a) 0 398614700edSBarry Smith 399bf343e40SBarry Smith #define PLogEventActivate(a) 0 400bf343e40SBarry Smith #define PLogEventDeactivate(a) 0 401614700edSBarry Smith 402bf343e40SBarry Smith #define PLogEventActivateClass(a) 0 403bf343e40SBarry Smith #define PLogEventDeactivateClass(a) 0 40477c4ece6SBarry Smith 405b3bbe94bSBarry Smith #define _PLogPLB 0 406b3bbe94bSBarry Smith #define _PLogPLE 0 407b3bbe94bSBarry Smith #define _PLogPHC 0 408b3bbe94bSBarry Smith #define _PLogPHD 0 409a5558d3fSBarry Smith #define PetscGetFlops() 0.0 410d7a720efSLois Curfman McInnes #define PLogEventBegin(e,o1,o2,o3,o4) 411d7a720efSLois Curfman McInnes #define PLogEventEnd(e,o1,o2,o3,o4) 412005c665bSBarry Smith #define PLogEventBarrierBegin(e,o1,o2,o3,o4,cm) 413005c665bSBarry Smith #define PLogEventBarrierEnd(e,o1,o2,o3,o4,cm) 414d7a720efSLois Curfman McInnes #define PLogObjectParent(p,c) 415d7a720efSLois Curfman McInnes #define PLogObjectParents(p,n,c) 416d7a720efSLois Curfman McInnes #define PLogObjectCreate(h) 417d7a720efSLois Curfman McInnes #define PLogObjectDestroy(h) 418d7a720efSLois Curfman McInnes #define PLogObjectMemory(p,m) 419d7a720efSLois Curfman McInnes #define PLogDestroy() 420bf343e40SBarry Smith #define PLogStagePush(a) 421d7a720efSLois Curfman McInnes #define PLogStagePop() 422d7a720efSLois Curfman McInnes #define PLogStageRegister(a,b) 423d7a720efSLois Curfman McInnes #define PLogPrintSummary(comm,file) 424d7a720efSLois Curfman McInnes #define PLogBegin() 425974088aaSSatish Balay #define PLogTraceBegin(file) 0 426bc1211c7SBarry Smith #define PLogSet(lb,le) 427d7a720efSLois Curfman McInnes #define PLogAllBegin() 428d7a720efSLois Curfman McInnes #define PLogDump(char) 429dc4777aeSSatish Balay #define PLogEventRegister(a,b,c) 0 430d7a720efSLois Curfman McInnes #define PLogMPEBegin() 431d7a720efSLois Curfman McInnes #define PLogMPEDump(a) 4327f8359c1SLois Curfman McInnes extern int PLogObjectState(PetscObject,char *,...); 433ce6058e1SBarry Smith 434*3a40ed3dSBarry Smith /* If USE_PETSC_LOG is NOT defined, these still need to be! */ 435ce6058e1SBarry Smith #define MPI_Startall_irecv( count,number,requests) \ 436ce6058e1SBarry Smith { \ 437ce6058e1SBarry Smith MPI_Startall( number, requests); \ 438ce6058e1SBarry Smith } 439ce6058e1SBarry Smith 440ce6058e1SBarry Smith #define MPI_Startall_isend( count,number,requests) \ 441ce6058e1SBarry Smith { \ 442ce6058e1SBarry Smith MPI_Startall( number, requests); \ 443ce6058e1SBarry Smith } 444ce6058e1SBarry Smith 445ce6058e1SBarry Smith #define MPI_Start_isend(count, requests) \ 446ce6058e1SBarry Smith { \ 447ce6058e1SBarry Smith MPI_Start( requests); \ 448ce6058e1SBarry Smith } 449*3a40ed3dSBarry Smith #endif /* USE_PETSC_LOG */ 4506daaf66cSBarry Smith 4518b6d568bSLois Curfman McInnes /*MC 45219b02663SBarry Smith PLogFlops - Adds floating point operations to the global counter. 45319b02663SBarry Smith 45419b02663SBarry Smith Input Parameter: 45519b02663SBarry Smith . f - flop counter 45619b02663SBarry Smith 45719b02663SBarry Smith Synopsis: 458682ac3c9SWilliam Gropp void PLogFlops(int f) 45919b02663SBarry Smith 46019b02663SBarry Smith Notes: 46119b02663SBarry Smith A global counter logs all PETSc flop counts. The user can use 46219b02663SBarry Smith PLogFlops() to increment this counter to include flops for the 46319b02663SBarry Smith application code. 46419b02663SBarry Smith 46519b02663SBarry Smith PETSc automatically logs library events if the code has been 466*3a40ed3dSBarry Smith compiled with -DUSE_PETSC_LOG (which is the default), and -log, 46719b02663SBarry Smith -log_summary, or -log_all are specified. PLogFlops() is 46819b02663SBarry Smith intended for logging user flops to supplement this PETSc 46919b02663SBarry Smith information. 47019b02663SBarry Smith 47119b02663SBarry Smith Example of Usage: 47235aab85fSBarry Smith $ int USER_EVENT; 473b045bd31SSatish Balay $ PLogEventRegister(&USER_EVENT,"User event","Color:"); 47419b02663SBarry Smith $ PLogEventBegin(USER_EVENT,0,0,0,0); 47519b02663SBarry Smith $ [code segment to monitor] 47619b02663SBarry Smith $ PLogFlops(user_flops) 47719b02663SBarry Smith $ PLogEventEnd(USER_EVENT,0,0,0,0); 47819b02663SBarry Smith 47958cd8a20SLois Curfman McInnes .seealso: PLogEventRegister(), PLogEventBegin(), PLogEventEnd(), PetscGetFlops() 48019b02663SBarry Smith 481edde42fcSLois Curfman McInnes .keywords: log, flops, floating point operations 48219b02663SBarry Smith M*/ 48319b02663SBarry Smith 48497bb86f7SLois Curfman McInnes 485d7a720efSLois Curfman McInnes /*MC 48619b02663SBarry Smith PLogEventBegin - Logs the beginning of a user event. 48797bb86f7SLois Curfman McInnes 48897bb86f7SLois Curfman McInnes Input Parameters: 48935aab85fSBarry Smith . e - integer associated with the event obtained from PLogEventRegister() 49097bb86f7SLois Curfman McInnes . o1,o2,o3,o4 - objects associated with the event, or 0 49197bb86f7SLois Curfman McInnes 49297bb86f7SLois Curfman McInnes Synopsis: 493682ac3c9SWilliam Gropp void PLogEventBegin(int e,PetscObject o1,PetscObject o2,PetscObject o3, 49497bb86f7SLois Curfman McInnes PetscObject o4) 49597bb86f7SLois Curfman McInnes 49697bb86f7SLois Curfman McInnes Notes: 49797bb86f7SLois Curfman McInnes You should also register each integer event with the command 49897bb86f7SLois Curfman McInnes PLogRegisterEvent(). The source code must be compiled with 499*3a40ed3dSBarry Smith -DUSE_PETSC_LOG, which is the default. 50097bb86f7SLois Curfman McInnes 50197bb86f7SLois Curfman McInnes PETSc automatically logs library events if the code has been 502*3a40ed3dSBarry Smith compiled with -DUSE_PETSC_LOG, and -log, -log_summary, or -log_all are 50397bb86f7SLois Curfman McInnes specified. PLogEventBegin() is intended for logging user events 50497bb86f7SLois Curfman McInnes to supplement this PETSc information. 50597bb86f7SLois Curfman McInnes 50697bb86f7SLois Curfman McInnes Example of Usage: 50735aab85fSBarry Smith $ int USER_EVENT; 5080eb211faSLois Curfman McInnes $ int user_event_flops; 509b045bd31SSatish Balay $ PLogEventRegister(&USER_EVENT,"User event","Color:"); 51035aab85fSBarry Smith $ PLogEventBegin(&USER_EVENT,0,0,0,0); 51197bb86f7SLois Curfman McInnes $ [code segment to monitor] 5120eb211faSLois Curfman McInnes $ PLogFlops(user_event_flops); 51335aab85fSBarry Smith $ PLogEventEnd(&USER_EVENT,0,0,0,0); 51497bb86f7SLois Curfman McInnes 51597bb86f7SLois Curfman McInnes .seealso: PLogEventRegister(), PLogEventEnd(), PLogFlops() 51697bb86f7SLois Curfman McInnes 51797bb86f7SLois Curfman McInnes .keywords: log, event, begin 51897bb86f7SLois Curfman McInnes M*/ 51997bb86f7SLois Curfman McInnes 520d7a720efSLois Curfman McInnes /*MC 52119b02663SBarry Smith PLogEventEnd - Log the end of a user event. 52297bb86f7SLois Curfman McInnes 52397bb86f7SLois Curfman McInnes Input Parameters: 52435aab85fSBarry Smith . e - integer associated with the event obtained with PLogEventRegister() 52597bb86f7SLois Curfman McInnes . o1,o2,o3,o4 - objects associated with the event, or 0 52697bb86f7SLois Curfman McInnes 52797bb86f7SLois Curfman McInnes Synopsis: 528682ac3c9SWilliam Gropp void PLogEventEnd(int e,PetscObject o1,PetscObject o2,PetscObject o3, 52997bb86f7SLois Curfman McInnes PetscObject o4) 53097bb86f7SLois Curfman McInnes 53197bb86f7SLois Curfman McInnes Notes: 532b951964fSBarry Smith You should also register each additional integer event with the command 53397bb86f7SLois Curfman McInnes PLogRegisterEvent(). Source code must be compiled with 534*3a40ed3dSBarry Smith -DUSE_PETSC_LOG, which is the default. 53597bb86f7SLois Curfman McInnes 53697bb86f7SLois Curfman McInnes PETSc automatically logs library events if the code has been 537*3a40ed3dSBarry Smith compiled with -DUSE_PETSC_LOG, and -log, -log_summary, or -log_all are 53897bb86f7SLois Curfman McInnes specified. PLogEventEnd() is intended for logging user events 53997bb86f7SLois Curfman McInnes to supplement this PETSc information. 54097bb86f7SLois Curfman McInnes 54197bb86f7SLois Curfman McInnes Example of Usage: 54235aab85fSBarry Smith $ int USER_EVENT; 5430eb211faSLois Curfman McInnes $ int user_event_flops; 544b045bd31SSatish Balay $ PLogEventRegister(&USER_EVENT,"User event","Color:"); 54597bb86f7SLois Curfman McInnes $ PLogEventBegin(USER_EVENT,0,0,0,0); 54697bb86f7SLois Curfman McInnes $ [code segment to monitor] 5470eb211faSLois Curfman McInnes $ PLogFlops(user_event_flops); 54897bb86f7SLois Curfman McInnes $ PLogEventEnd(USER_EVENT,0,0,0,0); 54997bb86f7SLois Curfman McInnes 55097bb86f7SLois Curfman McInnes .seealso: PLogEventRegister(), PLogEventBegin(), PLogFlops() 55197bb86f7SLois Curfman McInnes 55297bb86f7SLois Curfman McInnes .keywords: log, event, end 55397bb86f7SLois Curfman McInnes M*/ 55497bb86f7SLois Curfman McInnes 555005c665bSBarry Smith /*MC 556005c665bSBarry Smith PLogEventBarrierBegin - Logs the time in a barrier before an event. 557005c665bSBarry Smith 558005c665bSBarry Smith Input Parameters: 559005c665bSBarry Smith . e - integer associated with the event obtained from PLogEventRegister() 560005c665bSBarry Smith . o1,o2,o3,o4 - objects associated with the event, or 0 561005c665bSBarry Smith . comm - communicator the barrier takes place over 562005c665bSBarry Smith 563005c665bSBarry Smith Synopsis: 564005c665bSBarry Smith void PLogEventBarrierBegin(int e,PetscObject o1,PetscObject o2,PetscObject o3, 565005c665bSBarry Smith PetscObject o4,MPI_Comm comm) 566005c665bSBarry Smith 567005c665bSBarry Smith Notes: 568005c665bSBarry Smith This is for logging the amount of time spent in a barrier for an event 569005c665bSBarry Smith that requires synchronization. 570005c665bSBarry Smith 571005c665bSBarry Smith Example of Usage: 572005c665bSBarry Smith $ PLogEventBarrierBegin(VEC_NormBarrier,0,0,0,0,comm); 573005c665bSBarry Smith $ MPI_Allreduce() 574005c665bSBarry Smith $ PLogEventBarrierEnd(VEC_NormBarrier,0,0,0,0,comm); 575005c665bSBarry Smith 576005c665bSBarry Smith Additional Notes: 577005c665bSBarry Smith Synchronization events always come in pairs; for example, VEC_NormBarrier and 578005c665bSBarry Smith VEC_NormComm = VEC_NormBarrier + 1 579005c665bSBarry Smith 580005c665bSBarry Smith .seealso: PLogEventRegister(), PLogEventEnd(), PLogFlops(), PLogEventBegin(), 581005c665bSBarry Smith PLogEventBarrierEnd() 582005c665bSBarry Smith 583005c665bSBarry Smith .keywords: log, event, begin, barrier 584005c665bSBarry Smith M*/ 585005c665bSBarry Smith 586005c665bSBarry Smith /*MC 587005c665bSBarry Smith PLogEventBarrierEnd - Logs the time in a barrier before an event. 588005c665bSBarry Smith 589005c665bSBarry Smith Input Parameters: 590005c665bSBarry Smith . e - integer associated with the event obtained from PLogEventRegister() 591005c665bSBarry Smith . o1,o2,o3,o4 - objects associated with the event, or 0 592005c665bSBarry Smith . comm - communicator the barrier takes place over 593005c665bSBarry Smith 594005c665bSBarry Smith Synopsis: 595005c665bSBarry Smith void PLogEventBarrierEnd(int e,PetscObject o1,PetscObject o2,PetscObject o3, 596005c665bSBarry Smith PetscObject o4,MPI_Comm comm) 597005c665bSBarry Smith 598005c665bSBarry Smith Notes: 599005c665bSBarry Smith This is for logging the amount of time spent in a barrier for an event 600005c665bSBarry Smith that requires synchronization. 601005c665bSBarry Smith 602005c665bSBarry Smith Example of Usage: 603005c665bSBarry Smith $ PLogEventBarrierBegin(VEC_NormBarrier,0,0,0,0,comm); 604005c665bSBarry Smith $ MPI_Allreduce() 605005c665bSBarry Smith $ PLogEventBarrierEnd(VEC_NormBarrier,0,0,0,0,comm); 606005c665bSBarry Smith 607005c665bSBarry Smith Additional Notes: 608005c665bSBarry Smith Synchronization events always come in pairs; for example, VEC_NormBarrier and 609005c665bSBarry Smith VEC_NormComm = VEC_NormBarrier + 1 610005c665bSBarry Smith 611005c665bSBarry Smith .seealso: PLogEventRegister(), PLogEventEnd(), PLogFlops(), PLogEventBegin(), 612005c665bSBarry Smith PLogEventBarrierBegin() 613005c665bSBarry Smith 614005c665bSBarry Smith .keywords: log, event, begin, barrier 615005c665bSBarry Smith M*/ 616e0937024SBarry Smith 61797bb86f7SLois Curfman McInnes #endif 61841debaddSBarry Smith 61977c4ece6SBarry Smith 62077c4ece6SBarry Smith 62184cb2905SBarry Smith 62284cb2905SBarry Smith 62384cb2905SBarry Smith 624