197bb86f7SLois Curfman McInnes /* 27588ac45SBarry Smith Defines profile/logging in PETSc. 397bb86f7SLois Curfman McInnes */ 497bb86f7SLois Curfman McInnes 526bd1501SBarry Smith #if !defined(PETSCLOG_H) 626bd1501SBarry Smith #define PETSCLOG_H 7aaa7dc30SBarry Smith #include <petscsys.h> 8958c4211Shannah_mairs #include <petsctime.h> 9c8d78d4dSSatish Balay 10fa2bb9feSLisandro Dalcin /* General logging of information; different from event logging */ 113ca90d2dSJacob Faibussowitsch PETSC_EXTERN PetscErrorCode PetscInfo_Private(const char[],PetscObject,const char[],...) PETSC_ATTRIBUTE_FORMAT(3,4); 12fa2bb9feSLisandro Dalcin #if defined(PETSC_USE_INFO) 137d3de750SJacob Faibussowitsch #define PetscInfo(A,...) PetscInfo_Private(PETSC_FUNCTION_NAME,((PetscObject)A),__VA_ARGS__) 14fa2bb9feSLisandro Dalcin #else 157d3de750SJacob Faibussowitsch #define PetscInfo(A,...) 0 16fa2bb9feSLisandro Dalcin #endif 17e94e781bSJacob Faibussowitsch 187d3de750SJacob Faibussowitsch #define PetscInfo1(...) PETSC_DEPRECATED_MACRO("GCC warning \"Use PetscInfo() (since version 3.17)\"") PetscInfo(__VA_ARGS__) 197d3de750SJacob Faibussowitsch #define PetscInfo2(...) PETSC_DEPRECATED_MACRO("GCC warning \"Use PetscInfo() (since version 3.17)\"") PetscInfo(__VA_ARGS__) 205899db6dSLisandro Dalcin #define PetscInfo3(...) PETSC_DEPRECATED_MACRO("GCC warning \"Use PetscInfo() (since version 3.17)\"") PetscInfo(__VA_ARGS__) 217d3de750SJacob Faibussowitsch #define PetscInfo4(...) PETSC_DEPRECATED_MACRO("GCC warning \"Use PetscInfo() (since version 3.17)\"") PetscInfo(__VA_ARGS__) 227d3de750SJacob Faibussowitsch #define PetscInfo5(...) PETSC_DEPRECATED_MACRO("GCC warning \"Use PetscInfo() (since version 3.17)\"") PetscInfo(__VA_ARGS__) 237d3de750SJacob Faibussowitsch #define PetscInfo6(...) PETSC_DEPRECATED_MACRO("GCC warning \"Use PetscInfo() (since version 3.17)\"") PetscInfo(__VA_ARGS__) 247d3de750SJacob Faibussowitsch #define PetscInfo7(...) PETSC_DEPRECATED_MACRO("GCC warning \"Use PetscInfo() (since version 3.17)\"") PetscInfo(__VA_ARGS__) 257d3de750SJacob Faibussowitsch #define PetscInfo8(...) PETSC_DEPRECATED_MACRO("GCC warning \"Use PetscInfo() (since version 3.17)\"") PetscInfo(__VA_ARGS__) 267d3de750SJacob Faibussowitsch #define PetscInfo9(...) PETSC_DEPRECATED_MACRO("GCC warning \"Use PetscInfo() (since version 3.17)\"") PetscInfo(__VA_ARGS__) 277d3de750SJacob Faibussowitsch 28e94e781bSJacob Faibussowitsch /*E 29e94e781bSJacob Faibussowitsch PetscInfoCommFlag - Describes the method by which to filter PetscInfo() by communicator size 30e94e781bSJacob Faibussowitsch 31e94e781bSJacob Faibussowitsch Used as an input for PetscInfoSetFilterCommSelf() 32e94e781bSJacob Faibussowitsch 33e94e781bSJacob Faibussowitsch $ PETSC_INFO_COMM_ALL - Default uninitialized value. PetscInfo() will not filter based on communicator size (i.e. will 34e94e781bSJacob Faibussowitsch print for all communicators) 35e94e781bSJacob Faibussowitsch $ PETSC_INFO_COMM_NO_SELF - PetscInfo() will NOT print for communicators with size = 1 (i.e. *_COMM_SELF) 36e94e781bSJacob Faibussowitsch $ PETSC_INFO_COMM_ONLY_SELF - PetscInfo will ONLY print for communicators with size = 1 37e94e781bSJacob Faibussowitsch 38e94e781bSJacob Faibussowitsch Level: intermediate 39e94e781bSJacob Faibussowitsch 40e94e781bSJacob Faibussowitsch .seealso: PetscInfo(), PetscInfoSetFromOptions(), PetscInfoSetFilterCommSelf() 41e94e781bSJacob Faibussowitsch E*/ 42e94e781bSJacob Faibussowitsch typedef enum { 43e94e781bSJacob Faibussowitsch PETSC_INFO_COMM_ALL = -1, 44e94e781bSJacob Faibussowitsch PETSC_INFO_COMM_NO_SELF = 0, 45e94e781bSJacob Faibussowitsch PETSC_INFO_COMM_ONLY_SELF = 1 46e94e781bSJacob Faibussowitsch } PetscInfoCommFlag; 47e94e781bSJacob Faibussowitsch 48e94e781bSJacob Faibussowitsch PETSC_EXTERN const char * const PetscInfoCommFlags[]; 49fa2bb9feSLisandro Dalcin PETSC_EXTERN PetscErrorCode PetscInfoDeactivateClass(PetscClassId); 50fa2bb9feSLisandro Dalcin PETSC_EXTERN PetscErrorCode PetscInfoActivateClass(PetscClassId); 51e94e781bSJacob Faibussowitsch PETSC_EXTERN PetscErrorCode PetscInfoEnabled(PetscClassId, PetscBool *); 52e94e781bSJacob Faibussowitsch PETSC_EXTERN PetscErrorCode PetscInfoAllow(PetscBool); 53e94e781bSJacob Faibussowitsch PETSC_EXTERN PetscErrorCode PetscInfoSetFile(const char[],const char[]); 54e94e781bSJacob Faibussowitsch PETSC_EXTERN PetscErrorCode PetscInfoGetFile(char **,FILE **); 55e94e781bSJacob Faibussowitsch PETSC_EXTERN PetscErrorCode PetscInfoSetClasses(PetscBool,PetscInt,const char *const *); 56e94e781bSJacob Faibussowitsch PETSC_EXTERN PetscErrorCode PetscInfoGetClass(const char *, PetscBool *); 57e94e781bSJacob Faibussowitsch PETSC_EXTERN PetscErrorCode PetscInfoGetInfo(PetscBool *,PetscBool *,PetscBool *,PetscBool *,PetscInfoCommFlag *); 58e94e781bSJacob Faibussowitsch PETSC_EXTERN PetscErrorCode PetscInfoProcessClass(const char[],PetscInt,PetscClassId[]); 59e94e781bSJacob Faibussowitsch PETSC_EXTERN PetscErrorCode PetscInfoSetFilterCommSelf(PetscInfoCommFlag); 60e94e781bSJacob Faibussowitsch PETSC_EXTERN PetscErrorCode PetscInfoSetFromOptions(PetscOptions); 61e94e781bSJacob Faibussowitsch PETSC_EXTERN PetscErrorCode PetscInfoDestroy(void); 62fa2bb9feSLisandro Dalcin PETSC_EXTERN PetscBool PetscLogPrintInfo; /* if true, indicates PetscInfo() is turned on */ 63fa2bb9feSLisandro Dalcin 64b859824cSBarry Smith /*MC 65b859824cSBarry Smith PetscLogEvent - id used to identify PETSc or user events which timed portions (blocks of executable) 66b859824cSBarry Smith code. 67b859824cSBarry Smith 68b859824cSBarry Smith Level: intermediate 69b859824cSBarry Smith 70b859824cSBarry Smith .seealso: PetscLogEventRegister(), PetscLogEventBegin(), PetscLogEventEnd(), PetscLogStage 71b859824cSBarry Smith M*/ 72b859824cSBarry Smith typedef int PetscLogEvent; 73b859824cSBarry Smith 74b859824cSBarry Smith /*MC 75b859824cSBarry Smith PetscLogStage - id used to identify user stages (phases, sections) of runs - for logging 76b859824cSBarry Smith 77b859824cSBarry Smith Level: intermediate 78b859824cSBarry Smith 79522ce795SJed Brown .seealso: PetscLogStageRegister(), PetscLogStagePush(), PetscLogStagePop(), PetscLogEvent 80b859824cSBarry Smith M*/ 81b859824cSBarry Smith typedef int PetscLogStage; 82b859824cSBarry Smith 838ba1e511SMatthew Knepley #define PETSC_EVENT 1311311 84014dd563SJed Brown PETSC_EXTERN PetscLogEvent PETSC_LARGEST_EVENT; 8597bb86f7SLois Curfman McInnes 8619b02663SBarry Smith /* Global flop counter */ 87014dd563SJed Brown PETSC_EXTERN PetscLogDouble petsc_TotalFlops; 88014dd563SJed Brown PETSC_EXTERN PetscLogDouble petsc_tmp_flops; 8919b02663SBarry Smith 9031d06abdSBarry Smith /* We must make the following structures available to access the event 9131d06abdSBarry Smith activation flags in the PetscLogEventBegin/End() macros. These are not part of the PETSc public 9231d06abdSBarry Smith API and are not intended to be used by other parts of PETSc or by users. 93d49d4b11SBarry Smith 94fa2bb9feSLisandro Dalcin The code that manipulates these structures is in src/sys/logging/utils. 9531d06abdSBarry Smith */ 96aa213bdcSJed Brown typedef struct _n_PetscIntStack *PetscIntStack; 976a6a9b46SSatish Balay 98217044c2SLisandro Dalcin /* -----------------------------------------------------------------------------------------------------*/ 99c60ec953SBarry Smith /* 100aa213bdcSJed Brown PetscClassRegInfo, PetscClassPerfInfo - Each class has two data structures associated with it. The first has 101c60ec953SBarry Smith static information about it, the second collects statistics on how many objects of the class are created, 102c60ec953SBarry Smith how much memory they use, etc. 103c60ec953SBarry Smith 104aa213bdcSJed Brown PetscClassRegLog, PetscClassPerfLog - arrays of the PetscClassRegInfo and PetscClassPerfInfo for all classes. 105c60ec953SBarry Smith */ 1066a6a9b46SSatish Balay typedef struct { 107c60ec953SBarry Smith char *name; /* The class name */ 108c60ec953SBarry Smith PetscClassId classid; /* The integer identifying this class */ 109aa213bdcSJed Brown } PetscClassRegInfo; 1106a6a9b46SSatish Balay 1116a6a9b46SSatish Balay typedef struct { 1120700a824SBarry Smith PetscClassId id; /* The integer identifying this class */ 1136a6a9b46SSatish Balay int creations; /* The number of objects of this class created */ 1146a6a9b46SSatish Balay int destructions; /* The number of objects of this class destroyed */ 1156a6a9b46SSatish Balay PetscLogDouble mem; /* The total memory allocated by objects of this class */ 1166a6a9b46SSatish Balay PetscLogDouble descMem; /* The total memory allocated by descendents of these objects */ 117aa213bdcSJed Brown } PetscClassPerfInfo; 1186a6a9b46SSatish Balay 119aa213bdcSJed Brown typedef struct _n_PetscClassRegLog *PetscClassRegLog; 120aa213bdcSJed Brown struct _n_PetscClassRegLog { 121c60ec953SBarry Smith int numClasses; /* The number of classes registered */ 122c60ec953SBarry Smith int maxClasses; /* The maximum number of classes */ 123aa213bdcSJed Brown PetscClassRegInfo *classInfo; /* The structure for class information (classids are monotonicly increasing) */ 124c60ec953SBarry Smith }; 1256a6a9b46SSatish Balay 126aa213bdcSJed Brown typedef struct _n_PetscClassPerfLog *PetscClassPerfLog; 127aa213bdcSJed Brown struct _n_PetscClassPerfLog { 128c60ec953SBarry Smith int numClasses; /* The number of logging classes */ 129c60ec953SBarry Smith int maxClasses; /* The maximum number of classes */ 130aa213bdcSJed Brown PetscClassPerfInfo *classInfo; /* The structure for class information (classids are monotonicly increasing) */ 131c60ec953SBarry Smith }; 132c60ec953SBarry Smith /* -----------------------------------------------------------------------------------------------------*/ 133c60ec953SBarry Smith /* 134aa213bdcSJed Brown PetscEventRegInfo, PetscEventPerfInfo - Each event has two data structures associated with it. The first has 135c60ec953SBarry Smith static information about it, the second collects statistics on how many times the event is used, how 136c60ec953SBarry Smith much time it takes, etc. 137c60ec953SBarry Smith 138aa213bdcSJed Brown PetscEventRegLog, PetscEventPerfLog - an array of all PetscEventRegInfo and PetscEventPerfInfo for all events. There is one 139c60ec953SBarry Smith of these for each stage. 140c60ec953SBarry Smith 141c60ec953SBarry Smith */ 1426a6a9b46SSatish Balay typedef struct { 1436a6a9b46SSatish Balay char *name; /* The name of this event */ 144c60ec953SBarry Smith PetscClassId classid; /* The class the event is associated with */ 145217044c2SLisandro Dalcin PetscBool collective; /* Flag this event as collective */ 1466a6a9b46SSatish Balay #if defined (PETSC_HAVE_MPE) 1476a6a9b46SSatish Balay int mpe_id_begin; /* MPE IDs that define the event */ 1486a6a9b46SSatish Balay int mpe_id_end; 1496a6a9b46SSatish Balay #endif 150aa213bdcSJed Brown } PetscEventRegInfo; 1516a6a9b46SSatish Balay 152c60ec953SBarry Smith typedef struct { 153c60ec953SBarry Smith int id; /* The integer identifying this event */ 154ace3abfcSBarry Smith PetscBool active; /* The flag to activate logging */ 155ace3abfcSBarry Smith PetscBool visible; /* The flag to print info in summary */ 156c60ec953SBarry Smith int depth; /* The nesting depth of the event call */ 157c60ec953SBarry Smith int count; /* The number of times this event was executed */ 158a42e5b54SMatthew G Knepley PetscLogDouble flops, flops2, flopsTmp; /* The flops and flops^2 used in this event */ 159a42e5b54SMatthew G Knepley PetscLogDouble time, time2, timeTmp; /* The time and time^2 taken for this event */ 160217044c2SLisandro Dalcin PetscLogDouble syncTime; /* The synchronization barrier time */ 161891e75beSMatthew G. Knepley PetscLogDouble dof[8]; /* The number of degrees of freedom associated with this event */ 1625d68e14cSMatthew G. Knepley PetscLogDouble errors[8]; /* The errors (user-defined) associated with this event */ 163c60ec953SBarry Smith PetscLogDouble numMessages; /* The number of messages in this event */ 164c60ec953SBarry Smith PetscLogDouble messageLength; /* The total message lengths in this event */ 165c60ec953SBarry Smith PetscLogDouble numReductions; /* The number of reductions in this event */ 166e3ed9ee7SBarry Smith PetscLogDouble memIncrease; /* How much the resident memory has increased in this event */ 167e3ed9ee7SBarry Smith PetscLogDouble mallocIncrease;/* How much the maximum malloced space has increased in this event */ 168e3ed9ee7SBarry Smith PetscLogDouble mallocSpace; /* How much the space was malloced and kept during this event */ 169e3ed9ee7SBarry Smith PetscLogDouble mallocIncreaseEvent; /* Maximum of the high water mark with in event minus memory available at the end of the event */ 170091bc5acSJunchao Zhang #if defined(PETSC_HAVE_DEVICE) 171bec0b493Shannah_mairs PetscLogDouble CpuToGpuCount; /* The total number of CPU to GPU copies */ 172bec0b493Shannah_mairs PetscLogDouble GpuToCpuCount; /* The total number of GPU to CPU copies */ 173bec0b493Shannah_mairs PetscLogDouble CpuToGpuSize; /* The total size of CPU to GPU copies */ 174bec0b493Shannah_mairs PetscLogDouble GpuToCpuSize; /* The total size of GPU to CPU copies */ 175958c4211Shannah_mairs PetscLogDouble GpuFlops; /* The flops done on a GPU in this event */ 176958c4211Shannah_mairs PetscLogDouble GpuTime; /* The time spent on a GPU in this event */ 177bec0b493Shannah_mairs #endif 178aa213bdcSJed Brown } PetscEventPerfInfo; 179c60ec953SBarry Smith 180aa213bdcSJed Brown typedef struct _n_PetscEventRegLog *PetscEventRegLog; 181aa213bdcSJed Brown struct _n_PetscEventRegLog { 1826a6a9b46SSatish Balay int numEvents; /* The number of registered events */ 1836a6a9b46SSatish Balay int maxEvents; /* The maximum number of events */ 184aa213bdcSJed Brown PetscEventRegInfo *eventInfo; /* The registration information for each event */ 1856a6a9b46SSatish Balay }; 1866a6a9b46SSatish Balay 187aa213bdcSJed Brown typedef struct _n_PetscEventPerfLog *PetscEventPerfLog; 188aa213bdcSJed Brown struct _n_PetscEventPerfLog { 1896a6a9b46SSatish Balay int numEvents; /* The number of logging events */ 1906a6a9b46SSatish Balay int maxEvents; /* The maximum number of events */ 191aa213bdcSJed Brown PetscEventPerfInfo *eventInfo; /* The performance information for each event */ 1926a6a9b46SSatish Balay }; 193c60ec953SBarry Smith /* ------------------------------------------------------------------------------------------------------------*/ 194c60ec953SBarry Smith /* 195aa213bdcSJed Brown PetscStageInfo - Contains all the information about a particular stage. 1966a6a9b46SSatish Balay 197aa213bdcSJed Brown PetscStageLog - An array of PetscStageInfo for each registered stage. There is a single one of these in the code. 198c60ec953SBarry Smith */ 199aa213bdcSJed Brown typedef struct _PetscStageInfo { 2006a6a9b46SSatish Balay char *name; /* The stage name */ 201ace3abfcSBarry Smith PetscBool used; /* The stage was pushed on this processor */ 202aa213bdcSJed Brown PetscEventPerfInfo perfInfo; /* The stage performance information */ 203aa213bdcSJed Brown PetscEventPerfLog eventLog; /* The event information for this stage */ 204aa213bdcSJed Brown PetscClassPerfLog classLog; /* The class information for this stage */ 205aa213bdcSJed Brown } PetscStageInfo; 2066a6a9b46SSatish Balay 207aa213bdcSJed Brown typedef struct _n_PetscStageLog *PetscStageLog; 208aa213bdcSJed Brown struct _n_PetscStageLog { 2096a6a9b46SSatish Balay int numStages; /* The number of registered stages */ 2106a6a9b46SSatish Balay int maxStages; /* The maximum number of stages */ 211aa213bdcSJed Brown PetscIntStack stack; /* The stack for active stages */ 212aa213bdcSJed Brown int curStage; /* The current stage (only used in macros so we don't call PetscIntStackTop) */ 213aa213bdcSJed Brown PetscStageInfo *stageInfo; /* The information for each stage */ 214aa213bdcSJed Brown PetscEventRegLog eventLog; /* The registered events */ 215aa213bdcSJed Brown PetscClassRegLog classLog; /* The registered classes */ 2166a6a9b46SSatish Balay }; 217217044c2SLisandro Dalcin /* -----------------------------------------------------------------------------------------------------*/ 218fee518ebSJed Brown 2193bb1ff40SBarry Smith PETSC_EXTERN PetscErrorCode PetscLogObjectParent(PetscObject,PetscObject); 2203bb1ff40SBarry Smith PETSC_EXTERN PetscErrorCode PetscLogObjectMemory(PetscObject,PetscLogDouble); 2213bb1ff40SBarry Smith 222aa482453SBarry Smith #if defined(PETSC_USE_LOG) /* --- Logging is turned on --------------------------------*/ 223aeeda9f6SJohn Fettig PETSC_EXTERN PetscStageLog petsc_stageLog; 224f5d6ab90SLisandro Dalcin PETSC_EXTERN PetscErrorCode PetscLogGetStageLog(PetscStageLog*); 225f5d6ab90SLisandro Dalcin PETSC_EXTERN PetscErrorCode PetscStageLogGetCurrent(PetscStageLog,int*); 226f5d6ab90SLisandro Dalcin PETSC_EXTERN PetscErrorCode PetscStageLogGetEventPerfLog(PetscStageLog,int,PetscEventPerfLog*); 227614700edSBarry Smith 228da63de55SLois Curfman McInnes /* 229da63de55SLois Curfman McInnes Flop counting: We count each arithmetic operation (e.g., addition, multiplication) separately. 230da63de55SLois Curfman McInnes 231da63de55SLois Curfman McInnes For the complex numbers version, note that 232da63de55SLois Curfman McInnes 1 complex addition = 2 flops 233da63de55SLois Curfman McInnes 1 complex multiplication = 6 flops, 234da63de55SLois Curfman McInnes where we define 1 flop as that for a double precision scalar. We roughly approximate 235da63de55SLois Curfman McInnes flop counting for complex numbers by multiplying the total flops by 4; this corresponds 236da63de55SLois Curfman McInnes to the assumption that we're counting mostly additions and multiplications -- and 237da63de55SLois Curfman McInnes roughly the same number of each. More accurate counting could be done by distinguishing 238da63de55SLois Curfman McInnes among the various arithmetic operations. 239da63de55SLois Curfman McInnes */ 240da63de55SLois Curfman McInnes 241aa482453SBarry Smith #if defined(PETSC_USE_COMPLEX) 242542d4b3fSSatish Balay #define PETSC_FLOPS_PER_OP 4.0 243da63de55SLois Curfman McInnes #else 244542d4b3fSSatish Balay #define PETSC_FLOPS_PER_OP 1.0 245bf3909cdSBarry Smith #endif 246bf3909cdSBarry Smith 247f8bfbb56SSatish Balay /*@C 248ca0c957dSBarry Smith PetscLogFlops - Log how many flops are performed in a calculation 249ca0c957dSBarry Smith 250c3b874c4SJose E. Roman Input Parameter: 251c3b874c4SJose E. Roman . flops - the number of flops 252ca0c957dSBarry Smith 253ca0c957dSBarry Smith Notes: 254ca0c957dSBarry Smith To limit the chance of integer overflow when multiplying by a constant, represent the constant as a double, 255ca0c957dSBarry Smith not an integer. Use PetscLogFlops(4.0*n) not PetscLogFlops(4*n) 256ca0c957dSBarry Smith 257ca0c957dSBarry Smith Level: intermediate 258ca0c957dSBarry Smith 25968481988SMark .seealso: PetscLogView(), PetscLogGpuFlops() 260ca0c957dSBarry Smith @*/ 261ca0c957dSBarry Smith 2629fbee547SJacob Faibussowitsch static inline PetscErrorCode PetscLogFlops(PetscLogDouble n) 263dd19b90bSBarry Smith { 264dd19b90bSBarry Smith PetscFunctionBegin; 265bf3909cdSBarry Smith #if defined(PETSC_USE_DEBUG) 2662c71b3e2SJacob Faibussowitsch PetscCheck(n >= 0,PETSC_COMM_SELF,PETSC_ERR_ARG_OUTOFRANGE,"Cannot log negative flops"); 267da63de55SLois Curfman McInnes #endif 268dd19b90bSBarry Smith petsc_TotalFlops += PETSC_FLOPS_PER_OP*n; 269dd19b90bSBarry Smith PetscFunctionReturn(0); 270dd19b90bSBarry Smith } 271fa2bb9feSLisandro Dalcin 272fa2bb9feSLisandro Dalcin PETSC_EXTERN PetscErrorCode PetscGetFlops(PetscLogDouble *); 27377c4ece6SBarry Smith 274aa482453SBarry Smith #if defined (PETSC_HAVE_MPE) 275014dd563SJed Brown PETSC_EXTERN PetscErrorCode PetscLogMPEBegin(void); 276014dd563SJed Brown PETSC_EXTERN PetscErrorCode PetscLogMPEDump(const char[]); 27777c4ece6SBarry Smith #endif 27877c4ece6SBarry Smith 279014dd563SJed Brown PETSC_EXTERN PetscErrorCode (*PetscLogPLB)(PetscLogEvent,int,PetscObject,PetscObject,PetscObject,PetscObject); 280014dd563SJed Brown PETSC_EXTERN PetscErrorCode (*PetscLogPLE)(PetscLogEvent,int,PetscObject,PetscObject,PetscObject,PetscObject); 281014dd563SJed Brown PETSC_EXTERN PetscErrorCode (*PetscLogPHC)(PetscObject); 282014dd563SJed Brown PETSC_EXTERN PetscErrorCode (*PetscLogPHD)(PetscObject); 28377c4ece6SBarry Smith 284*5f80ce2aSJacob Faibussowitsch #define PetscLogObjectParents(p,n,d) 0;do{for (int _i=0; _i<(n); ++_i) CHKERRQ(PetscLogObjectParent((PetscObject)(p),(PetscObject)(d)[_i]));}while (0) 285fa2bb9feSLisandro Dalcin #define PetscLogObjectCreate(h) ((PetscLogPHC) ? (*PetscLogPHC)((PetscObject)(h)) : 0) 286fa2bb9feSLisandro Dalcin #define PetscLogObjectDestroy(h) ((PetscLogPHD) ? (*PetscLogPHD)((PetscObject)(h)) : 0) 2873ca90d2dSJacob Faibussowitsch PETSC_EXTERN PetscErrorCode PetscLogObjectState(PetscObject, const char[], ...) PETSC_ATTRIBUTE_FORMAT(2,3); 288fa2bb9feSLisandro Dalcin 2898ba1e511SMatthew Knepley /* Initialization functions */ 290bb1d7374SBarry Smith PETSC_EXTERN PetscErrorCode PetscLogDefaultBegin(void); 291014dd563SJed Brown PETSC_EXTERN PetscErrorCode PetscLogAllBegin(void); 292bb1d7374SBarry Smith PETSC_EXTERN PetscErrorCode PetscLogNestedBegin(void); 293014dd563SJed Brown PETSC_EXTERN PetscErrorCode PetscLogTraceBegin(FILE *); 294014dd563SJed Brown PETSC_EXTERN PetscErrorCode PetscLogActions(PetscBool); 295014dd563SJed Brown PETSC_EXTERN PetscErrorCode PetscLogObjects(PetscBool); 296fa2bb9feSLisandro Dalcin PETSC_EXTERN PetscErrorCode PetscLogSetThreshold(PetscLogDouble,PetscLogDouble*); 297014dd563SJed Brown PETSC_EXTERN PetscErrorCode PetscLogSet(PetscErrorCode (*)(int, int, PetscObject, PetscObject, PetscObject, PetscObject), 2986849ba73SBarry Smith PetscErrorCode (*)(int, int, PetscObject, PetscObject, PetscObject, PetscObject)); 299fa2bb9feSLisandro Dalcin 3008ba1e511SMatthew Knepley /* Output functions */ 301014dd563SJed Brown PETSC_EXTERN PetscErrorCode PetscLogView(PetscViewer); 302f14045dbSBarry Smith PETSC_EXTERN PetscErrorCode PetscLogViewFromOptions(void); 303014dd563SJed Brown PETSC_EXTERN PetscErrorCode PetscLogDump(const char[]); 30431d06abdSBarry Smith 3054dd65854SConnor Ward /* Status checking functions */ 3064dd65854SConnor Ward PETSC_EXTERN PetscErrorCode PetscLogIsActive(PetscBool*); 3074dd65854SConnor Ward 308fa2bb9feSLisandro Dalcin /* Stage functions */ 309014dd563SJed Brown PETSC_EXTERN PetscErrorCode PetscLogStageRegister(const char[],PetscLogStage*); 310014dd563SJed Brown PETSC_EXTERN PetscErrorCode PetscLogStagePush(PetscLogStage); 311014dd563SJed Brown PETSC_EXTERN PetscErrorCode PetscLogStagePop(void); 312014dd563SJed Brown PETSC_EXTERN PetscErrorCode PetscLogStageSetActive(PetscLogStage,PetscBool); 313014dd563SJed Brown PETSC_EXTERN PetscErrorCode PetscLogStageGetActive(PetscLogStage,PetscBool*); 314014dd563SJed Brown PETSC_EXTERN PetscErrorCode PetscLogStageSetVisible(PetscLogStage,PetscBool); 315014dd563SJed Brown PETSC_EXTERN PetscErrorCode PetscLogStageGetVisible(PetscLogStage,PetscBool*); 316014dd563SJed Brown PETSC_EXTERN PetscErrorCode PetscLogStageGetId(const char[],PetscLogStage*); 317f5d6ab90SLisandro Dalcin 3188ba1e511SMatthew Knepley /* Event functions */ 319014dd563SJed Brown PETSC_EXTERN PetscErrorCode PetscLogEventRegister(const char[],PetscClassId,PetscLogEvent*); 320217044c2SLisandro Dalcin PETSC_EXTERN PetscErrorCode PetscLogEventSetCollective(PetscLogEvent,PetscBool); 321fa2bb9feSLisandro Dalcin PETSC_EXTERN PetscErrorCode PetscLogEventIncludeClass(PetscClassId); 322fa2bb9feSLisandro Dalcin PETSC_EXTERN PetscErrorCode PetscLogEventExcludeClass(PetscClassId); 323014dd563SJed Brown PETSC_EXTERN PetscErrorCode PetscLogEventActivate(PetscLogEvent); 324014dd563SJed Brown PETSC_EXTERN PetscErrorCode PetscLogEventDeactivate(PetscLogEvent); 325c00cb57fSBarry Smith PETSC_EXTERN PetscErrorCode PetscLogEventDeactivatePush(PetscLogEvent); 326c00cb57fSBarry Smith PETSC_EXTERN PetscErrorCode PetscLogEventDeactivatePop(PetscLogEvent); 327014dd563SJed Brown PETSC_EXTERN PetscErrorCode PetscLogEventSetActiveAll(PetscLogEvent,PetscBool); 328014dd563SJed Brown PETSC_EXTERN PetscErrorCode PetscLogEventActivateClass(PetscClassId); 329014dd563SJed Brown PETSC_EXTERN PetscErrorCode PetscLogEventDeactivateClass(PetscClassId); 3308c49a8d9SBarry Smith PETSC_EXTERN PetscErrorCode PetscLogEventGetId(const char[],PetscLogEvent*); 33113230571SMichael Lange PETSC_EXTERN PetscErrorCode PetscLogEventGetPerfInfo(int,PetscLogEvent,PetscEventPerfInfo*); 332891e75beSMatthew G. Knepley PETSC_EXTERN PetscErrorCode PetscLogEventSetDof(PetscLogEvent, PetscInt, PetscLogDouble); 3335d68e14cSMatthew G. Knepley PETSC_EXTERN PetscErrorCode PetscLogEventSetError(PetscLogEvent, PetscInt, PetscLogDouble); 3348ba1e511SMatthew Knepley 3358ba1e511SMatthew Knepley /* Global counters */ 336014dd563SJed Brown PETSC_EXTERN PetscLogDouble petsc_irecv_ct; 337014dd563SJed Brown PETSC_EXTERN PetscLogDouble petsc_isend_ct; 338014dd563SJed Brown PETSC_EXTERN PetscLogDouble petsc_recv_ct; 339014dd563SJed Brown PETSC_EXTERN PetscLogDouble petsc_send_ct; 340014dd563SJed Brown PETSC_EXTERN PetscLogDouble petsc_irecv_len; 341014dd563SJed Brown PETSC_EXTERN PetscLogDouble petsc_isend_len; 342014dd563SJed Brown PETSC_EXTERN PetscLogDouble petsc_recv_len; 343014dd563SJed Brown PETSC_EXTERN PetscLogDouble petsc_send_len; 344014dd563SJed Brown PETSC_EXTERN PetscLogDouble petsc_allreduce_ct; 345014dd563SJed Brown PETSC_EXTERN PetscLogDouble petsc_gather_ct; 346014dd563SJed Brown PETSC_EXTERN PetscLogDouble petsc_scatter_ct; 347014dd563SJed Brown PETSC_EXTERN PetscLogDouble petsc_wait_ct; 348014dd563SJed Brown PETSC_EXTERN PetscLogDouble petsc_wait_any_ct; 349014dd563SJed Brown PETSC_EXTERN PetscLogDouble petsc_wait_all_ct; 350014dd563SJed Brown PETSC_EXTERN PetscLogDouble petsc_sum_of_waits_ct; 3518ba1e511SMatthew Knepley 352e3ed9ee7SBarry Smith PETSC_EXTERN PetscBool PetscLogMemory; 353e3ed9ee7SBarry Smith 354fa2bb9feSLisandro Dalcin PETSC_EXTERN PetscBool PetscLogSyncOn; /* true if logging synchronization is enabled */ 35562872c28SLisandro Dalcin PETSC_EXTERN PetscErrorCode PetscLogEventSynchronize(PetscLogEvent, MPI_Comm); 35662872c28SLisandro Dalcin 35762872c28SLisandro Dalcin #define PetscLogEventSync(e,comm) \ 35862872c28SLisandro Dalcin (((PetscLogPLB && petsc_stageLog->stageInfo[petsc_stageLog->curStage].perfInfo.active && petsc_stageLog->stageInfo[petsc_stageLog->curStage].eventLog->eventInfo[e].active) ? \ 35962872c28SLisandro Dalcin PetscLogEventSynchronize((e),(comm)) : 0)) 36077c4ece6SBarry Smith 36152e6d16bSBarry Smith #define PetscLogEventBegin(e,o1,o2,o3,o4) \ 3628b5db460SBarry Smith (((PetscLogPLB && petsc_stageLog->stageInfo[petsc_stageLog->curStage].perfInfo.active && petsc_stageLog->stageInfo[petsc_stageLog->curStage].eventLog->eventInfo[e].active) ? \ 363495fc317SBarry Smith (*PetscLogPLB)((e),0,(PetscObject)(o1),(PetscObject)(o2),(PetscObject)(o3),(PetscObject)(o4)) : 0)) 364043328b6SSatish Balay 36552e6d16bSBarry Smith #define PetscLogEventEnd(e,o1,o2,o3,o4) \ 3668b5db460SBarry Smith (((PetscLogPLE && petsc_stageLog->stageInfo[petsc_stageLog->curStage].perfInfo.active && petsc_stageLog->stageInfo[petsc_stageLog->curStage].eventLog->eventInfo[e].active) ? \ 367495fc317SBarry Smith (*PetscLogPLE)((e),0,(PetscObject)(o1),(PetscObject)(o2),(PetscObject)(o3),(PetscObject)(o4)) : 0)) 36877c4ece6SBarry Smith 369014dd563SJed Brown PETSC_EXTERN PetscErrorCode PetscLogEventGetFlops(PetscLogEvent,PetscLogDouble*); 370014dd563SJed Brown PETSC_EXTERN PetscErrorCode PetscLogEventZeroFlops(PetscLogEvent); 371003131ecSBarry Smith 372ce85283eSBarry Smith /* 373f621e05eSBarry Smith These are used internally in the PETSc routines to keep a count of MPI messages and 374f621e05eSBarry Smith their sizes. 375f621e05eSBarry Smith 376af0996ceSBarry Smith This does not work for MPI-Uni because our include/petsc/mpiuni/mpi.h file 377ce85283eSBarry Smith uses macros to defined the MPI operations. 37815308354SBarry Smith 37915308354SBarry Smith It does not work correctly from HP-UX because it processes the 380bb4af37aSBarry Smith macros in a way that sometimes it double counts, hence 381b6410449SSatish Balay PETSC_HAVE_BROKEN_RECURSIVE_MACRO 3827c1e34a4SSatish Balay 383f569fd43SBarry Smith It does not work with Windows because winmpich lacks MPI_Type_size() 384ce85283eSBarry Smith */ 385c9b973beSBarry Smith #if !defined(MPIUNI_H) && !defined(PETSC_HAVE_BROKEN_RECURSIVE_MACRO) && !defined (PETSC_HAVE_MPI_MISSING_TYPESIZE) 38677a39924SBarry Smith /* 38777a39924SBarry Smith Logging of MPI activities 38877a39924SBarry Smith */ 3899fbee547SJacob Faibussowitsch static inline PetscErrorCode PetscMPITypeSize(PetscInt count,MPI_Datatype type,PetscLogDouble *length) 390f95db71bSBarry Smith { 391f12d10ccSJunchao Zhang PetscMPIInt typesize; 392*5f80ce2aSJacob Faibussowitsch 3937d30fa4aSBarry Smith if (type == MPI_DATATYPE_NULL) return 0; 394*5f80ce2aSJacob Faibussowitsch CHKERRMPI(MPI_Type_size(type,&typesize)); 395f12d10ccSJunchao Zhang *length += (PetscLogDouble) (count*typesize); 3969c72ff1eSSatish Balay return 0; 397f95db71bSBarry Smith } 39877a39924SBarry Smith 3999fbee547SJacob Faibussowitsch static inline PetscErrorCode PetscMPITypeSizeComm(MPI_Comm comm,const PetscMPIInt *counts,MPI_Datatype type,PetscLogDouble *length) 4003b9284c0SMatthew G Knepley { 401f12d10ccSJunchao Zhang PetscMPIInt typesize,size,p; 4023b9284c0SMatthew G Knepley 4037d30fa4aSBarry Smith if (type == MPI_DATATYPE_NULL) return 0; 404*5f80ce2aSJacob Faibussowitsch CHKERRMPI(MPI_Comm_size(comm,&size)); 405*5f80ce2aSJacob Faibussowitsch CHKERRMPI(MPI_Type_size(type,&typesize)); 406*5f80ce2aSJacob Faibussowitsch for (p=0; p<size; ++p) *length += (PetscLogDouble)(counts[p]*typesize); 407f12d10ccSJunchao Zhang return 0; 408f12d10ccSJunchao Zhang } 409f12d10ccSJunchao Zhang 4109fbee547SJacob Faibussowitsch static inline PetscErrorCode PetscMPITypeSizeCount(PetscInt n,const PetscMPIInt *counts,MPI_Datatype type,PetscLogDouble *length) 411f12d10ccSJunchao Zhang { 412f12d10ccSJunchao Zhang PetscMPIInt typesize,p; 413f12d10ccSJunchao Zhang 414f12d10ccSJunchao Zhang if (type == MPI_DATATYPE_NULL) return 0; 415*5f80ce2aSJacob Faibussowitsch CHKERRMPI(MPI_Type_size(type,&typesize)); 416*5f80ce2aSJacob Faibussowitsch for (p=0; p<n; ++p) *length += (PetscLogDouble)(counts[p]*typesize); 4173b9284c0SMatthew G Knepley return 0; 4183b9284c0SMatthew G Knepley } 4193b9284c0SMatthew G Knepley 42072b11a25SBarry Smith /* 42172b11a25SBarry Smith Returns 1 if the communicator is parallel else zero 42272b11a25SBarry Smith */ 4239fbee547SJacob Faibussowitsch static inline int PetscMPIParallelComm(MPI_Comm comm) 42472b11a25SBarry Smith { 42572b11a25SBarry Smith PetscMPIInt size; MPI_Comm_size(comm,&size); return size > 1; 42672b11a25SBarry Smith } 42772b11a25SBarry Smith 42877a39924SBarry Smith #define MPI_Irecv(buf,count,datatype,source,tag,comm,request) \ 429f12d10ccSJunchao Zhang ((petsc_irecv_ct++,0) || PetscMPITypeSize((count),(datatype),&(petsc_irecv_len)) || MPI_Irecv((buf),(count),(datatype),(source),(tag),(comm),(request))) 43015308354SBarry Smith 431c87b50c4SJunchao Zhang #define MPI_Irecv_c(buf,count,datatype,source,tag,comm,request) \ 432c87b50c4SJunchao Zhang ((petsc_irecv_ct++,0) || PetscMPITypeSize((count),(datatype),&(petsc_irecv_len)) || MPI_Irecv_c((buf),(count),(datatype),(source),(tag),(comm),(request))) 433c87b50c4SJunchao Zhang 43477a39924SBarry Smith #define MPI_Isend(buf,count,datatype,dest,tag,comm,request) \ 435f12d10ccSJunchao Zhang ((petsc_isend_ct++,0) || PetscMPITypeSize((count),(datatype),&(petsc_isend_len)) || MPI_Isend((buf),(count),(datatype),(dest),(tag),(comm),(request))) 43615308354SBarry Smith 437c87b50c4SJunchao Zhang #define MPI_Isend_c(buf,count,datatype,dest,tag,comm,request) \ 438c87b50c4SJunchao Zhang ((petsc_isend_ct++,0) || PetscMPITypeSize((count),(datatype),&(petsc_isend_len)) || MPI_Isend_c((buf),(count),(datatype),(dest),(tag),(comm),(request))) 439c87b50c4SJunchao Zhang 440457b14b1SJunchao Zhang #define MPI_Startall_irecv(count,datatype,number,requests) \ 441f12d10ccSJunchao Zhang ((petsc_irecv_ct += (PetscLogDouble)(number),0) || PetscMPITypeSize((count),(datatype),&(petsc_irecv_len)) || ((number) && MPI_Startall((number),(requests)))) 4420d4b0b6cSBarry Smith 443457b14b1SJunchao Zhang #define MPI_Startall_isend(count,datatype,number,requests) \ 444f12d10ccSJunchao Zhang ((petsc_isend_ct += (PetscLogDouble)(number),0) || PetscMPITypeSize((count),(datatype),&(petsc_isend_len)) || ((number) && MPI_Startall((number),(requests)))) 4450d4b0b6cSBarry Smith 446457b14b1SJunchao Zhang #define MPI_Start_isend(count,datatype,requests) \ 447f12d10ccSJunchao Zhang ((petsc_isend_ct++,0) || PetscMPITypeSize((count),(datatype),(&petsc_isend_len)) || MPI_Start((requests))) 4480d4b0b6cSBarry Smith 449ce85283eSBarry Smith #define MPI_Recv(buf,count,datatype,source,tag,comm,status) \ 450f12d10ccSJunchao Zhang ((petsc_recv_ct++,0) || PetscMPITypeSize((count),(datatype),(&petsc_recv_len)) || MPI_Recv((buf),(count),(datatype),(source),(tag),(comm),(status))) 45115308354SBarry Smith 452c87b50c4SJunchao Zhang #define MPI_Recv_c(buf,count,datatype,source,tag,comm,status) \ 453c87b50c4SJunchao Zhang ((petsc_recv_ct++,0) || PetscMPITypeSize((count),(datatype),(&petsc_recv_len)) || MPI_Recv_c((buf),(count),(datatype),(source),(tag),(comm),(status))) 454c87b50c4SJunchao Zhang 45577a39924SBarry Smith #define MPI_Send(buf,count,datatype,dest,tag,comm) \ 456f12d10ccSJunchao Zhang ((petsc_send_ct++,0) || PetscMPITypeSize((count),(datatype),(&petsc_send_len)) || MPI_Send((buf),(count),(datatype),(dest),(tag),(comm))) 45777a39924SBarry Smith 458c87b50c4SJunchao Zhang #define MPI_Send_c(buf,count,datatype,dest,tag,comm) \ 459c87b50c4SJunchao Zhang ((petsc_send_ct++,0) || PetscMPITypeSize((count),(datatype),(&petsc_send_len)) || MPI_Send_c((buf),(count),(datatype),(dest),(tag),(comm))) 460c87b50c4SJunchao Zhang 46177a39924SBarry Smith #define MPI_Wait(request,status) \ 4625fa69175SJed Brown ((petsc_wait_ct++,petsc_sum_of_waits_ct++,0) || MPI_Wait((request),(status))) 46377a39924SBarry Smith 46477a39924SBarry Smith #define MPI_Waitany(a,b,c,d) \ 4655fa69175SJed Brown ((petsc_wait_any_ct++,petsc_sum_of_waits_ct++,0) || MPI_Waitany((a),(b),(c),(d))) 46677a39924SBarry Smith 46777a39924SBarry Smith #define MPI_Waitall(count,array_of_requests,array_of_statuses) \ 4685fa69175SJed Brown ((petsc_wait_all_ct++,petsc_sum_of_waits_ct += (PetscLogDouble) (count),0) || MPI_Waitall((count),(array_of_requests),(array_of_statuses))) 46977a39924SBarry Smith 47077a39924SBarry Smith #define MPI_Allreduce(sendbuf,recvbuf,count,datatype,op,comm) \ 471df05ca09SBarry Smith (petsc_allreduce_ct += PetscMPIParallelComm((comm)),MPI_Allreduce((sendbuf),(recvbuf),(count),(datatype),(op),(comm))) 4723914022bSBarry Smith 47354fe5c21SBarry Smith #define MPI_Bcast(buffer,count,datatype,root,comm) \ 4745fa69175SJed Brown ((petsc_allreduce_ct += PetscMPIParallelComm((comm)),0) || MPI_Bcast((buffer),(count),(datatype),(root),(comm))) 47554fe5c21SBarry Smith 476d6e4c47cSJed Brown #define MPI_Reduce_scatter_block(sendbuf,recvbuf,recvcount,datatype,op,comm) \ 4775fa69175SJed Brown ((petsc_allreduce_ct += PetscMPIParallelComm((comm)),0) || MPI_Reduce_scatter_block((sendbuf),(recvbuf),(recvcount),(datatype),(op),(comm))) 478d6e4c47cSJed Brown 4793b9284c0SMatthew G Knepley #define MPI_Alltoall(sendbuf,sendcount,sendtype,recvbuf,recvcount,recvtype,comm) \ 480f12d10ccSJunchao Zhang ((petsc_allreduce_ct += PetscMPIParallelComm((comm)),0) || PetscMPITypeSize((sendcount),(sendtype),(&petsc_send_len)) || MPI_Alltoall((sendbuf),(sendcount),(sendtype),(recvbuf),(recvcount),(recvtype),(comm))) 4813b9284c0SMatthew G Knepley 4823b9284c0SMatthew G Knepley #define MPI_Alltoallv(sendbuf,sendcnts,sdispls,sendtype,recvbuf,recvcnts,rdispls,recvtype,comm) \ 483f12d10ccSJunchao Zhang ((petsc_allreduce_ct += PetscMPIParallelComm((comm)),0) || PetscMPITypeSizeComm((comm),(sendcnts),(sendtype),(&petsc_send_len)) || MPI_Alltoallv((sendbuf),(sendcnts),(sdispls),(sendtype),(recvbuf),(recvcnts),(rdispls),(recvtype),(comm))) 4843b9284c0SMatthew G Knepley 48501faf4e4SMatthew Knepley #define MPI_Allgather(sendbuf,sendcount,sendtype,recvbuf,recvcount,recvtype,comm) \ 4865fa69175SJed Brown ((petsc_gather_ct += PetscMPIParallelComm((comm)),0) || MPI_Allgather((sendbuf),(sendcount),(sendtype),(recvbuf),(recvcount),(recvtype),(comm))) 48701faf4e4SMatthew Knepley 48801faf4e4SMatthew Knepley #define MPI_Allgatherv(sendbuf,sendcount,sendtype,recvbuf,recvcount,displs,recvtype,comm) \ 4895fa69175SJed Brown ((petsc_gather_ct += PetscMPIParallelComm((comm)),0) || MPI_Allgatherv((sendbuf),(sendcount),(sendtype),(recvbuf),(recvcount),(displs),(recvtype),(comm))) 49001faf4e4SMatthew Knepley 49101faf4e4SMatthew Knepley #define MPI_Gather(sendbuf,sendcount,sendtype,recvbuf,recvcount,recvtype,root,comm) \ 492f12d10ccSJunchao Zhang ((petsc_gather_ct++,0) || PetscMPITypeSize((sendcount),(sendtype),(&petsc_send_len)) || MPI_Gather((sendbuf),(sendcount),(sendtype),(recvbuf),(recvcount),(recvtype),(root),(comm))) 49301faf4e4SMatthew Knepley 49401faf4e4SMatthew Knepley #define MPI_Gatherv(sendbuf,sendcount,sendtype,recvbuf,recvcount,displs,recvtype,root,comm) \ 495f12d10ccSJunchao Zhang ((petsc_gather_ct++,0) || PetscMPITypeSize((sendcount),(sendtype),(&petsc_send_len)) || MPI_Gatherv((sendbuf),(sendcount),(sendtype),(recvbuf),(recvcount),(displs),(recvtype),(root),(comm))) 49601faf4e4SMatthew Knepley 49701faf4e4SMatthew Knepley #define MPI_Scatter(sendbuf,sendcount,sendtype,recvbuf,recvcount,recvtype,root,comm) \ 498f12d10ccSJunchao Zhang ((petsc_scatter_ct++,0) || PetscMPITypeSize((recvcount),(recvtype),(&petsc_recv_len)) || MPI_Scatter((sendbuf),(sendcount),(sendtype),(recvbuf),(recvcount),(recvtype),(root),(comm))) 49901faf4e4SMatthew Knepley 50001faf4e4SMatthew Knepley #define MPI_Scatterv(sendbuf,sendcount,displs,sendtype,recvbuf,recvcount,recvtype,root,comm) \ 501f12d10ccSJunchao Zhang ((petsc_scatter_ct++,0) || PetscMPITypeSize((recvcount),(recvtype),(&petsc_recv_len)) || MPI_Scatterv((sendbuf),(sendcount),(displs),(sendtype),(recvbuf),(recvcount),(recvtype),(root),(comm))) 502f12d10ccSJunchao Zhang 503f12d10ccSJunchao Zhang #define MPI_Ialltoall(sendbuf,sendcount,sendtype,recvbuf,recvcount,recvtype,comm,request) \ 504f12d10ccSJunchao Zhang ((petsc_allreduce_ct += PetscMPIParallelComm((comm)),0) || PetscMPITypeSize((sendcount),(sendtype),(&petsc_send_len)) || MPI_Ialltoall((sendbuf),(sendcount),(sendtype),(recvbuf),(recvcount),(recvtype),(comm),(request))) 505f12d10ccSJunchao Zhang 506f12d10ccSJunchao Zhang #define MPI_Ialltoallv(sendbuf,sendcnts,sdispls,sendtype,recvbuf,recvcnts,rdispls,recvtype,comm,request) \ 507f12d10ccSJunchao Zhang ((petsc_allreduce_ct += PetscMPIParallelComm((comm)),0) || PetscMPITypeSizeComm((comm),(sendcnts),(sendtype),(&petsc_send_len)) || MPI_Ialltoallv((sendbuf),(sendcnts),(sdispls),(sendtype),(recvbuf),(recvcnts),(rdispls),(recvtype),(comm),(request))) 508f12d10ccSJunchao Zhang 509f12d10ccSJunchao Zhang #define MPI_Iallgather(sendbuf,sendcount,sendtype,recvbuf,recvcount,recvtype,comm,request) \ 510f12d10ccSJunchao Zhang ((petsc_gather_ct += PetscMPIParallelComm((comm)),0) || MPI_Iallgather((sendbuf),(sendcount),(sendtype),(recvbuf),(recvcount),(recvtype),(comm),(request))) 511f12d10ccSJunchao Zhang 512f12d10ccSJunchao Zhang #define MPI_Iallgatherv(sendbuf,sendcount,sendtype,recvbuf,recvcount,displs,recvtype,comm,request) \ 513f12d10ccSJunchao Zhang ((petsc_gather_ct += PetscMPIParallelComm((comm)),0) || MPI_Iallgatherv((sendbuf),(sendcount),(sendtype),(recvbuf),(recvcount),(displs),(recvtype),(comm),(request))) 514f12d10ccSJunchao Zhang 515f12d10ccSJunchao Zhang #define MPI_Igather(sendbuf,sendcount,sendtype,recvbuf,recvcount,recvtype,root,comm,request) \ 516f12d10ccSJunchao Zhang ((petsc_gather_ct++,0) || PetscMPITypeSize((sendcount),(sendtype),(&petsc_send_len)) || MPI_Igather((sendbuf),(sendcount),(sendtype),(recvbuf),(recvcount),(recvtype),(root),(comm),(request))) 517f12d10ccSJunchao Zhang 518f12d10ccSJunchao Zhang #define MPI_Igatherv(sendbuf,sendcount,sendtype,recvbuf,recvcount,displs,recvtype,root,comm,request) \ 519f12d10ccSJunchao Zhang ((petsc_gather_ct++,0) || PetscMPITypeSize((sendcount),(sendtype),(&petsc_send_len)) || MPI_Igatherv((sendbuf),(sendcount),(sendtype),(recvbuf),(recvcount),(displs),(recvtype),(root),(comm),(request))) 520f12d10ccSJunchao Zhang 521f12d10ccSJunchao Zhang #define MPI_Iscatter(sendbuf,sendcount,sendtype,recvbuf,recvcount,recvtype,root,comm,request) \ 522f12d10ccSJunchao Zhang ((petsc_scatter_ct++,0) || PetscMPITypeSize((recvcount),(recvtype),(&petsc_recv_len)) || MPI_Iscatter((sendbuf),(sendcount),(sendtype),(recvbuf),(recvcount),(recvtype),(root),(comm),(request))) 523f12d10ccSJunchao Zhang 524f12d10ccSJunchao Zhang #define MPI_Iscatterv(sendbuf,sendcount,displs,sendtype,recvbuf,recvcount,recvtype,root,comm,request) \ 525f12d10ccSJunchao Zhang ((petsc_scatter_ct++,0) || PetscMPITypeSize((recvcount),(recvtype),(&petsc_recv_len)) || MPI_Iscatterv((sendbuf),(sendcount),(displs),(sendtype),(recvbuf),(recvcount),(recvtype),(root),(comm),(request))) 526f12d10ccSJunchao Zhang 5270d4b0b6cSBarry Smith #else 5280d4b0b6cSBarry Smith 529457b14b1SJunchao Zhang #define MPI_Startall_irecv(count,datatype,number,requests) \ 530ea1c87f7SJunchao Zhang ((number) && MPI_Startall((number),(requests))) 5310d4b0b6cSBarry Smith 532457b14b1SJunchao Zhang #define MPI_Startall_isend(count,datatype,number,requests) \ 533ea1c87f7SJunchao Zhang ((number) && MPI_Startall((number),(requests))) 5340d4b0b6cSBarry Smith 535457b14b1SJunchao Zhang #define MPI_Start_isend(count,datatype,requests) \ 5365fa69175SJed Brown (MPI_Start((requests))) 5370d4b0b6cSBarry Smith 538c9b973beSBarry Smith #endif /* !MPIUNI_H && ! PETSC_HAVE_BROKEN_RECURSIVE_MACRO */ 539614700edSBarry Smith 540df8cf0b5SBarry Smith #else /* ---Logging is turned off --------------------------------------------*/ 541614700edSBarry Smith 542e3ed9ee7SBarry Smith #define PetscLogMemory PETSC_FALSE 543e3ed9ee7SBarry Smith 544b0a32e0cSBarry Smith #define PetscLogFlops(n) 0 545fa2bb9feSLisandro Dalcin #define PetscGetFlops(a) (*(a) = 0.0,0) 546614700edSBarry Smith 547fa2bb9feSLisandro Dalcin #define PetscLogStageRegister(a,b) 0 548fa2bb9feSLisandro Dalcin #define PetscLogStagePush(a) 0 549fa2bb9feSLisandro Dalcin #define PetscLogStagePop() 0 550f5d6ab90SLisandro Dalcin #define PetscLogStageSetActive(a,b) 0 551f5d6ab90SLisandro Dalcin #define PetscLogStageGetActive(a,b) 0 552f5d6ab90SLisandro Dalcin #define PetscLogStageGetVisible(a,b) 0 553f5d6ab90SLisandro Dalcin #define PetscLogStageSetVisible(a,b) 0 554f5d6ab90SLisandro Dalcin #define PetscLogStageGetId(a,b) (*(b)=0,0) 555f5d6ab90SLisandro Dalcin 556fa2bb9feSLisandro Dalcin #define PetscLogEventRegister(a,b,c) 0 557fa2bb9feSLisandro Dalcin #define PetscLogEventSetCollective(a,b) 0 558fa2bb9feSLisandro Dalcin #define PetscLogEventIncludeClass(a) 0 559fa2bb9feSLisandro Dalcin #define PetscLogEventExcludeClass(a) 0 560b0a32e0cSBarry Smith #define PetscLogEventActivate(a) 0 561b0a32e0cSBarry Smith #define PetscLogEventDeactivate(a) 0 562c00cb57fSBarry Smith #define PetscLogEventDeactivatePush(a) 0 563c00cb57fSBarry Smith #define PetscLogEventDeactivatePop(a) 0 564b0a32e0cSBarry Smith #define PetscLogEventActivateClass(a) 0 565b0a32e0cSBarry Smith #define PetscLogEventDeactivateClass(a) 0 566e8e7597cSSatish Balay #define PetscLogEventSetActiveAll(a,b) 0 56746eb3cd7SSatish Balay #define PetscLogEventGetId(a,b) (*(b)=0,0) 568561b2a67SSatish Balay #define PetscLogEventGetPerfInfo(a,b,c) 0 5699c702cfcSMatthew G. Knepley #define PetscLogEventSetDof(a,b,c) 0 5709c702cfcSMatthew G. Knepley #define PetscLogEventSetError(a,b,c) 0 57177c4ece6SBarry Smith 5728b5db460SBarry Smith #define PetscLogPLB 0 5738b5db460SBarry Smith #define PetscLogPLE 0 5748b5db460SBarry Smith #define PetscLogPHC 0 5758b5db460SBarry Smith #define PetscLogPHD 0 576f5d6ab90SLisandro Dalcin 577efee365bSSatish Balay #define PetscLogObjectParents(p,n,c) 0 57852e6d16bSBarry Smith #define PetscLogObjectCreate(h) 0 57952e6d16bSBarry Smith #define PetscLogObjectDestroy(h) 0 5803ca90d2dSJacob Faibussowitsch PETSC_EXTERN PetscErrorCode PetscLogObjectState(PetscObject,const char[],...) PETSC_ATTRIBUTE_FORMAT(2,3); 581fa2bb9feSLisandro Dalcin 582bb1d7374SBarry Smith #define PetscLogDefaultBegin() 0 583b0a32e0cSBarry Smith #define PetscLogAllBegin() 0 584bb1d7374SBarry Smith #define PetscLogNestedBegin() 0 585fa2bb9feSLisandro Dalcin #define PetscLogTraceBegin(file) 0 58673fda44aSBarry Smith #define PetscLogActions(a) 0 587fa2bb9feSLisandro Dalcin #define PetscLogObjects(a) 0 588fa2bb9feSLisandro Dalcin #define PetscLogSetThreshold(a,b) 0 589fa2bb9feSLisandro Dalcin #define PetscLogSet(lb,le) 0 590340002ceSLawrence Mitchell #define PetscLogIsActive(flag) (*(flag) = PETSC_FALSE,0) 591fa2bb9feSLisandro Dalcin 592fa2bb9feSLisandro Dalcin #define PetscLogView(viewer) 0 593fa2bb9feSLisandro Dalcin #define PetscLogViewFromOptions() 0 594fa2bb9feSLisandro Dalcin #define PetscLogDump(c) 0 595fa2bb9feSLisandro Dalcin 59662872c28SLisandro Dalcin #define PetscLogEventSync(e,comm) 0 597fa2bb9feSLisandro Dalcin #define PetscLogEventBegin(e,o1,o2,o3,o4) 0 598fa2bb9feSLisandro Dalcin #define PetscLogEventEnd(e,o1,o2,o3,o4) 0 599ce6058e1SBarry Smith 60023c86b1bSSatish Balay /* If PETSC_USE_LOG is NOT defined, these still need to be! */ 60123c86b1bSSatish Balay #define MPI_Startall_irecv(count,datatype,number,requests) ((number) && MPI_Startall(number,requests)) 60223c86b1bSSatish Balay #define MPI_Startall_isend(count,datatype,number,requests) ((number) && MPI_Startall(number,requests)) 60323c86b1bSSatish Balay #define MPI_Start_isend(count,datatype,requests) MPI_Start(requests) 60423c86b1bSSatish Balay 60523c86b1bSSatish Balay #endif /* PETSC_USE_LOG */ 60623c86b1bSSatish Balay 60723c86b1bSSatish Balay #if defined (PETSC_USE_LOG) && defined(PETSC_HAVE_DEVICE) 60823c86b1bSSatish Balay 60923c86b1bSSatish Balay /* Global GPU counters */ 61023c86b1bSSatish Balay PETSC_EXTERN PetscLogDouble petsc_ctog_ct; 61123c86b1bSSatish Balay PETSC_EXTERN PetscLogDouble petsc_gtoc_ct; 61223c86b1bSSatish Balay PETSC_EXTERN PetscLogDouble petsc_ctog_sz; 61323c86b1bSSatish Balay PETSC_EXTERN PetscLogDouble petsc_gtoc_sz; 61423c86b1bSSatish Balay PETSC_EXTERN PetscLogDouble petsc_ctog_ct_scalar; 61523c86b1bSSatish Balay PETSC_EXTERN PetscLogDouble petsc_gtoc_ct_scalar; 61623c86b1bSSatish Balay PETSC_EXTERN PetscLogDouble petsc_ctog_sz_scalar; 61723c86b1bSSatish Balay PETSC_EXTERN PetscLogDouble petsc_gtoc_sz_scalar; 61823c86b1bSSatish Balay PETSC_EXTERN PetscLogDouble petsc_gflops; 61923c86b1bSSatish Balay PETSC_EXTERN PetscLogDouble petsc_gtime; 62023c86b1bSSatish Balay 6219fbee547SJacob Faibussowitsch static inline PetscErrorCode PetscLogCpuToGpu(PetscLogDouble size) 62223c86b1bSSatish Balay { 62323c86b1bSSatish Balay PetscFunctionBegin; 62423c86b1bSSatish Balay petsc_ctog_ct += 1; 62523c86b1bSSatish Balay petsc_ctog_sz += size; 62623c86b1bSSatish Balay PetscFunctionReturn(0); 62723c86b1bSSatish Balay } 62823c86b1bSSatish Balay 6299fbee547SJacob Faibussowitsch static inline PetscErrorCode PetscLogGpuToCpu(PetscLogDouble size) 63023c86b1bSSatish Balay { 63123c86b1bSSatish Balay PetscFunctionBegin; 63223c86b1bSSatish Balay petsc_gtoc_ct += 1; 63323c86b1bSSatish Balay petsc_gtoc_sz += size; 63423c86b1bSSatish Balay PetscFunctionReturn(0); 63523c86b1bSSatish Balay } 63623c86b1bSSatish Balay 6379fbee547SJacob Faibussowitsch static inline PetscErrorCode PetscLogCpuToGpuScalar(PetscLogDouble size) 63823c86b1bSSatish Balay { 63923c86b1bSSatish Balay PetscFunctionBegin; 64023c86b1bSSatish Balay petsc_ctog_ct_scalar += 1; 64123c86b1bSSatish Balay petsc_ctog_sz_scalar += size; 64223c86b1bSSatish Balay PetscFunctionReturn(0); 64323c86b1bSSatish Balay } 64423c86b1bSSatish Balay 6459fbee547SJacob Faibussowitsch static inline PetscErrorCode PetscLogGpuToCpuScalar(PetscLogDouble size) 64623c86b1bSSatish Balay { 64723c86b1bSSatish Balay PetscFunctionBegin; 64823c86b1bSSatish Balay petsc_gtoc_ct_scalar += 1; 64923c86b1bSSatish Balay petsc_gtoc_sz_scalar += size; 65023c86b1bSSatish Balay PetscFunctionReturn(0); 65123c86b1bSSatish Balay } 65223c86b1bSSatish Balay 65323c86b1bSSatish Balay /*@C 65423c86b1bSSatish Balay PetscLogGpuFlops - Log how many flops are performed in a calculation on the device 65523c86b1bSSatish Balay 65623c86b1bSSatish Balay Input Parameter: 65723c86b1bSSatish Balay . flops - the number of flops 65823c86b1bSSatish Balay 65923c86b1bSSatish Balay Notes: 66023c86b1bSSatish Balay To limit the chance of integer overflow when multiplying by a constant, represent the constant as a double, 66123c86b1bSSatish Balay not an integer. Use PetscLogFlops(4.0*n) not PetscLogFlops(4*n) 66223c86b1bSSatish Balay 66323c86b1bSSatish Balay Level: intermediate 66423c86b1bSSatish Balay 66523c86b1bSSatish Balay .seealso: PetscLogView(), PetscLogFlops(), PetscLogGpuTimeBegin(), PetscLogGpuTimeEnd() 66623c86b1bSSatish Balay @*/ 6679fbee547SJacob Faibussowitsch static inline PetscErrorCode PetscLogGpuFlops(PetscLogDouble n) 66823c86b1bSSatish Balay { 66923c86b1bSSatish Balay PetscFunctionBegin; 6702c71b3e2SJacob Faibussowitsch PetscCheck(n >= 0,PETSC_COMM_SELF,PETSC_ERR_ARG_OUTOFRANGE,"Cannot log negative flops"); 67123c86b1bSSatish Balay petsc_TotalFlops += PETSC_FLOPS_PER_OP*n; 67223c86b1bSSatish Balay petsc_gflops += PETSC_FLOPS_PER_OP*n; 67323c86b1bSSatish Balay PetscFunctionReturn(0); 67423c86b1bSSatish Balay } 67523c86b1bSSatish Balay 6769fbee547SJacob Faibussowitsch static inline PetscErrorCode PetscLogGpuTimeAdd(PetscLogDouble t) 67723c86b1bSSatish Balay { 67823c86b1bSSatish Balay PetscFunctionBegin; 67923c86b1bSSatish Balay petsc_gtime += t; 68023c86b1bSSatish Balay PetscFunctionReturn(0); 68123c86b1bSSatish Balay } 68223c86b1bSSatish Balay 68323c86b1bSSatish Balay PETSC_EXTERN PetscErrorCode PetscLogGpuTimeBegin(void); 68423c86b1bSSatish Balay PETSC_EXTERN PetscErrorCode PetscLogGpuTimeEnd(void); 68523c86b1bSSatish Balay 68623c86b1bSSatish Balay #else 68723c86b1bSSatish Balay 6888157aad8SJunchao Zhang #define PetscLogCpuToGpu(a) 0 6898157aad8SJunchao Zhang #define PetscLogGpuToCpu(a) 0 69045c4b7c1SBarry Smith #define PetscLogCpuToGpuScalar(a) 0 69145c4b7c1SBarry Smith #define PetscLogGpuToCpuScalar(a) 0 6928157aad8SJunchao Zhang #define PetscLogGpuFlops(a) 0 69353b96e71SJacob Faibussowitsch #define PetscLogGpuTimeAdd(a) 0 6948157aad8SJunchao Zhang #define PetscLogGpuTimeBegin() 0 6958157aad8SJunchao Zhang #define PetscLogGpuTimeEnd() 0 6968157aad8SJunchao Zhang 69723c86b1bSSatish Balay #endif /* PETSC_USE_LOG && PETSC_HAVE_DEVICE */ 6986daaf66cSBarry Smith 699204a6943SJed Brown #define PetscPreLoadBegin(flag,name) \ 700204a6943SJed Brown do {\ 701204a6943SJed Brown PetscBool PetscPreLoading = flag;\ 702204a6943SJed Brown int PetscPreLoadMax,PetscPreLoadIt;\ 703166c7f25SBarry Smith PetscLogStage _stageNum;\ 704*5f80ce2aSJacob Faibussowitsch CHKERRQ(PetscOptionsGetBool(NULL,NULL,"-preload",&PetscPreLoading,NULL)); \ 705204a6943SJed Brown PetscPreLoadMax = (int)(PetscPreLoading);\ 706204a6943SJed Brown PetscPreLoadingUsed = PetscPreLoading ? PETSC_TRUE : PetscPreLoadingUsed;\ 707204a6943SJed Brown for (PetscPreLoadIt=0; PetscPreLoadIt<=PetscPreLoadMax; PetscPreLoadIt++) {\ 708204a6943SJed Brown PetscPreLoadingOn = PetscPreLoading;\ 709*5f80ce2aSJacob Faibussowitsch CHKERRQ(PetscBarrier(NULL));\ 710*5f80ce2aSJacob Faibussowitsch if (PetscPreLoadIt>0) CHKERRQ(PetscLogStageGetId(name,&_stageNum));\ 711*5f80ce2aSJacob Faibussowitsch else CHKERRQ(PetscLogStageRegister(name,&_stageNum));\ 712*5f80ce2aSJacob Faibussowitsch CHKERRQ(PetscLogStageSetActive(_stageNum,(PetscBool)(!PetscPreLoadMax || PetscPreLoadIt)));\ 713*5f80ce2aSJacob Faibussowitsch CHKERRQ(PetscLogStagePush(_stageNum)); 7148e58c17dSMatthew Knepley 715204a6943SJed Brown #define PetscPreLoadEnd() \ 716*5f80ce2aSJacob Faibussowitsch CHKERRQ(PetscLogStagePop());\ 717204a6943SJed Brown PetscPreLoading = PETSC_FALSE;\ 718043328b6SSatish Balay }\ 719204a6943SJed Brown } while (0) 7208e58c17dSMatthew Knepley 721204a6943SJed Brown #define PetscPreLoadStage(name) do { \ 722*5f80ce2aSJacob Faibussowitsch CHKERRQ(PetscLogStagePop()); \ 723*5f80ce2aSJacob Faibussowitsch if (PetscPreLoadIt>0) CHKERRQ(PetscLogStageGetId(name,&_stageNum)); \ 724*5f80ce2aSJacob Faibussowitsch else CHKERRQ(PetscLogStageRegister(name,&_stageNum)); \ 725*5f80ce2aSJacob Faibussowitsch CHKERRQ(PetscLogStageSetActive(_stageNum,(PetscBool)(!PetscPreLoadMax || PetscPreLoadIt))); \ 726*5f80ce2aSJacob Faibussowitsch CHKERRQ(PetscLogStagePush(_stageNum)); \ 727204a6943SJed Brown } while (0) 728e9fa29b7SSatish Balay 729ad14c47eSJed Brown /* some vars for logging */ 730ad14c47eSJed Brown PETSC_EXTERN PetscBool PetscPreLoadingUsed; /* true if we are or have done preloading */ 731ad14c47eSJed Brown PETSC_EXTERN PetscBool PetscPreLoadingOn; /* true if we are currently in a preloading calculation */ 732ad14c47eSJed Brown 73397bb86f7SLois Curfman McInnes #endif 734