1*88d459dfSBarry Smith /* $Id: petsclog.h,v 1.121 1998/05/05 03:09:56 bsmith Exp bsmith $ */ 297bb86f7SLois Curfman McInnes 397bb86f7SLois Curfman McInnes /* 47588ac45SBarry Smith Defines profile/logging in PETSc. 597bb86f7SLois Curfman McInnes */ 697bb86f7SLois Curfman McInnes 7*88d459dfSBarry Smith #if !defined(__PLOG_H) 8*88d459dfSBarry Smith #define __PLOG_H 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 1926cd32c0SSatish 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 57ca161407SBarry Smith #define MAT_Partitioning 36 5897bb86f7SLois Curfman McInnes 59005c665bSBarry Smith #define VEC_ScatterBarrier 39 604dcbc457SBarry Smith #define VEC_Dot 40 614dcbc457SBarry Smith #define VEC_Norm 41 624dcbc457SBarry Smith #define VEC_Max 42 634dcbc457SBarry Smith #define VEC_Min 43 644dcbc457SBarry Smith #define VEC_TDot 44 654dcbc457SBarry Smith #define VEC_Scale 45 664dcbc457SBarry Smith #define VEC_Copy 46 674dcbc457SBarry Smith #define VEC_Set 47 684dcbc457SBarry Smith #define VEC_AXPY 48 694dcbc457SBarry Smith #define VEC_AYPX 49 704dcbc457SBarry Smith #define VEC_Swap 50 714dcbc457SBarry Smith #define VEC_WAXPY 51 724dcbc457SBarry Smith #define VEC_AssemblyBegin 52 734dcbc457SBarry Smith #define VEC_AssemblyEnd 53 744dcbc457SBarry Smith #define VEC_MTDot 54 754dcbc457SBarry Smith #define VEC_MDot 55 764dcbc457SBarry Smith #define VEC_MAXPY 56 774dcbc457SBarry Smith #define VEC_PMult 57 784dcbc457SBarry Smith #define VEC_SetValues 58 794dcbc457SBarry Smith #define VEC_Load 59 804dcbc457SBarry Smith #define VEC_View 60 814dcbc457SBarry Smith #define VEC_ScatterBegin 61 824dcbc457SBarry Smith #define VEC_ScatterEnd 62 83bf5bf444SLois Curfman McInnes #define VEC_SetRandom 63 8497bb86f7SLois Curfman McInnes 85005c665bSBarry Smith #define VEC_NormBarrier 64 86005c665bSBarry Smith #define VEC_NormComm 65 87005c665bSBarry Smith #define VEC_DotBarrier 66 88005c665bSBarry Smith #define VEC_DotComm 67 89005c665bSBarry Smith #define VEC_MDotBarrier 68 90005c665bSBarry Smith #define VEC_MDotComm 69 91005c665bSBarry Smith 924dcbc457SBarry Smith #define SLES_Solve 70 934dcbc457SBarry Smith #define SLES_SetUp 71 9497bb86f7SLois Curfman McInnes 954dcbc457SBarry Smith #define KSP_GMRESOrthogonalization 72 9697bb86f7SLois Curfman McInnes 971bffabb2SLois Curfman McInnes #define PC_ModifySubMatrices 74 984dcbc457SBarry Smith #define PC_SetUp 75 9936058207SBarry Smith #define PC_SetUpOnBlocks 76 10032284f49SSatish Balay #define PC_Apply 77 101614700edSBarry Smith #define PC_ApplySymmetricLeft 78 102614700edSBarry Smith #define PC_ApplySymmetricRight 79 1034dcbc457SBarry Smith 1044dcbc457SBarry Smith #define SNES_Solve 80 1054dcbc457SBarry Smith #define SNES_LineSearch 81 1064dcbc457SBarry Smith #define SNES_FunctionEval 82 1074dcbc457SBarry Smith #define SNES_JacobianEval 83 1084dcbc457SBarry Smith #define SNES_MinimizationFunctionEval 84 1094dcbc457SBarry Smith #define SNES_GradientEval 85 1104dcbc457SBarry Smith #define SNES_HessianEval 86 1114dcbc457SBarry Smith 112682d7d0cSBarry Smith #define TS_Step 90 113bf343e40SBarry Smith #define TS_PseudoComputeTimeStep 91 11472936c9dSBarry Smith 11572936c9dSBarry Smith #define Petsc_Barrier 100 11655206aebSLois Curfman McInnes 1170513a670SBarry Smith #define EC_SetUp 105 1180513a670SBarry Smith #define EC_Solve 106 1190513a670SBarry Smith 12055206aebSLois Curfman McInnes #define DFVec_RefineVector 110 12155206aebSLois Curfman McInnes #define DFVec_AssembleFullVector 111 12255206aebSLois Curfman McInnes #define DFVec_GetComponentVectors 112 12355206aebSLois Curfman McInnes #define DFVec_DrawContours 113 12455206aebSLois Curfman McInnes 12541debaddSBarry Smith /* 126b3b1b5bfSLois Curfman McInnes Event numbers PLOG_USER_EVENT_LOW to PLOG_USER_EVENT_HIGH are reserved 12777c4ece6SBarry Smith for applications. Make sure that src/plog/src/plog.c defines enough 128b3b1b5bfSLois Curfman McInnes entries in (*name)[] to go up to PLOG_USER_EVENT_HIGH. 12941debaddSBarry Smith */ 13035aab85fSBarry Smith #define PLOG_USER_EVENT_LOW_STATIC 120 1314dcbc457SBarry Smith #define PLOG_USER_EVENT_HIGH 200 13297bb86f7SLois Curfman McInnes 13319b02663SBarry Smith /* Global flop counter */ 13447794344SBarry Smith extern PLogDouble _TotalFlops; 13519b02663SBarry Smith 136edde42fcSLois Curfman McInnes /* General logging of information; different from event logging */ 13794a424c1SBarry Smith extern int PLogInfo(void*,char*,...); 138cfd8f56bSLois Curfman McInnes extern int PLogInfoDeactivateClass(int); 139614700edSBarry Smith extern int PLogInfoActivateClass(int); 14043a90d84SBarry Smith extern int PLogPrintInfo; /* if 1, indicates PLogInfo() is turned on */ 141614700edSBarry Smith 1423a40ed3dSBarry Smith #if defined(USE_PETSC_LOG) /* --- Logging is turned on --------------------------------*/ 143614700edSBarry Smith 144da63de55SLois Curfman McInnes /* 145da63de55SLois Curfman McInnes Flop counting: We count each arithmetic operation (e.g., addition, multiplication) separately. 146da63de55SLois Curfman McInnes 147da63de55SLois Curfman McInnes For the complex numbers version, note that 148da63de55SLois Curfman McInnes 1 complex addition = 2 flops 149da63de55SLois Curfman McInnes 1 complex multiplication = 6 flops, 150da63de55SLois Curfman McInnes where we define 1 flop as that for a double precision scalar. We roughly approximate 151da63de55SLois Curfman McInnes flop counting for complex numbers by multiplying the total flops by 4; this corresponds 152da63de55SLois Curfman McInnes to the assumption that we're counting mostly additions and multiplications -- and 153da63de55SLois Curfman McInnes roughly the same number of each. More accurate counting could be done by distinguishing 154da63de55SLois Curfman McInnes among the various arithmetic operations. 155da63de55SLois Curfman McInnes */ 156da63de55SLois Curfman McInnes 1573a40ed3dSBarry Smith #if defined(USE_PETSC_COMPLEX) 158da63de55SLois Curfman McInnes #define PLogFlops(n) {_TotalFlops += (4*n);} 159da63de55SLois Curfman McInnes #else 160a2ce50c7SBarry Smith #define PLogFlops(n) {_TotalFlops += (n);} 161da63de55SLois Curfman McInnes #endif 16277c4ece6SBarry Smith 16377c4ece6SBarry Smith #if defined (HAVE_MPE) 16477c4ece6SBarry Smith #include "mpe.h" 165614700edSBarry Smith #define MPEBEGIN 1000 166cf256101SBarry Smith extern int PLogMPEBegin(void); 16777c4ece6SBarry Smith extern int PLogMPEDump(char *); 168614700edSBarry Smith extern int UseMPE,PLogEventMPEFlags[]; 169614700edSBarry Smith extern int PLogEventMPEActivate(int); 170905e6a2fSBarry Smith extern int PLogEventMPEDeactivate(int); 171614700edSBarry Smith #else 172c74530a3SSatish Balay #define PLogEventMPEActivate(a) 0 173c74530a3SSatish Balay #define PLogEventMPEDeactivate(a) 0 17477c4ece6SBarry Smith #endif 17577c4ece6SBarry Smith 176614700edSBarry Smith extern int PLogEventActivate(int); 177905e6a2fSBarry Smith extern int PLogEventDeactivate(int); 178614700edSBarry Smith 1793e584e2eSBarry Smith extern int PLogEventActivateClass(int); 1803e584e2eSBarry Smith extern int PLogEventDeactivateClass(int); 181614700edSBarry Smith 182614700edSBarry Smith extern int PLogEventFlags[]; 183b3bbe94bSBarry Smith extern int (*_PLogPLB)(int,int,PetscObject,PetscObject,PetscObject,PetscObject); 184b3bbe94bSBarry Smith extern int (*_PLogPLE)(int,int,PetscObject,PetscObject,PetscObject,PetscObject); 185b3bbe94bSBarry Smith extern int (*_PLogPHC)(PetscObject); 186b3bbe94bSBarry Smith extern int (*_PLogPHD)(PetscObject); 18777c4ece6SBarry Smith 18877c4ece6SBarry Smith #if defined(HAVE_MPE) 189005c665bSBarry Smith #define PLogEventBarrierBegin(e,o1,o2,o3,o4,cm) \ 190005c665bSBarry Smith { \ 191005c665bSBarry Smith if (_PLogPLB && PLogEventFlags[e]) { \ 192005c665bSBarry Smith PLogEventBegin((e),o1,o2,o3,o4); \ 193005c665bSBarry Smith if (UseMPE && PLogEventMPEFlags[(e)])\ 194005c665bSBarry Smith MPE_Log_event(MPEBEGIN+2*(e),0,"");\ 195005c665bSBarry Smith MPI_Barrier(cm); \ 196005c665bSBarry Smith PLogEventEnd((e),o1,o2,o3,o4); \ 197005c665bSBarry Smith if (UseMPE && PLogEventMPEFlags[(e)])\ 198005c665bSBarry Smith MPE_Log_event(MPEBEGIN+2*((e)+1),0,"");\ 199005c665bSBarry Smith } \ 200005c665bSBarry Smith PLogEventBegin(e+1,o1,o2,o3,o4); \ 201005c665bSBarry Smith if (UseMPE && PLogEventMPEFlags[(e)+1])\ 202005c665bSBarry Smith MPE_Log_event(MPEBEGIN+2*((e)+1),0,"");\ 203005c665bSBarry Smith } 204a1b5d808SSatish Balay #define PLogEventBegin(e,o1,o2,o3,o4) \ 20556cd22aeSBarry Smith { \ 206005c665bSBarry Smith if (_PLogPLB && PLogEventFlags[(e)]) \ 207005c665bSBarry Smith (*_PLogPLB)((e),0,(PetscObject)(o1),(PetscObject)(o2),(PetscObject)(o3),(PetscObject)(o4));\ 208005c665bSBarry Smith if (UseMPE && PLogEventMPEFlags[(e)])\ 209005c665bSBarry Smith MPE_Log_event(MPEBEGIN+2*(e),0,"");\ 21077c4ece6SBarry Smith } 21177c4ece6SBarry Smith #else 212005c665bSBarry Smith #define PLogEventBarrierBegin(e,o1,o2,o3,o4,cm) \ 213005c665bSBarry Smith { \ 214005c665bSBarry Smith if (_PLogPLB && PLogEventFlags[(e)]) { \ 215005c665bSBarry Smith PLogEventBegin((e),o1,o2,o3,o4); \ 216005c665bSBarry Smith MPI_Barrier(cm); \ 217005c665bSBarry Smith PLogEventEnd((e),o1,o2,o3,o4); \ 218005c665bSBarry Smith } \ 219005c665bSBarry Smith PLogEventBegin((e)+1,o1,o2,o3,o4); \ 220005c665bSBarry Smith } 221a1b5d808SSatish Balay #define PLogEventBegin(e,o1,o2,o3,o4) \ 22256cd22aeSBarry Smith { \ 223005c665bSBarry Smith if (_PLogPLB && PLogEventFlags[(e)]) \ 224005c665bSBarry Smith (*_PLogPLB)((e),0,(PetscObject)(o1),(PetscObject)(o2),(PetscObject)(o3),(PetscObject)(o4));\ 22577c4ece6SBarry Smith } 22677c4ece6SBarry Smith #endif 22777c4ece6SBarry Smith 22877c4ece6SBarry Smith #if defined(HAVE_MPE) 229005c665bSBarry Smith #define PLogEventBarrierEnd(e,o1,o2,o3,o4,cm) {\ 230005c665bSBarry Smith if (_PLogPLE && PLogEventFlags[(e)+1]) \ 231005c665bSBarry Smith (*_PLogPLE)((e)+1,0,(PetscObject)(o1),(PetscObject)(o2),(PetscObject)(o3),(PetscObject)(o4));\ 232005c665bSBarry Smith if (UseMPE && PLogEventMPEFlags[(e)+1])\ 233005c665bSBarry Smith MPE_Log_event(MPEBEGIN+2*((e)+1)+1,0,"");\ 234005c665bSBarry Smith } 23577c4ece6SBarry Smith #define PLogEventEnd(e,o1,o2,o3,o4) {\ 236005c665bSBarry Smith if (_PLogPLE && PLogEventFlags[(e)]) \ 237005c665bSBarry Smith (*_PLogPLE)((e),0,(PetscObject)(o1),(PetscObject)(o2),(PetscObject)(o3),(PetscObject)(o4));\ 238005c665bSBarry Smith if (UseMPE && PLogEventMPEFlags[(e)])\ 239005c665bSBarry Smith MPE_Log_event(MPEBEGIN+2*(e)+1,0,"");\ 240a1b5d808SSatish Balay } 24177c4ece6SBarry Smith #else 242005c665bSBarry Smith #define PLogEventBarrierEnd(e,o1,o2,o3,o4,cm) {\ 243005c665bSBarry Smith if (_PLogPLE && PLogEventFlags[(e)+1]) \ 244005c665bSBarry Smith (*_PLogPLE)((e)+1,0,(PetscObject)(o1),(PetscObject)(o2),(PetscObject)(o3),(PetscObject)(o4));\ 245005c665bSBarry Smith } 24677c4ece6SBarry Smith #define PLogEventEnd(e,o1,o2,o3,o4) {\ 247005c665bSBarry Smith if (_PLogPLE && PLogEventFlags[(e)]) \ 248005c665bSBarry Smith (*_PLogPLE)((e),0,(PetscObject)(o1),(PetscObject)(o2),(PetscObject)(o3),(PetscObject)(o4));\ 249a1b5d808SSatish Balay } 25077c4ece6SBarry Smith #endif 25177c4ece6SBarry Smith 25277c4ece6SBarry Smith 2533a40ed3dSBarry Smith #define PLogObjectParent(p,c) if (c) {PetscValidHeader((PetscObject)(c)); \ 2543a40ed3dSBarry Smith PetscValidHeader((PetscObject)(p));\ 2553a40ed3dSBarry Smith ((PetscObject)(c))->parent = (PetscObject) (p);} 25677c4ece6SBarry Smith #define PLogObjectParents(p,n,d) {int _i; for ( _i=0; _i<n; _i++ ) \ 25777c4ece6SBarry Smith PLogObjectParent(p,(d)[_i]);} 258b3bbe94bSBarry Smith #define PLogObjectCreate(h) {if (_PLogPHC) (*_PLogPHC)((PetscObject)h);} 259b3bbe94bSBarry Smith #define PLogObjectDestroy(h) {if (_PLogPHD) (*_PLogPHD)((PetscObject)h);} 26077c4ece6SBarry Smith #define PLogObjectMemory(p,m) {PetscValidHeader((PetscObject)p);\ 26177c4ece6SBarry Smith ((PetscObject)(p))->mem += (m);} 26277c4ece6SBarry Smith extern int PLogObjectState(PetscObject,char *,...); 263cf256101SBarry Smith extern int PLogDestroy(void); 26477c4ece6SBarry Smith extern int PLogStagePush(int); 2651d508c8cSSatish Balay extern int PLogStagePop(void); 26677c4ece6SBarry Smith extern int PLogStageRegister(int,char*); 2673044e3d5SSatish Balay extern int PLogPrintSummary(MPI_Comm,char *); 2681d508c8cSSatish Balay extern int PLogBegin(void); 269bc1211c7SBarry Smith extern int PLogTraceBegin(FILE *); 2701d508c8cSSatish Balay extern int PLogAllBegin(void); 271bc1211c7SBarry Smith extern int PLogSet(int (*)(int,int,PetscObject,PetscObject,PetscObject,PetscObject), 272bc1211c7SBarry Smith int (*)(int,int,PetscObject,PetscObject,PetscObject,PetscObject)); 273edde42fcSLois Curfman McInnes extern int PLogDump(char*); 274edde42fcSLois Curfman McInnes extern int PLogEventRegister(int*,char*,char*); 27599de4ba8SSatish Balay extern int PetscGetFlops(PLogDouble*); 27677c4ece6SBarry Smith 27747794344SBarry Smith extern PLogDouble irecv_ct, isend_ct, wait_ct, wait_any_ct, recv_ct, send_ct; 27847794344SBarry Smith extern PLogDouble irecv_len, isend_len, recv_len, send_len; 27947794344SBarry Smith extern PLogDouble wait_all_ct,allreduce_ct,sum_of_waits_ct; 280ca161407SBarry Smith extern int PETSC_DUMMY,PETSC_DUMMY_SIZE; 281ca161407SBarry Smith 282ce85283eSBarry Smith /* 28384cb2905SBarry Smith This does not work for MPI-Uni because our src/mpiuni/mpi.h file 284ce85283eSBarry Smith uses macros to defined the MPI operations. 28515308354SBarry Smith 28615308354SBarry Smith It does not work correctly from HP-UX because it processes the 287bb4af37aSBarry Smith macros in a way that sometimes it double counts, hence 288bb4af37aSBarry Smith HAVE_BROKEN_RECURSIVE_MACRO 2897c1e34a4SSatish Balay 2907c1e34a4SSatish Balay It does not work with Windows NT because winmpich lacks MPI_Type_size() 291ce85283eSBarry Smith */ 292bb4af37aSBarry Smith #if !defined(PETSC_USING_MPIUNI) && !defined(HAVE_BROKEN_RECURSIVE_MACRO) 29377a39924SBarry Smith /* 29477a39924SBarry Smith Logging of MPI activities 29577a39924SBarry Smith */ 29677a39924SBarry Smith 29777a39924SBarry Smith #define TypeSize(buff,count,type) \ 298ca161407SBarry Smith ( \ 299ca161407SBarry Smith MPI_Type_size(type,&PETSC_DUMMY_SIZE), buff += ((PLogDouble) ((count)*PETSC_DUMMY_SIZE)) \ 300ca161407SBarry Smith ) 30177a39924SBarry Smith 30277a39924SBarry Smith #define MPI_Irecv( buf, count, datatype, source, tag, comm, request) \ 303ca161407SBarry Smith ( \ 304ca161407SBarry Smith PETSC_DUMMY = MPI_Irecv( buf, count, datatype, source, tag, comm, request), \ 305ca161407SBarry Smith irecv_ct++, TypeSize(irecv_len,count,datatype),PETSC_DUMMY \ 306ca161407SBarry Smith ) 30715308354SBarry Smith 30877a39924SBarry Smith #define MPI_Isend( buf, count, datatype, dest, tag, comm, request) \ 309ca161407SBarry Smith ( \ 310ca161407SBarry Smith PETSC_DUMMY = MPI_Isend( buf, count, datatype, dest, tag, comm, request), \ 311ca161407SBarry Smith isend_ct++, TypeSize(isend_len,count,datatype),PETSC_DUMMY \ 312ca161407SBarry Smith ) 31315308354SBarry Smith 3140d4b0b6cSBarry Smith #define MPI_Startall_irecv( count,number,requests) \ 315ca161407SBarry Smith ( \ 316ca161407SBarry Smith PETSC_DUMMY = MPI_Startall( number, requests), \ 317ca161407SBarry Smith irecv_ct += (PLogDouble)(number), irecv_len += ((PLogDouble) (count*sizeof(Scalar))),PETSC_DUMMY \ 318ca161407SBarry Smith ) 3190d4b0b6cSBarry Smith 3200d4b0b6cSBarry Smith #define MPI_Startall_isend( count,number,requests) \ 321ca161407SBarry Smith ( \ 322ca161407SBarry Smith PETSC_DUMMY = MPI_Startall( number, requests), \ 323ca161407SBarry Smith isend_ct += (PLogDouble)(number), isend_len += ((PLogDouble) (count*sizeof(Scalar))),PETSC_DUMMY \ 324ca161407SBarry Smith ) 3250d4b0b6cSBarry Smith 3260d4b0b6cSBarry Smith #define MPI_Start_isend(count, requests)\ 327ca161407SBarry Smith (\ 328ca161407SBarry Smith PETSC_DUMMY = MPI_Start( requests),\ 329ca161407SBarry Smith isend_ct++, isend_len += ((PLogDouble) (count*sizeof(Scalar))),PETSC_DUMMY\ 330ca161407SBarry Smith ) 3310d4b0b6cSBarry Smith 332ce85283eSBarry Smith #define MPI_Recv( buf, count, datatype, source, tag, comm, status) \ 333ca161407SBarry Smith ( \ 334ca161407SBarry Smith PETSC_DUMMY = MPI_Recv( buf, count, datatype, source, tag, comm, status), \ 335ca161407SBarry Smith recv_ct++, TypeSize(recv_len,count,datatype), PETSC_DUMMY \ 336ca161407SBarry Smith ) 33715308354SBarry Smith 33877a39924SBarry Smith #define MPI_Send( buf, count, datatype, dest, tag, comm) \ 339ca161407SBarry Smith ( \ 340ca161407SBarry Smith PETSC_DUMMY = MPI_Send( buf, count, datatype, dest, tag, comm), \ 341ca161407SBarry Smith send_ct++, TypeSize(send_len,count,datatype),PETSC_DUMMY \ 342ca161407SBarry Smith ) 34377a39924SBarry Smith 34477a39924SBarry Smith #define MPI_Wait(request, status) \ 34577a39924SBarry Smith ( \ 346e0937024SBarry Smith wait_ct++, sum_of_waits_ct++, \ 34777a39924SBarry Smith MPI_Wait(request, status) \ 34877a39924SBarry Smith ) 34977a39924SBarry Smith 35077a39924SBarry Smith #define MPI_Waitany(a, b, c, d) \ 35177a39924SBarry Smith ( \ 352e0937024SBarry Smith wait_any_ct++, sum_of_waits_ct++, \ 35377a39924SBarry Smith MPI_Waitany(a, b, c, d) \ 35477a39924SBarry Smith ) 35577a39924SBarry Smith 35677a39924SBarry Smith #define MPI_Waitall(count, array_of_requests, array_of_statuses) \ 35777a39924SBarry Smith ( \ 35847794344SBarry Smith wait_all_ct++, sum_of_waits_ct += (PLogDouble) (count), \ 35977a39924SBarry Smith MPI_Waitall(count, array_of_requests, array_of_statuses) \ 36077a39924SBarry Smith ) 36177a39924SBarry Smith 36277a39924SBarry Smith #define MPI_Allreduce( sendbuf, recvbuf, count, datatype, op, comm) \ 363005c665bSBarry Smith (allreduce_ct++,MPI_Allreduce( sendbuf, recvbuf, count, datatype, op, comm)) 3643914022bSBarry Smith 3650d4b0b6cSBarry Smith #else 3660d4b0b6cSBarry Smith 3670d4b0b6cSBarry Smith #define MPI_Startall_irecv( count,number,requests) \ 368ca161407SBarry Smith ( \ 369ca161407SBarry Smith MPI_Startall( number, requests) \ 370ca161407SBarry Smith ) 3710d4b0b6cSBarry Smith 3720d4b0b6cSBarry Smith #define MPI_Startall_isend( count,number,requests) \ 373ca161407SBarry Smith ( \ 374ca161407SBarry Smith MPI_Startall( number, requests) \ 375ca161407SBarry Smith ) 3760d4b0b6cSBarry Smith 3770d4b0b6cSBarry Smith #define MPI_Start_isend(count, requests) \ 378ca161407SBarry Smith ( \ 379ca161407SBarry Smith MPI_Start( requests) \ 380ca161407SBarry Smith ) 3810d4b0b6cSBarry Smith 382bb4af37aSBarry Smith #endif /* ! PETSC_USING_MPIUNI && ! HAVE_BROKEN_RECURSIVE_MACRO */ 383614700edSBarry Smith 384df8cf0b5SBarry Smith #else /* ---Logging is turned off --------------------------------------------*/ 385614700edSBarry Smith 386614700edSBarry Smith #define PLogFlops(n) 387614700edSBarry Smith 388df8cf0b5SBarry Smith /* 389df8cf0b5SBarry Smith With logging turned off, then MPE has to be turned off 390df8cf0b5SBarry Smith */ 391614700edSBarry Smith #define MPEBEGIN 1000 392df8cf0b5SBarry Smith #define PLogMPEBegin() 393df8cf0b5SBarry Smith #define PLogMPEDump(a) 394bf343e40SBarry Smith #define PLogEventMPEActivate(a) 0 395bf343e40SBarry Smith #define PLogEventMPEDeactivate(a) 0 396614700edSBarry Smith 397bf343e40SBarry Smith #define PLogEventActivate(a) 0 398bf343e40SBarry Smith #define PLogEventDeactivate(a) 0 399614700edSBarry Smith 400bf343e40SBarry Smith #define PLogEventActivateClass(a) 0 401bf343e40SBarry Smith #define PLogEventDeactivateClass(a) 0 40277c4ece6SBarry Smith 403b3bbe94bSBarry Smith #define _PLogPLB 0 404b3bbe94bSBarry Smith #define _PLogPLE 0 405b3bbe94bSBarry Smith #define _PLogPHC 0 406b3bbe94bSBarry Smith #define _PLogPHD 0 40799de4ba8SSatish Balay #define PetscGetFlops(a) (*(a) = 0.0,0) 408d7a720efSLois Curfman McInnes #define PLogEventBegin(e,o1,o2,o3,o4) 409d7a720efSLois Curfman McInnes #define PLogEventEnd(e,o1,o2,o3,o4) 410005c665bSBarry Smith #define PLogEventBarrierBegin(e,o1,o2,o3,o4,cm) 411005c665bSBarry Smith #define PLogEventBarrierEnd(e,o1,o2,o3,o4,cm) 412d7a720efSLois Curfman McInnes #define PLogObjectParent(p,c) 413d7a720efSLois Curfman McInnes #define PLogObjectParents(p,n,c) 414d7a720efSLois Curfman McInnes #define PLogObjectCreate(h) 415d7a720efSLois Curfman McInnes #define PLogObjectDestroy(h) 416d7a720efSLois Curfman McInnes #define PLogObjectMemory(p,m) 417d7a720efSLois Curfman McInnes #define PLogDestroy() 418bf343e40SBarry Smith #define PLogStagePush(a) 419d7a720efSLois Curfman McInnes #define PLogStagePop() 420d7a720efSLois Curfman McInnes #define PLogStageRegister(a,b) 421d7a720efSLois Curfman McInnes #define PLogPrintSummary(comm,file) 422d7a720efSLois Curfman McInnes #define PLogBegin() 423974088aaSSatish Balay #define PLogTraceBegin(file) 0 424bc1211c7SBarry Smith #define PLogSet(lb,le) 425d7a720efSLois Curfman McInnes #define PLogAllBegin() 426d7a720efSLois Curfman McInnes #define PLogDump(char) 427dc4777aeSSatish Balay #define PLogEventRegister(a,b,c) 0 428d7a720efSLois Curfman McInnes #define PLogMPEBegin() 429d7a720efSLois Curfman McInnes #define PLogMPEDump(a) 4307f8359c1SLois Curfman McInnes extern int PLogObjectState(PetscObject,char *,...); 431ce6058e1SBarry Smith 4323a40ed3dSBarry Smith /* If USE_PETSC_LOG is NOT defined, these still need to be! */ 433ca161407SBarry Smith #define MPI_Startall_irecv( count,number,requests) MPI_Startall( number, requests) 434ce6058e1SBarry Smith 435ca161407SBarry Smith #define MPI_Startall_isend( count,number,requests) MPI_Startall( number, requests) 436ce6058e1SBarry Smith 437ca161407SBarry Smith #define MPI_Start_isend(count, requests) MPI_Start( requests) 438ca161407SBarry Smith 4393a40ed3dSBarry Smith #endif /* USE_PETSC_LOG */ 4406daaf66cSBarry Smith 4418b6d568bSLois Curfman McInnes /*MC 44219b02663SBarry Smith PLogFlops - Adds floating point operations to the global counter. 44319b02663SBarry Smith 44419b02663SBarry Smith Input Parameter: 44519b02663SBarry Smith . f - flop counter 44619b02663SBarry Smith 44719b02663SBarry Smith Synopsis: 448682ac3c9SWilliam Gropp void PLogFlops(int f) 44919b02663SBarry Smith 45019b02663SBarry Smith Notes: 45119b02663SBarry Smith A global counter logs all PETSc flop counts. The user can use 45219b02663SBarry Smith PLogFlops() to increment this counter to include flops for the 45319b02663SBarry Smith application code. 45419b02663SBarry Smith 45519b02663SBarry Smith PETSc automatically logs library events if the code has been 4563a40ed3dSBarry Smith compiled with -DUSE_PETSC_LOG (which is the default), and -log, 45719b02663SBarry Smith -log_summary, or -log_all are specified. PLogFlops() is 45819b02663SBarry Smith intended for logging user flops to supplement this PETSc 45919b02663SBarry Smith information. 46019b02663SBarry Smith 46119b02663SBarry Smith Example of Usage: 46235aab85fSBarry Smith $ int USER_EVENT; 463b045bd31SSatish Balay $ PLogEventRegister(&USER_EVENT,"User event","Color:"); 46419b02663SBarry Smith $ PLogEventBegin(USER_EVENT,0,0,0,0); 46519b02663SBarry Smith $ [code segment to monitor] 46619b02663SBarry Smith $ PLogFlops(user_flops) 46719b02663SBarry Smith $ PLogEventEnd(USER_EVENT,0,0,0,0); 46819b02663SBarry Smith 46958cd8a20SLois Curfman McInnes .seealso: PLogEventRegister(), PLogEventBegin(), PLogEventEnd(), PetscGetFlops() 47019b02663SBarry Smith 471edde42fcSLois Curfman McInnes .keywords: log, flops, floating point operations 47219b02663SBarry Smith M*/ 47319b02663SBarry Smith 47497bb86f7SLois Curfman McInnes 475d7a720efSLois Curfman McInnes /*MC 47619b02663SBarry Smith PLogEventBegin - Logs the beginning of a user event. 47797bb86f7SLois Curfman McInnes 47897bb86f7SLois Curfman McInnes Input Parameters: 47935aab85fSBarry Smith . e - integer associated with the event obtained from PLogEventRegister() 48097bb86f7SLois Curfman McInnes . o1,o2,o3,o4 - objects associated with the event, or 0 48197bb86f7SLois Curfman McInnes 48297bb86f7SLois Curfman McInnes Synopsis: 483682ac3c9SWilliam Gropp void PLogEventBegin(int e,PetscObject o1,PetscObject o2,PetscObject o3, 48497bb86f7SLois Curfman McInnes PetscObject o4) 48597bb86f7SLois Curfman McInnes 48697bb86f7SLois Curfman McInnes Notes: 48797bb86f7SLois Curfman McInnes You should also register each integer event with the command 48897bb86f7SLois Curfman McInnes PLogRegisterEvent(). The source code must be compiled with 4893a40ed3dSBarry Smith -DUSE_PETSC_LOG, which is the default. 49097bb86f7SLois Curfman McInnes 49197bb86f7SLois Curfman McInnes PETSc automatically logs library events if the code has been 4923a40ed3dSBarry Smith compiled with -DUSE_PETSC_LOG, and -log, -log_summary, or -log_all are 49397bb86f7SLois Curfman McInnes specified. PLogEventBegin() is intended for logging user events 49497bb86f7SLois Curfman McInnes to supplement this PETSc information. 49597bb86f7SLois Curfman McInnes 49697bb86f7SLois Curfman McInnes Example of Usage: 49735aab85fSBarry Smith $ int USER_EVENT; 4980eb211faSLois Curfman McInnes $ int user_event_flops; 499b045bd31SSatish Balay $ PLogEventRegister(&USER_EVENT,"User event","Color:"); 50035aab85fSBarry Smith $ PLogEventBegin(&USER_EVENT,0,0,0,0); 50197bb86f7SLois Curfman McInnes $ [code segment to monitor] 5020eb211faSLois Curfman McInnes $ PLogFlops(user_event_flops); 50335aab85fSBarry Smith $ PLogEventEnd(&USER_EVENT,0,0,0,0); 50497bb86f7SLois Curfman McInnes 50597bb86f7SLois Curfman McInnes .seealso: PLogEventRegister(), PLogEventEnd(), PLogFlops() 50697bb86f7SLois Curfman McInnes 50797bb86f7SLois Curfman McInnes .keywords: log, event, begin 50897bb86f7SLois Curfman McInnes M*/ 50997bb86f7SLois Curfman McInnes 510d7a720efSLois Curfman McInnes /*MC 51119b02663SBarry Smith PLogEventEnd - Log the end of a user event. 51297bb86f7SLois Curfman McInnes 51397bb86f7SLois Curfman McInnes Input Parameters: 51435aab85fSBarry Smith . e - integer associated with the event obtained with PLogEventRegister() 51597bb86f7SLois Curfman McInnes . o1,o2,o3,o4 - objects associated with the event, or 0 51697bb86f7SLois Curfman McInnes 51797bb86f7SLois Curfman McInnes Synopsis: 518682ac3c9SWilliam Gropp void PLogEventEnd(int e,PetscObject o1,PetscObject o2,PetscObject o3, 51997bb86f7SLois Curfman McInnes PetscObject o4) 52097bb86f7SLois Curfman McInnes 52197bb86f7SLois Curfman McInnes Notes: 522b951964fSBarry Smith You should also register each additional integer event with the command 52397bb86f7SLois Curfman McInnes PLogRegisterEvent(). Source code must be compiled with 5243a40ed3dSBarry Smith -DUSE_PETSC_LOG, which is the default. 52597bb86f7SLois Curfman McInnes 52697bb86f7SLois Curfman McInnes PETSc automatically logs library events if the code has been 5273a40ed3dSBarry Smith compiled with -DUSE_PETSC_LOG, and -log, -log_summary, or -log_all are 52897bb86f7SLois Curfman McInnes specified. PLogEventEnd() is intended for logging user events 52997bb86f7SLois Curfman McInnes to supplement this PETSc information. 53097bb86f7SLois Curfman McInnes 53197bb86f7SLois Curfman McInnes Example of Usage: 53235aab85fSBarry Smith $ int USER_EVENT; 5330eb211faSLois Curfman McInnes $ int user_event_flops; 534b045bd31SSatish Balay $ PLogEventRegister(&USER_EVENT,"User event","Color:"); 53597bb86f7SLois Curfman McInnes $ PLogEventBegin(USER_EVENT,0,0,0,0); 53697bb86f7SLois Curfman McInnes $ [code segment to monitor] 5370eb211faSLois Curfman McInnes $ PLogFlops(user_event_flops); 53897bb86f7SLois Curfman McInnes $ PLogEventEnd(USER_EVENT,0,0,0,0); 53997bb86f7SLois Curfman McInnes 54097bb86f7SLois Curfman McInnes .seealso: PLogEventRegister(), PLogEventBegin(), PLogFlops() 54197bb86f7SLois Curfman McInnes 54297bb86f7SLois Curfman McInnes .keywords: log, event, end 54397bb86f7SLois Curfman McInnes M*/ 54497bb86f7SLois Curfman McInnes 545005c665bSBarry Smith /*MC 546005c665bSBarry Smith PLogEventBarrierBegin - Logs the time in a barrier before an event. 547005c665bSBarry Smith 548005c665bSBarry Smith Input Parameters: 549005c665bSBarry Smith . e - integer associated with the event obtained from PLogEventRegister() 550005c665bSBarry Smith . o1,o2,o3,o4 - objects associated with the event, or 0 551005c665bSBarry Smith . comm - communicator the barrier takes place over 552005c665bSBarry Smith 553005c665bSBarry Smith Synopsis: 554005c665bSBarry Smith void PLogEventBarrierBegin(int e,PetscObject o1,PetscObject o2,PetscObject o3, 555005c665bSBarry Smith PetscObject o4,MPI_Comm comm) 556005c665bSBarry Smith 557005c665bSBarry Smith Notes: 558005c665bSBarry Smith This is for logging the amount of time spent in a barrier for an event 559005c665bSBarry Smith that requires synchronization. 560005c665bSBarry Smith 561005c665bSBarry Smith Example of Usage: 562005c665bSBarry Smith $ PLogEventBarrierBegin(VEC_NormBarrier,0,0,0,0,comm); 563005c665bSBarry Smith $ MPI_Allreduce() 564005c665bSBarry Smith $ PLogEventBarrierEnd(VEC_NormBarrier,0,0,0,0,comm); 565005c665bSBarry Smith 566005c665bSBarry Smith Additional Notes: 567005c665bSBarry Smith Synchronization events always come in pairs; for example, VEC_NormBarrier and 568005c665bSBarry Smith VEC_NormComm = VEC_NormBarrier + 1 569005c665bSBarry Smith 570005c665bSBarry Smith .seealso: PLogEventRegister(), PLogEventEnd(), PLogFlops(), PLogEventBegin(), 571005c665bSBarry Smith PLogEventBarrierEnd() 572005c665bSBarry Smith 573005c665bSBarry Smith .keywords: log, event, begin, barrier 574005c665bSBarry Smith M*/ 575005c665bSBarry Smith 576005c665bSBarry Smith /*MC 577005c665bSBarry Smith PLogEventBarrierEnd - Logs the time in a barrier before an event. 578005c665bSBarry Smith 579005c665bSBarry Smith Input Parameters: 580005c665bSBarry Smith . e - integer associated with the event obtained from PLogEventRegister() 581005c665bSBarry Smith . o1,o2,o3,o4 - objects associated with the event, or 0 582005c665bSBarry Smith . comm - communicator the barrier takes place over 583005c665bSBarry Smith 584005c665bSBarry Smith Synopsis: 585005c665bSBarry Smith void PLogEventBarrierEnd(int e,PetscObject o1,PetscObject o2,PetscObject o3, 586005c665bSBarry Smith PetscObject o4,MPI_Comm comm) 587005c665bSBarry Smith 588005c665bSBarry Smith Notes: 589005c665bSBarry Smith This is for logging the amount of time spent in a barrier for an event 590005c665bSBarry Smith that requires synchronization. 591005c665bSBarry Smith 592005c665bSBarry Smith Example of Usage: 593005c665bSBarry Smith $ PLogEventBarrierBegin(VEC_NormBarrier,0,0,0,0,comm); 594005c665bSBarry Smith $ MPI_Allreduce() 595005c665bSBarry Smith $ PLogEventBarrierEnd(VEC_NormBarrier,0,0,0,0,comm); 596005c665bSBarry Smith 597005c665bSBarry Smith Additional Notes: 598005c665bSBarry Smith Synchronization events always come in pairs; for example, VEC_NormBarrier and 599005c665bSBarry Smith VEC_NormComm = VEC_NormBarrier + 1 600005c665bSBarry Smith 601005c665bSBarry Smith .seealso: PLogEventRegister(), PLogEventEnd(), PLogFlops(), PLogEventBegin(), 602005c665bSBarry Smith PLogEventBarrierBegin() 603005c665bSBarry Smith 604005c665bSBarry Smith .keywords: log, event, begin, barrier 605005c665bSBarry Smith M*/ 606e0937024SBarry Smith 60797bb86f7SLois Curfman McInnes #endif 60841debaddSBarry Smith 60977c4ece6SBarry Smith 61077c4ece6SBarry Smith 61184cb2905SBarry Smith 61284cb2905SBarry Smith 61384cb2905SBarry Smith 614