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 */ 11fe9b927eSVaclav Hapla PETSC_EXTERN PetscErrorCode PetscInfo_Private(const char[],PetscObject,const char[],...); 12fa2bb9feSLisandro Dalcin #if defined(PETSC_USE_INFO) 13fe9b927eSVaclav Hapla #define PetscInfo(A,S) PetscInfo_Private(PETSC_FUNCTION_NAME,((PetscObject)A),S) 14fe9b927eSVaclav Hapla #define PetscInfo1(A,S,a1) PetscInfo_Private(PETSC_FUNCTION_NAME,((PetscObject)A),S,a1) 15fe9b927eSVaclav Hapla #define PetscInfo2(A,S,a1,a2) PetscInfo_Private(PETSC_FUNCTION_NAME,((PetscObject)A),S,a1,a2) 16fe9b927eSVaclav Hapla #define PetscInfo3(A,S,a1,a2,a3) PetscInfo_Private(PETSC_FUNCTION_NAME,((PetscObject)A),S,a1,a2,a3) 17fe9b927eSVaclav Hapla #define PetscInfo4(A,S,a1,a2,a3,a4) PetscInfo_Private(PETSC_FUNCTION_NAME,((PetscObject)A),S,a1,a2,a3,a4) 18fe9b927eSVaclav Hapla #define PetscInfo5(A,S,a1,a2,a3,a4,a5) PetscInfo_Private(PETSC_FUNCTION_NAME,((PetscObject)A),S,a1,a2,a3,a4,a5) 19fe9b927eSVaclav Hapla #define PetscInfo6(A,S,a1,a2,a3,a4,a5,a6) PetscInfo_Private(PETSC_FUNCTION_NAME,((PetscObject)A),S,a1,a2,a3,a4,a5,a6) 20fe9b927eSVaclav Hapla #define PetscInfo7(A,S,a1,a2,a3,a4,a5,a6,a7) PetscInfo_Private(PETSC_FUNCTION_NAME,((PetscObject)A),S,a1,a2,a3,a4,a5,a6,a7) 2100702c57SStefano Zampini #define PetscInfo8(A,S,a1,a2,a3,a4,a5,a6,a7,a8) PetscInfo_Private(PETSC_FUNCTION_NAME,((PetscObject)A),S,a1,a2,a3,a4,a5,a6,a7,a8) 2200702c57SStefano Zampini #define PetscInfo9(A,S,a1,a2,a3,a4,a5,a6,a7,a8,a9) PetscInfo_Private(PETSC_FUNCTION_NAME,((PetscObject)A),S,a1,a2,a3,a4,a5,a6,a7,a8,a9) 23fa2bb9feSLisandro Dalcin #else 24fa2bb9feSLisandro Dalcin #define PetscInfo(A,S) 0 25fa2bb9feSLisandro Dalcin #define PetscInfo1(A,S,a1) 0 26fa2bb9feSLisandro Dalcin #define PetscInfo2(A,S,a1,a2) 0 27fa2bb9feSLisandro Dalcin #define PetscInfo3(A,S,a1,a2,a3) 0 28fa2bb9feSLisandro Dalcin #define PetscInfo4(A,S,a1,a2,a3,a4) 0 29fa2bb9feSLisandro Dalcin #define PetscInfo5(A,S,a1,a2,a3,a4,a5) 0 30fa2bb9feSLisandro Dalcin #define PetscInfo6(A,S,a1,a2,a3,a4,a5,a6) 0 31fa2bb9feSLisandro Dalcin #define PetscInfo7(A,S,a1,a2,a3,a4,a5,a6,a7) 0 3200702c57SStefano Zampini #define PetscInfo8(A,S,a1,a2,a3,a4,a5,a6,a7,a8) 0 3300702c57SStefano Zampini #define PetscInfo9(A,S,a1,a2,a3,a4,a5,a6,a7,a8,a9) 0 34fa2bb9feSLisandro Dalcin #endif 35e94e781bSJacob Faibussowitsch 36e94e781bSJacob Faibussowitsch /*E 37e94e781bSJacob Faibussowitsch PetscInfoCommFlag - Describes the method by which to filter PetscInfo() by communicator size 38e94e781bSJacob Faibussowitsch 39e94e781bSJacob Faibussowitsch Used as an input for PetscInfoSetFilterCommSelf() 40e94e781bSJacob Faibussowitsch 41e94e781bSJacob Faibussowitsch $ PETSC_INFO_COMM_ALL - Default uninitialized value. PetscInfo() will not filter based on communicator size (i.e. will 42e94e781bSJacob Faibussowitsch print for all communicators) 43e94e781bSJacob Faibussowitsch $ PETSC_INFO_COMM_NO_SELF - PetscInfo() will NOT print for communicators with size = 1 (i.e. *_COMM_SELF) 44e94e781bSJacob Faibussowitsch $ PETSC_INFO_COMM_ONLY_SELF - PetscInfo will ONLY print for communicators with size = 1 45e94e781bSJacob Faibussowitsch 46e94e781bSJacob Faibussowitsch Level: intermediate 47e94e781bSJacob Faibussowitsch 48e94e781bSJacob Faibussowitsch .seealso: PetscInfo(), PetscInfoSetFromOptions(), PetscInfoSetFilterCommSelf() 49e94e781bSJacob Faibussowitsch E*/ 50e94e781bSJacob Faibussowitsch typedef enum { 51e94e781bSJacob Faibussowitsch PETSC_INFO_COMM_ALL = -1, 52e94e781bSJacob Faibussowitsch PETSC_INFO_COMM_NO_SELF = 0, 53e94e781bSJacob Faibussowitsch PETSC_INFO_COMM_ONLY_SELF = 1 54e94e781bSJacob Faibussowitsch } PetscInfoCommFlag; 55e94e781bSJacob Faibussowitsch 56e94e781bSJacob Faibussowitsch PETSC_EXTERN const char * const PetscInfoCommFlags[]; 57fa2bb9feSLisandro Dalcin PETSC_EXTERN PetscErrorCode PetscInfoDeactivateClass(PetscClassId); 58fa2bb9feSLisandro Dalcin PETSC_EXTERN PetscErrorCode PetscInfoActivateClass(PetscClassId); 59e94e781bSJacob Faibussowitsch PETSC_EXTERN PetscErrorCode PetscInfoEnabled(PetscClassId, PetscBool *); 60e94e781bSJacob Faibussowitsch PETSC_EXTERN PetscErrorCode PetscInfoAllow(PetscBool); 61e94e781bSJacob Faibussowitsch PETSC_EXTERN PetscErrorCode PetscInfoSetFile(const char[],const char[]); 62e94e781bSJacob Faibussowitsch PETSC_EXTERN PetscErrorCode PetscInfoGetFile(char **,FILE **); 63e94e781bSJacob Faibussowitsch PETSC_EXTERN PetscErrorCode PetscInfoSetClasses(PetscBool,PetscInt,const char *const *); 64e94e781bSJacob Faibussowitsch PETSC_EXTERN PetscErrorCode PetscInfoGetClass(const char *, PetscBool *); 65e94e781bSJacob Faibussowitsch PETSC_EXTERN PetscErrorCode PetscInfoGetInfo(PetscBool *,PetscBool *,PetscBool *,PetscBool *,PetscInfoCommFlag *); 66e94e781bSJacob Faibussowitsch PETSC_EXTERN PetscErrorCode PetscInfoProcessClass(const char[],PetscInt,PetscClassId[]); 67e94e781bSJacob Faibussowitsch PETSC_EXTERN PetscErrorCode PetscInfoSetFilterCommSelf(PetscInfoCommFlag); 68e94e781bSJacob Faibussowitsch PETSC_EXTERN PetscErrorCode PetscInfoSetFromOptions(PetscOptions); 69e94e781bSJacob Faibussowitsch PETSC_EXTERN PetscErrorCode PetscInfoDestroy(void); 70fa2bb9feSLisandro Dalcin PETSC_EXTERN PetscBool PetscLogPrintInfo; /* if true, indicates PetscInfo() is turned on */ 71fa2bb9feSLisandro Dalcin 72b859824cSBarry Smith /*MC 73b859824cSBarry Smith PetscLogEvent - id used to identify PETSc or user events which timed portions (blocks of executable) 74b859824cSBarry Smith code. 75b859824cSBarry Smith 76b859824cSBarry Smith Level: intermediate 77b859824cSBarry Smith 78b859824cSBarry Smith .seealso: PetscLogEventRegister(), PetscLogEventBegin(), PetscLogEventEnd(), PetscLogStage 79b859824cSBarry Smith M*/ 80b859824cSBarry Smith typedef int PetscLogEvent; 81b859824cSBarry Smith 82b859824cSBarry Smith /*MC 83b859824cSBarry Smith PetscLogStage - id used to identify user stages (phases, sections) of runs - for logging 84b859824cSBarry Smith 85b859824cSBarry Smith Level: intermediate 86b859824cSBarry Smith 87522ce795SJed Brown .seealso: PetscLogStageRegister(), PetscLogStagePush(), PetscLogStagePop(), PetscLogEvent 88b859824cSBarry Smith M*/ 89b859824cSBarry Smith typedef int PetscLogStage; 90b859824cSBarry Smith 918ba1e511SMatthew Knepley #define PETSC_EVENT 1311311 92014dd563SJed Brown PETSC_EXTERN PetscLogEvent PETSC_LARGEST_EVENT; 9397bb86f7SLois Curfman McInnes 9419b02663SBarry Smith /* Global flop counter */ 95014dd563SJed Brown PETSC_EXTERN PetscLogDouble petsc_TotalFlops; 96014dd563SJed Brown PETSC_EXTERN PetscLogDouble petsc_tmp_flops; 9719b02663SBarry Smith 9831d06abdSBarry Smith /* We must make the following structures available to access the event 9931d06abdSBarry Smith activation flags in the PetscLogEventBegin/End() macros. These are not part of the PETSc public 10031d06abdSBarry Smith API and are not intended to be used by other parts of PETSc or by users. 101d49d4b11SBarry Smith 102fa2bb9feSLisandro Dalcin The code that manipulates these structures is in src/sys/logging/utils. 10331d06abdSBarry Smith */ 104aa213bdcSJed Brown typedef struct _n_PetscIntStack *PetscIntStack; 1056a6a9b46SSatish Balay 106217044c2SLisandro Dalcin /* -----------------------------------------------------------------------------------------------------*/ 107c60ec953SBarry Smith /* 108aa213bdcSJed Brown PetscClassRegInfo, PetscClassPerfInfo - Each class has two data structures associated with it. The first has 109c60ec953SBarry Smith static information about it, the second collects statistics on how many objects of the class are created, 110c60ec953SBarry Smith how much memory they use, etc. 111c60ec953SBarry Smith 112aa213bdcSJed Brown PetscClassRegLog, PetscClassPerfLog - arrays of the PetscClassRegInfo and PetscClassPerfInfo for all classes. 113c60ec953SBarry Smith */ 1146a6a9b46SSatish Balay typedef struct { 115c60ec953SBarry Smith char *name; /* The class name */ 116c60ec953SBarry Smith PetscClassId classid; /* The integer identifying this class */ 117aa213bdcSJed Brown } PetscClassRegInfo; 1186a6a9b46SSatish Balay 1196a6a9b46SSatish Balay typedef struct { 1200700a824SBarry Smith PetscClassId id; /* The integer identifying this class */ 1216a6a9b46SSatish Balay int creations; /* The number of objects of this class created */ 1226a6a9b46SSatish Balay int destructions; /* The number of objects of this class destroyed */ 1236a6a9b46SSatish Balay PetscLogDouble mem; /* The total memory allocated by objects of this class */ 1246a6a9b46SSatish Balay PetscLogDouble descMem; /* The total memory allocated by descendents of these objects */ 125aa213bdcSJed Brown } PetscClassPerfInfo; 1266a6a9b46SSatish Balay 127aa213bdcSJed Brown typedef struct _n_PetscClassRegLog *PetscClassRegLog; 128aa213bdcSJed Brown struct _n_PetscClassRegLog { 129c60ec953SBarry Smith int numClasses; /* The number of classes registered */ 130c60ec953SBarry Smith int maxClasses; /* The maximum number of classes */ 131aa213bdcSJed Brown PetscClassRegInfo *classInfo; /* The structure for class information (classids are monotonicly increasing) */ 132c60ec953SBarry Smith }; 1336a6a9b46SSatish Balay 134aa213bdcSJed Brown typedef struct _n_PetscClassPerfLog *PetscClassPerfLog; 135aa213bdcSJed Brown struct _n_PetscClassPerfLog { 136c60ec953SBarry Smith int numClasses; /* The number of logging classes */ 137c60ec953SBarry Smith int maxClasses; /* The maximum number of classes */ 138aa213bdcSJed Brown PetscClassPerfInfo *classInfo; /* The structure for class information (classids are monotonicly increasing) */ 139c60ec953SBarry Smith }; 140c60ec953SBarry Smith /* -----------------------------------------------------------------------------------------------------*/ 141c60ec953SBarry Smith /* 142aa213bdcSJed Brown PetscEventRegInfo, PetscEventPerfInfo - Each event has two data structures associated with it. The first has 143c60ec953SBarry Smith static information about it, the second collects statistics on how many times the event is used, how 144c60ec953SBarry Smith much time it takes, etc. 145c60ec953SBarry Smith 146aa213bdcSJed Brown PetscEventRegLog, PetscEventPerfLog - an array of all PetscEventRegInfo and PetscEventPerfInfo for all events. There is one 147c60ec953SBarry Smith of these for each stage. 148c60ec953SBarry Smith 149c60ec953SBarry Smith */ 1506a6a9b46SSatish Balay typedef struct { 1516a6a9b46SSatish Balay char *name; /* The name of this event */ 152c60ec953SBarry Smith PetscClassId classid; /* The class the event is associated with */ 153217044c2SLisandro Dalcin PetscBool collective; /* Flag this event as collective */ 1546a6a9b46SSatish Balay #if defined (PETSC_HAVE_MPE) 1556a6a9b46SSatish Balay int mpe_id_begin; /* MPE IDs that define the event */ 1566a6a9b46SSatish Balay int mpe_id_end; 1576a6a9b46SSatish Balay #endif 158aa213bdcSJed Brown } PetscEventRegInfo; 1596a6a9b46SSatish Balay 160c60ec953SBarry Smith typedef struct { 161c60ec953SBarry Smith int id; /* The integer identifying this event */ 162ace3abfcSBarry Smith PetscBool active; /* The flag to activate logging */ 163ace3abfcSBarry Smith PetscBool visible; /* The flag to print info in summary */ 164c60ec953SBarry Smith int depth; /* The nesting depth of the event call */ 165c60ec953SBarry Smith int count; /* The number of times this event was executed */ 166a42e5b54SMatthew G Knepley PetscLogDouble flops, flops2, flopsTmp; /* The flops and flops^2 used in this event */ 167a42e5b54SMatthew G Knepley PetscLogDouble time, time2, timeTmp; /* The time and time^2 taken for this event */ 168217044c2SLisandro Dalcin PetscLogDouble syncTime; /* The synchronization barrier time */ 169891e75beSMatthew G. Knepley PetscLogDouble dof[8]; /* The number of degrees of freedom associated with this event */ 1705d68e14cSMatthew G. Knepley PetscLogDouble errors[8]; /* The errors (user-defined) associated with this event */ 171c60ec953SBarry Smith PetscLogDouble numMessages; /* The number of messages in this event */ 172c60ec953SBarry Smith PetscLogDouble messageLength; /* The total message lengths in this event */ 173c60ec953SBarry Smith PetscLogDouble numReductions; /* The number of reductions in this event */ 174e3ed9ee7SBarry Smith PetscLogDouble memIncrease; /* How much the resident memory has increased in this event */ 175e3ed9ee7SBarry Smith PetscLogDouble mallocIncrease;/* How much the maximum malloced space has increased in this event */ 176e3ed9ee7SBarry Smith PetscLogDouble mallocSpace; /* How much the space was malloced and kept during this event */ 177e3ed9ee7SBarry Smith PetscLogDouble mallocIncreaseEvent; /* Maximum of the high water mark with in event minus memory available at the end of the event */ 178091bc5acSJunchao Zhang #if defined(PETSC_HAVE_DEVICE) 179bec0b493Shannah_mairs PetscLogDouble CpuToGpuCount; /* The total number of CPU to GPU copies */ 180bec0b493Shannah_mairs PetscLogDouble GpuToCpuCount; /* The total number of GPU to CPU copies */ 181bec0b493Shannah_mairs PetscLogDouble CpuToGpuSize; /* The total size of CPU to GPU copies */ 182bec0b493Shannah_mairs PetscLogDouble GpuToCpuSize; /* The total size of GPU to CPU copies */ 183958c4211Shannah_mairs PetscLogDouble GpuFlops; /* The flops done on a GPU in this event */ 184958c4211Shannah_mairs PetscLogDouble GpuTime; /* The time spent on a GPU in this event */ 185bec0b493Shannah_mairs #endif 186aa213bdcSJed Brown } PetscEventPerfInfo; 187c60ec953SBarry Smith 188aa213bdcSJed Brown typedef struct _n_PetscEventRegLog *PetscEventRegLog; 189aa213bdcSJed Brown struct _n_PetscEventRegLog { 1906a6a9b46SSatish Balay int numEvents; /* The number of registered events */ 1916a6a9b46SSatish Balay int maxEvents; /* The maximum number of events */ 192aa213bdcSJed Brown PetscEventRegInfo *eventInfo; /* The registration information for each event */ 1936a6a9b46SSatish Balay }; 1946a6a9b46SSatish Balay 195aa213bdcSJed Brown typedef struct _n_PetscEventPerfLog *PetscEventPerfLog; 196aa213bdcSJed Brown struct _n_PetscEventPerfLog { 1976a6a9b46SSatish Balay int numEvents; /* The number of logging events */ 1986a6a9b46SSatish Balay int maxEvents; /* The maximum number of events */ 199aa213bdcSJed Brown PetscEventPerfInfo *eventInfo; /* The performance information for each event */ 2006a6a9b46SSatish Balay }; 201c60ec953SBarry Smith /* ------------------------------------------------------------------------------------------------------------*/ 202c60ec953SBarry Smith /* 203aa213bdcSJed Brown PetscStageInfo - Contains all the information about a particular stage. 2046a6a9b46SSatish Balay 205aa213bdcSJed Brown PetscStageLog - An array of PetscStageInfo for each registered stage. There is a single one of these in the code. 206c60ec953SBarry Smith */ 207aa213bdcSJed Brown typedef struct _PetscStageInfo { 2086a6a9b46SSatish Balay char *name; /* The stage name */ 209ace3abfcSBarry Smith PetscBool used; /* The stage was pushed on this processor */ 210aa213bdcSJed Brown PetscEventPerfInfo perfInfo; /* The stage performance information */ 211aa213bdcSJed Brown PetscEventPerfLog eventLog; /* The event information for this stage */ 212aa213bdcSJed Brown PetscClassPerfLog classLog; /* The class information for this stage */ 213aa213bdcSJed Brown } PetscStageInfo; 2146a6a9b46SSatish Balay 215aa213bdcSJed Brown typedef struct _n_PetscStageLog *PetscStageLog; 216aa213bdcSJed Brown struct _n_PetscStageLog { 2176a6a9b46SSatish Balay int numStages; /* The number of registered stages */ 2186a6a9b46SSatish Balay int maxStages; /* The maximum number of stages */ 219aa213bdcSJed Brown PetscIntStack stack; /* The stack for active stages */ 220aa213bdcSJed Brown int curStage; /* The current stage (only used in macros so we don't call PetscIntStackTop) */ 221aa213bdcSJed Brown PetscStageInfo *stageInfo; /* The information for each stage */ 222aa213bdcSJed Brown PetscEventRegLog eventLog; /* The registered events */ 223aa213bdcSJed Brown PetscClassRegLog classLog; /* The registered classes */ 2246a6a9b46SSatish Balay }; 225217044c2SLisandro Dalcin /* -----------------------------------------------------------------------------------------------------*/ 226fee518ebSJed Brown 2273bb1ff40SBarry Smith PETSC_EXTERN PetscErrorCode PetscLogObjectParent(PetscObject,PetscObject); 2283bb1ff40SBarry Smith PETSC_EXTERN PetscErrorCode PetscLogObjectMemory(PetscObject,PetscLogDouble); 2293bb1ff40SBarry Smith 230aa482453SBarry Smith #if defined(PETSC_USE_LOG) /* --- Logging is turned on --------------------------------*/ 231aeeda9f6SJohn Fettig PETSC_EXTERN PetscStageLog petsc_stageLog; 232f5d6ab90SLisandro Dalcin PETSC_EXTERN PetscErrorCode PetscLogGetStageLog(PetscStageLog*); 233f5d6ab90SLisandro Dalcin PETSC_EXTERN PetscErrorCode PetscStageLogGetCurrent(PetscStageLog,int*); 234f5d6ab90SLisandro Dalcin PETSC_EXTERN PetscErrorCode PetscStageLogGetEventPerfLog(PetscStageLog,int,PetscEventPerfLog*); 235614700edSBarry Smith 236da63de55SLois Curfman McInnes /* 237da63de55SLois Curfman McInnes Flop counting: We count each arithmetic operation (e.g., addition, multiplication) separately. 238da63de55SLois Curfman McInnes 239da63de55SLois Curfman McInnes For the complex numbers version, note that 240da63de55SLois Curfman McInnes 1 complex addition = 2 flops 241da63de55SLois Curfman McInnes 1 complex multiplication = 6 flops, 242da63de55SLois Curfman McInnes where we define 1 flop as that for a double precision scalar. We roughly approximate 243da63de55SLois Curfman McInnes flop counting for complex numbers by multiplying the total flops by 4; this corresponds 244da63de55SLois Curfman McInnes to the assumption that we're counting mostly additions and multiplications -- and 245da63de55SLois Curfman McInnes roughly the same number of each. More accurate counting could be done by distinguishing 246da63de55SLois Curfman McInnes among the various arithmetic operations. 247da63de55SLois Curfman McInnes */ 248da63de55SLois Curfman McInnes 249aa482453SBarry Smith #if defined(PETSC_USE_COMPLEX) 250542d4b3fSSatish Balay #define PETSC_FLOPS_PER_OP 4.0 251da63de55SLois Curfman McInnes #else 252542d4b3fSSatish Balay #define PETSC_FLOPS_PER_OP 1.0 253bf3909cdSBarry Smith #endif 254bf3909cdSBarry Smith 255ca0c957dSBarry Smith /*@ 256ca0c957dSBarry Smith PetscLogFlops - Log how many flops are performed in a calculation 257ca0c957dSBarry Smith 258ca0c957dSBarry Smith Input Paramters: 259ca0c957dSBarry Smith flops - the number of flops 260ca0c957dSBarry Smith 261ca0c957dSBarry Smith Notes: 262ca0c957dSBarry Smith To limit the chance of integer overflow when multiplying by a constant, represent the constant as a double, 263ca0c957dSBarry Smith not an integer. Use PetscLogFlops(4.0*n) not PetscLogFlops(4*n) 264ca0c957dSBarry Smith 265ca0c957dSBarry Smith Level: intermediate 266ca0c957dSBarry Smith 26768481988SMark .seealso: PetscLogView(), PetscLogGpuFlops() 268ca0c957dSBarry Smith @*/ 269ca0c957dSBarry Smith 270dd19b90bSBarry Smith PETSC_STATIC_INLINE PetscErrorCode PetscLogFlops(PetscLogDouble n) 271dd19b90bSBarry Smith { 272dd19b90bSBarry Smith PetscFunctionBegin; 273bf3909cdSBarry Smith #if defined(PETSC_USE_DEBUG) 274dd19b90bSBarry Smith if (n < 0) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_OUTOFRANGE,"Cannot log negative flops"); 275da63de55SLois Curfman McInnes #endif 276dd19b90bSBarry Smith petsc_TotalFlops += PETSC_FLOPS_PER_OP*n; 277dd19b90bSBarry Smith PetscFunctionReturn(0); 278dd19b90bSBarry Smith } 279fa2bb9feSLisandro Dalcin 280091bc5acSJunchao Zhang #if defined(PETSC_HAVE_DEVICE) 2818df2f0b1SJunchao Zhang /* Global GPU counters */ 2828df2f0b1SJunchao Zhang PETSC_EXTERN PetscLogDouble petsc_ctog_ct; 2838df2f0b1SJunchao Zhang PETSC_EXTERN PetscLogDouble petsc_gtoc_ct; 2848df2f0b1SJunchao Zhang PETSC_EXTERN PetscLogDouble petsc_ctog_sz; 2858df2f0b1SJunchao Zhang PETSC_EXTERN PetscLogDouble petsc_gtoc_sz; 2868df2f0b1SJunchao Zhang PETSC_EXTERN PetscLogDouble petsc_gflops; 2878df2f0b1SJunchao Zhang PETSC_EXTERN PetscLogDouble petsc_gtime; 2888df2f0b1SJunchao Zhang #if defined(PETSC_USE_DEBUG) 2898df2f0b1SJunchao Zhang PETSC_EXTERN PetscBool petsc_gtime_inuse; 2908df2f0b1SJunchao Zhang #endif 2918df2f0b1SJunchao Zhang 2924db21f4bSStefano Zampini PETSC_STATIC_INLINE PetscErrorCode PetscLogCpuToGpu(PetscLogDouble size) 2934db21f4bSStefano Zampini { 294958c4211Shannah_mairs PetscFunctionBegin; 295bec0b493Shannah_mairs petsc_ctog_ct += 1; 296bec0b493Shannah_mairs petsc_ctog_sz += size; 297bec0b493Shannah_mairs PetscFunctionReturn(0); 298bec0b493Shannah_mairs } 2994db21f4bSStefano Zampini 3004db21f4bSStefano Zampini PETSC_STATIC_INLINE PetscErrorCode PetscLogGpuToCpu(PetscLogDouble size) 3014db21f4bSStefano Zampini { 302958c4211Shannah_mairs PetscFunctionBegin; 303bec0b493Shannah_mairs petsc_gtoc_ct += 1; 304bec0b493Shannah_mairs petsc_gtoc_sz += size; 305bec0b493Shannah_mairs PetscFunctionReturn(0); 306bec0b493Shannah_mairs } 3074db21f4bSStefano Zampini 30868481988SMark /*@ 30968481988SMark PetscLogGpuFlops - Log how many flops are performed in a calculation on the device 31068481988SMark 31168481988SMark Input Paramters: 31268481988SMark flops - the number of flops 31368481988SMark 31468481988SMark Notes: 31568481988SMark To limit the chance of integer overflow when multiplying by a constant, represent the constant as a double, 31668481988SMark not an integer. Use PetscLogFlops(4.0*n) not PetscLogFlops(4*n) 31768481988SMark 31868481988SMark Level: intermediate 31968481988SMark 32068481988SMark .seealso: PetscLogView(), PetscLogFlops(), PetscLogGpuTimeBegin(), PetscLogGpuTimeEnd() 32168481988SMark @*/ 3224db21f4bSStefano Zampini PETSC_STATIC_INLINE PetscErrorCode PetscLogGpuFlops(PetscLogDouble n) 3234db21f4bSStefano Zampini { 324958c4211Shannah_mairs PetscFunctionBegin; 325958c4211Shannah_mairs #if defined(PETSC_USE_DEBUG) 326958c4211Shannah_mairs if (n < 0) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_OUTOFRANGE,"Cannot log negative flops"); 327958c4211Shannah_mairs #endif 328958c4211Shannah_mairs petsc_TotalFlops += PETSC_FLOPS_PER_OP*n; 329958c4211Shannah_mairs petsc_gflops += PETSC_FLOPS_PER_OP*n; 330958c4211Shannah_mairs PetscFunctionReturn(0); 331958c4211Shannah_mairs } 3324db21f4bSStefano Zampini 3334db21f4bSStefano Zampini PETSC_STATIC_INLINE PetscErrorCode PetscLogGpuTimeAdd(PetscLogDouble t) 3344db21f4bSStefano Zampini { 3354db21f4bSStefano Zampini PetscFunctionBegin; 3364db21f4bSStefano Zampini petsc_gtime += t; 3374db21f4bSStefano Zampini PetscFunctionReturn(0); 3384db21f4bSStefano Zampini } 339*9ffd0706SHong Zhang 340*9ffd0706SHong Zhang PETSC_EXTERN PetscErrorCode PetscLogGpuTimeBegin(void); 341*9ffd0706SHong Zhang PETSC_EXTERN PetscErrorCode PetscLogGpuTimeEnd(void); 342bec0b493Shannah_mairs #endif 343bec0b493Shannah_mairs 344fa2bb9feSLisandro Dalcin PETSC_EXTERN PetscErrorCode PetscGetFlops(PetscLogDouble *); 34577c4ece6SBarry Smith 346aa482453SBarry Smith #if defined (PETSC_HAVE_MPE) 347014dd563SJed Brown PETSC_EXTERN PetscErrorCode PetscLogMPEBegin(void); 348014dd563SJed Brown PETSC_EXTERN PetscErrorCode PetscLogMPEDump(const char[]); 34977c4ece6SBarry Smith #endif 35077c4ece6SBarry Smith 351014dd563SJed Brown PETSC_EXTERN PetscErrorCode (*PetscLogPLB)(PetscLogEvent,int,PetscObject,PetscObject,PetscObject,PetscObject); 352014dd563SJed Brown PETSC_EXTERN PetscErrorCode (*PetscLogPLE)(PetscLogEvent,int,PetscObject,PetscObject,PetscObject,PetscObject); 353014dd563SJed Brown PETSC_EXTERN PetscErrorCode (*PetscLogPHC)(PetscObject); 354014dd563SJed Brown PETSC_EXTERN PetscErrorCode (*PetscLogPHD)(PetscObject); 35577c4ece6SBarry Smith 356e83a5d19SLisandro Dalcin #define PetscLogObjectParents(p,n,d) 0;do{int _i; for (_i=0; _i<(n); _i++) {ierr = PetscLogObjectParent((PetscObject)(p),(PetscObject)(d)[_i]);CHKERRQ(ierr);}}while (0) 357fa2bb9feSLisandro Dalcin #define PetscLogObjectCreate(h) ((PetscLogPHC) ? (*PetscLogPHC)((PetscObject)(h)) : 0) 358fa2bb9feSLisandro Dalcin #define PetscLogObjectDestroy(h) ((PetscLogPHD) ? (*PetscLogPHD)((PetscObject)(h)) : 0) 359fa2bb9feSLisandro Dalcin PETSC_EXTERN PetscErrorCode PetscLogObjectState(PetscObject, const char[], ...); 360fa2bb9feSLisandro Dalcin 3618ba1e511SMatthew Knepley /* Initialization functions */ 362bb1d7374SBarry Smith PETSC_EXTERN PetscErrorCode PetscLogDefaultBegin(void); 363014dd563SJed Brown PETSC_EXTERN PetscErrorCode PetscLogAllBegin(void); 364bb1d7374SBarry Smith PETSC_EXTERN PetscErrorCode PetscLogNestedBegin(void); 365014dd563SJed Brown PETSC_EXTERN PetscErrorCode PetscLogTraceBegin(FILE *); 366014dd563SJed Brown PETSC_EXTERN PetscErrorCode PetscLogActions(PetscBool); 367014dd563SJed Brown PETSC_EXTERN PetscErrorCode PetscLogObjects(PetscBool); 368fa2bb9feSLisandro Dalcin PETSC_EXTERN PetscErrorCode PetscLogSetThreshold(PetscLogDouble,PetscLogDouble*); 369014dd563SJed Brown PETSC_EXTERN PetscErrorCode PetscLogSet(PetscErrorCode (*)(int, int, PetscObject, PetscObject, PetscObject, PetscObject), 3706849ba73SBarry Smith PetscErrorCode (*)(int, int, PetscObject, PetscObject, PetscObject, PetscObject)); 371fa2bb9feSLisandro Dalcin 3728ba1e511SMatthew Knepley /* Output functions */ 373014dd563SJed Brown PETSC_EXTERN PetscErrorCode PetscLogView(PetscViewer); 374f14045dbSBarry Smith PETSC_EXTERN PetscErrorCode PetscLogViewFromOptions(void); 375014dd563SJed Brown PETSC_EXTERN PetscErrorCode PetscLogDump(const char[]); 37631d06abdSBarry Smith 377fa2bb9feSLisandro Dalcin /* Stage functions */ 378014dd563SJed Brown PETSC_EXTERN PetscErrorCode PetscLogStageRegister(const char[],PetscLogStage*); 379014dd563SJed Brown PETSC_EXTERN PetscErrorCode PetscLogStagePush(PetscLogStage); 380014dd563SJed Brown PETSC_EXTERN PetscErrorCode PetscLogStagePop(void); 381014dd563SJed Brown PETSC_EXTERN PetscErrorCode PetscLogStageSetActive(PetscLogStage,PetscBool); 382014dd563SJed Brown PETSC_EXTERN PetscErrorCode PetscLogStageGetActive(PetscLogStage,PetscBool*); 383014dd563SJed Brown PETSC_EXTERN PetscErrorCode PetscLogStageSetVisible(PetscLogStage,PetscBool); 384014dd563SJed Brown PETSC_EXTERN PetscErrorCode PetscLogStageGetVisible(PetscLogStage,PetscBool*); 385014dd563SJed Brown PETSC_EXTERN PetscErrorCode PetscLogStageGetId(const char[],PetscLogStage*); 386f5d6ab90SLisandro Dalcin 3878ba1e511SMatthew Knepley /* Event functions */ 388014dd563SJed Brown PETSC_EXTERN PetscErrorCode PetscLogEventRegister(const char[],PetscClassId,PetscLogEvent*); 389217044c2SLisandro Dalcin PETSC_EXTERN PetscErrorCode PetscLogEventSetCollective(PetscLogEvent,PetscBool); 390fa2bb9feSLisandro Dalcin PETSC_EXTERN PetscErrorCode PetscLogEventIncludeClass(PetscClassId); 391fa2bb9feSLisandro Dalcin PETSC_EXTERN PetscErrorCode PetscLogEventExcludeClass(PetscClassId); 392014dd563SJed Brown PETSC_EXTERN PetscErrorCode PetscLogEventActivate(PetscLogEvent); 393014dd563SJed Brown PETSC_EXTERN PetscErrorCode PetscLogEventDeactivate(PetscLogEvent); 394c00cb57fSBarry Smith PETSC_EXTERN PetscErrorCode PetscLogEventDeactivatePush(PetscLogEvent); 395c00cb57fSBarry Smith PETSC_EXTERN PetscErrorCode PetscLogEventDeactivatePop(PetscLogEvent); 396014dd563SJed Brown PETSC_EXTERN PetscErrorCode PetscLogEventSetActiveAll(PetscLogEvent,PetscBool); 397014dd563SJed Brown PETSC_EXTERN PetscErrorCode PetscLogEventActivateClass(PetscClassId); 398014dd563SJed Brown PETSC_EXTERN PetscErrorCode PetscLogEventDeactivateClass(PetscClassId); 3998c49a8d9SBarry Smith PETSC_EXTERN PetscErrorCode PetscLogEventGetId(const char[],PetscLogEvent*); 40013230571SMichael Lange PETSC_EXTERN PetscErrorCode PetscLogEventGetPerfInfo(int,PetscLogEvent,PetscEventPerfInfo*); 401891e75beSMatthew G. Knepley PETSC_EXTERN PetscErrorCode PetscLogEventSetDof(PetscLogEvent, PetscInt, PetscLogDouble); 4025d68e14cSMatthew G. Knepley PETSC_EXTERN PetscErrorCode PetscLogEventSetError(PetscLogEvent, PetscInt, PetscLogDouble); 4038ba1e511SMatthew Knepley 4048ba1e511SMatthew Knepley /* Global counters */ 405014dd563SJed Brown PETSC_EXTERN PetscLogDouble petsc_irecv_ct; 406014dd563SJed Brown PETSC_EXTERN PetscLogDouble petsc_isend_ct; 407014dd563SJed Brown PETSC_EXTERN PetscLogDouble petsc_recv_ct; 408014dd563SJed Brown PETSC_EXTERN PetscLogDouble petsc_send_ct; 409014dd563SJed Brown PETSC_EXTERN PetscLogDouble petsc_irecv_len; 410014dd563SJed Brown PETSC_EXTERN PetscLogDouble petsc_isend_len; 411014dd563SJed Brown PETSC_EXTERN PetscLogDouble petsc_recv_len; 412014dd563SJed Brown PETSC_EXTERN PetscLogDouble petsc_send_len; 413014dd563SJed Brown PETSC_EXTERN PetscLogDouble petsc_allreduce_ct; 414014dd563SJed Brown PETSC_EXTERN PetscLogDouble petsc_gather_ct; 415014dd563SJed Brown PETSC_EXTERN PetscLogDouble petsc_scatter_ct; 416014dd563SJed Brown PETSC_EXTERN PetscLogDouble petsc_wait_ct; 417014dd563SJed Brown PETSC_EXTERN PetscLogDouble petsc_wait_any_ct; 418014dd563SJed Brown PETSC_EXTERN PetscLogDouble petsc_wait_all_ct; 419014dd563SJed Brown PETSC_EXTERN PetscLogDouble petsc_sum_of_waits_ct; 4208ba1e511SMatthew Knepley 421e3ed9ee7SBarry Smith PETSC_EXTERN PetscBool PetscLogMemory; 422e3ed9ee7SBarry Smith 423fa2bb9feSLisandro Dalcin PETSC_EXTERN PetscBool PetscLogSyncOn; /* true if logging synchronization is enabled */ 42462872c28SLisandro Dalcin PETSC_EXTERN PetscErrorCode PetscLogEventSynchronize(PetscLogEvent, MPI_Comm); 42562872c28SLisandro Dalcin 42662872c28SLisandro Dalcin #define PetscLogEventSync(e,comm) \ 42762872c28SLisandro Dalcin (((PetscLogPLB && petsc_stageLog->stageInfo[petsc_stageLog->curStage].perfInfo.active && petsc_stageLog->stageInfo[petsc_stageLog->curStage].eventLog->eventInfo[e].active) ? \ 42862872c28SLisandro Dalcin PetscLogEventSynchronize((e),(comm)) : 0)) 42977c4ece6SBarry Smith 43052e6d16bSBarry Smith #define PetscLogEventBegin(e,o1,o2,o3,o4) \ 4318b5db460SBarry Smith (((PetscLogPLB && petsc_stageLog->stageInfo[petsc_stageLog->curStage].perfInfo.active && petsc_stageLog->stageInfo[petsc_stageLog->curStage].eventLog->eventInfo[e].active) ? \ 432495fc317SBarry Smith (*PetscLogPLB)((e),0,(PetscObject)(o1),(PetscObject)(o2),(PetscObject)(o3),(PetscObject)(o4)) : 0)) 433043328b6SSatish Balay 43452e6d16bSBarry Smith #define PetscLogEventEnd(e,o1,o2,o3,o4) \ 4358b5db460SBarry Smith (((PetscLogPLE && petsc_stageLog->stageInfo[petsc_stageLog->curStage].perfInfo.active && petsc_stageLog->stageInfo[petsc_stageLog->curStage].eventLog->eventInfo[e].active) ? \ 436495fc317SBarry Smith (*PetscLogPLE)((e),0,(PetscObject)(o1),(PetscObject)(o2),(PetscObject)(o3),(PetscObject)(o4)) : 0)) 43777c4ece6SBarry Smith 438014dd563SJed Brown PETSC_EXTERN PetscErrorCode PetscLogEventGetFlops(PetscLogEvent,PetscLogDouble*); 439014dd563SJed Brown PETSC_EXTERN PetscErrorCode PetscLogEventZeroFlops(PetscLogEvent); 440003131ecSBarry Smith 441ce85283eSBarry Smith /* 442f621e05eSBarry Smith These are used internally in the PETSc routines to keep a count of MPI messages and 443f621e05eSBarry Smith their sizes. 444f621e05eSBarry Smith 445af0996ceSBarry Smith This does not work for MPI-Uni because our include/petsc/mpiuni/mpi.h file 446ce85283eSBarry Smith uses macros to defined the MPI operations. 44715308354SBarry Smith 44815308354SBarry Smith It does not work correctly from HP-UX because it processes the 449bb4af37aSBarry Smith macros in a way that sometimes it double counts, hence 450b6410449SSatish Balay PETSC_HAVE_BROKEN_RECURSIVE_MACRO 4517c1e34a4SSatish Balay 452f569fd43SBarry Smith It does not work with Windows because winmpich lacks MPI_Type_size() 453ce85283eSBarry Smith */ 454c9b973beSBarry Smith #if !defined(MPIUNI_H) && !defined(PETSC_HAVE_BROKEN_RECURSIVE_MACRO) && !defined (PETSC_HAVE_MPI_MISSING_TYPESIZE) 45577a39924SBarry Smith /* 45677a39924SBarry Smith Logging of MPI activities 45777a39924SBarry Smith */ 458b23bfdefSJunchao Zhang PETSC_STATIC_INLINE PetscErrorCode PetscMPITypeSize(PetscInt count,MPI_Datatype type,PetscLogDouble *length) 459f95db71bSBarry Smith { 460f12d10ccSJunchao Zhang PetscMPIInt typesize; 461f12d10ccSJunchao Zhang PetscErrorCode ierr; 4627d30fa4aSBarry Smith if (type == MPI_DATATYPE_NULL) return 0; 46355b25c41SPierre Jolivet ierr = MPI_Type_size(type,&typesize);CHKERRMPI(ierr); 464f12d10ccSJunchao Zhang *length += (PetscLogDouble) (count*typesize); 4659c72ff1eSSatish Balay return 0; 466f95db71bSBarry Smith } 46777a39924SBarry Smith 468f12d10ccSJunchao Zhang PETSC_STATIC_INLINE PetscErrorCode PetscMPITypeSizeComm(MPI_Comm comm,const PetscMPIInt *counts,MPI_Datatype type,PetscLogDouble *length) 4693b9284c0SMatthew G Knepley { 470f12d10ccSJunchao Zhang PetscMPIInt typesize,size,p; 471f12d10ccSJunchao Zhang PetscErrorCode ierr; 4723b9284c0SMatthew G Knepley 4737d30fa4aSBarry Smith if (type == MPI_DATATYPE_NULL) return 0; 474ffc4695bSBarry Smith ierr = MPI_Comm_size(comm,&size);CHKERRMPI(ierr); 475ffc4695bSBarry Smith ierr = MPI_Type_size(type,&typesize);CHKERRMPI(ierr); 476f12d10ccSJunchao Zhang for (p=0; p<size; ++p) { 477f12d10ccSJunchao Zhang *length += (PetscLogDouble) (counts[p]*typesize); 478f12d10ccSJunchao Zhang } 479f12d10ccSJunchao Zhang return 0; 480f12d10ccSJunchao Zhang } 481f12d10ccSJunchao Zhang 482f12d10ccSJunchao Zhang PETSC_STATIC_INLINE PetscErrorCode PetscMPITypeSizeCount(PetscInt n,const PetscMPIInt *counts,MPI_Datatype type,PetscLogDouble *length) 483f12d10ccSJunchao Zhang { 484f12d10ccSJunchao Zhang PetscMPIInt typesize,p; 485f12d10ccSJunchao Zhang PetscErrorCode ierr; 486f12d10ccSJunchao Zhang 487f12d10ccSJunchao Zhang if (type == MPI_DATATYPE_NULL) return 0; 488ffc4695bSBarry Smith ierr = MPI_Type_size(type,&typesize);CHKERRMPI(ierr); 489f12d10ccSJunchao Zhang for (p=0; p<n; ++p) { 490f12d10ccSJunchao Zhang *length += (PetscLogDouble) (counts[p]*typesize); 4913b9284c0SMatthew G Knepley } 4923b9284c0SMatthew G Knepley return 0; 4933b9284c0SMatthew G Knepley } 4943b9284c0SMatthew G Knepley 49572b11a25SBarry Smith /* 49672b11a25SBarry Smith Returns 1 if the communicator is parallel else zero 49772b11a25SBarry Smith */ 49872b11a25SBarry Smith PETSC_STATIC_INLINE int PetscMPIParallelComm(MPI_Comm comm) 49972b11a25SBarry Smith { 50072b11a25SBarry Smith PetscMPIInt size; MPI_Comm_size(comm,&size); return size > 1; 50172b11a25SBarry Smith } 50272b11a25SBarry Smith 50377a39924SBarry Smith #define MPI_Irecv(buf,count,datatype,source,tag,comm,request) \ 504f12d10ccSJunchao Zhang ((petsc_irecv_ct++,0) || PetscMPITypeSize((count),(datatype),&(petsc_irecv_len)) || MPI_Irecv((buf),(count),(datatype),(source),(tag),(comm),(request))) 50515308354SBarry Smith 50677a39924SBarry Smith #define MPI_Isend(buf,count,datatype,dest,tag,comm,request) \ 507f12d10ccSJunchao Zhang ((petsc_isend_ct++,0) || PetscMPITypeSize((count),(datatype),&(petsc_isend_len)) || MPI_Isend((buf),(count),(datatype),(dest),(tag),(comm),(request))) 50815308354SBarry Smith 509457b14b1SJunchao Zhang #define MPI_Startall_irecv(count,datatype,number,requests) \ 510f12d10ccSJunchao Zhang ((petsc_irecv_ct += (PetscLogDouble)(number),0) || PetscMPITypeSize((count),(datatype),&(petsc_irecv_len)) || ((number) && MPI_Startall((number),(requests)))) 5110d4b0b6cSBarry Smith 512457b14b1SJunchao Zhang #define MPI_Startall_isend(count,datatype,number,requests) \ 513f12d10ccSJunchao Zhang ((petsc_isend_ct += (PetscLogDouble)(number),0) || PetscMPITypeSize((count),(datatype),&(petsc_isend_len)) || ((number) && MPI_Startall((number),(requests)))) 5140d4b0b6cSBarry Smith 515457b14b1SJunchao Zhang #define MPI_Start_isend(count,datatype,requests) \ 516f12d10ccSJunchao Zhang ((petsc_isend_ct++,0) || PetscMPITypeSize((count),(datatype),(&petsc_isend_len)) || MPI_Start((requests))) 5170d4b0b6cSBarry Smith 518ce85283eSBarry Smith #define MPI_Recv(buf,count,datatype,source,tag,comm,status) \ 519f12d10ccSJunchao Zhang ((petsc_recv_ct++,0) || PetscMPITypeSize((count),(datatype),(&petsc_recv_len)) || MPI_Recv((buf),(count),(datatype),(source),(tag),(comm),(status))) 52015308354SBarry Smith 52177a39924SBarry Smith #define MPI_Send(buf,count,datatype,dest,tag,comm) \ 522f12d10ccSJunchao Zhang ((petsc_send_ct++,0) || PetscMPITypeSize((count),(datatype),(&petsc_send_len)) || MPI_Send((buf),(count),(datatype),(dest),(tag),(comm))) 52377a39924SBarry Smith 52477a39924SBarry Smith #define MPI_Wait(request,status) \ 5255fa69175SJed Brown ((petsc_wait_ct++,petsc_sum_of_waits_ct++,0) || MPI_Wait((request),(status))) 52677a39924SBarry Smith 52777a39924SBarry Smith #define MPI_Waitany(a,b,c,d) \ 5285fa69175SJed Brown ((petsc_wait_any_ct++,petsc_sum_of_waits_ct++,0) || MPI_Waitany((a),(b),(c),(d))) 52977a39924SBarry Smith 53077a39924SBarry Smith #define MPI_Waitall(count,array_of_requests,array_of_statuses) \ 5315fa69175SJed Brown ((petsc_wait_all_ct++,petsc_sum_of_waits_ct += (PetscLogDouble) (count),0) || MPI_Waitall((count),(array_of_requests),(array_of_statuses))) 53277a39924SBarry Smith 53377a39924SBarry Smith #define MPI_Allreduce(sendbuf,recvbuf,count,datatype,op,comm) \ 534df05ca09SBarry Smith (petsc_allreduce_ct += PetscMPIParallelComm((comm)),MPI_Allreduce((sendbuf),(recvbuf),(count),(datatype),(op),(comm))) 5353914022bSBarry Smith 53654fe5c21SBarry Smith #define MPI_Bcast(buffer,count,datatype,root,comm) \ 5375fa69175SJed Brown ((petsc_allreduce_ct += PetscMPIParallelComm((comm)),0) || MPI_Bcast((buffer),(count),(datatype),(root),(comm))) 53854fe5c21SBarry Smith 539d6e4c47cSJed Brown #define MPI_Reduce_scatter_block(sendbuf,recvbuf,recvcount,datatype,op,comm) \ 5405fa69175SJed Brown ((petsc_allreduce_ct += PetscMPIParallelComm((comm)),0) || MPI_Reduce_scatter_block((sendbuf),(recvbuf),(recvcount),(datatype),(op),(comm))) 541d6e4c47cSJed Brown 5423b9284c0SMatthew G Knepley #define MPI_Alltoall(sendbuf,sendcount,sendtype,recvbuf,recvcount,recvtype,comm) \ 543f12d10ccSJunchao Zhang ((petsc_allreduce_ct += PetscMPIParallelComm((comm)),0) || PetscMPITypeSize((sendcount),(sendtype),(&petsc_send_len)) || MPI_Alltoall((sendbuf),(sendcount),(sendtype),(recvbuf),(recvcount),(recvtype),(comm))) 5443b9284c0SMatthew G Knepley 5453b9284c0SMatthew G Knepley #define MPI_Alltoallv(sendbuf,sendcnts,sdispls,sendtype,recvbuf,recvcnts,rdispls,recvtype,comm) \ 546f12d10ccSJunchao 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))) 5473b9284c0SMatthew G Knepley 54801faf4e4SMatthew Knepley #define MPI_Allgather(sendbuf,sendcount,sendtype,recvbuf,recvcount,recvtype,comm) \ 5495fa69175SJed Brown ((petsc_gather_ct += PetscMPIParallelComm((comm)),0) || MPI_Allgather((sendbuf),(sendcount),(sendtype),(recvbuf),(recvcount),(recvtype),(comm))) 55001faf4e4SMatthew Knepley 55101faf4e4SMatthew Knepley #define MPI_Allgatherv(sendbuf,sendcount,sendtype,recvbuf,recvcount,displs,recvtype,comm) \ 5525fa69175SJed Brown ((petsc_gather_ct += PetscMPIParallelComm((comm)),0) || MPI_Allgatherv((sendbuf),(sendcount),(sendtype),(recvbuf),(recvcount),(displs),(recvtype),(comm))) 55301faf4e4SMatthew Knepley 55401faf4e4SMatthew Knepley #define MPI_Gather(sendbuf,sendcount,sendtype,recvbuf,recvcount,recvtype,root,comm) \ 555f12d10ccSJunchao Zhang ((petsc_gather_ct++,0) || PetscMPITypeSize((sendcount),(sendtype),(&petsc_send_len)) || MPI_Gather((sendbuf),(sendcount),(sendtype),(recvbuf),(recvcount),(recvtype),(root),(comm))) 55601faf4e4SMatthew Knepley 55701faf4e4SMatthew Knepley #define MPI_Gatherv(sendbuf,sendcount,sendtype,recvbuf,recvcount,displs,recvtype,root,comm) \ 558f12d10ccSJunchao Zhang ((petsc_gather_ct++,0) || PetscMPITypeSize((sendcount),(sendtype),(&petsc_send_len)) || MPI_Gatherv((sendbuf),(sendcount),(sendtype),(recvbuf),(recvcount),(displs),(recvtype),(root),(comm))) 55901faf4e4SMatthew Knepley 56001faf4e4SMatthew Knepley #define MPI_Scatter(sendbuf,sendcount,sendtype,recvbuf,recvcount,recvtype,root,comm) \ 561f12d10ccSJunchao Zhang ((petsc_scatter_ct++,0) || PetscMPITypeSize((recvcount),(recvtype),(&petsc_recv_len)) || MPI_Scatter((sendbuf),(sendcount),(sendtype),(recvbuf),(recvcount),(recvtype),(root),(comm))) 56201faf4e4SMatthew Knepley 56301faf4e4SMatthew Knepley #define MPI_Scatterv(sendbuf,sendcount,displs,sendtype,recvbuf,recvcount,recvtype,root,comm) \ 564f12d10ccSJunchao Zhang ((petsc_scatter_ct++,0) || PetscMPITypeSize((recvcount),(recvtype),(&petsc_recv_len)) || MPI_Scatterv((sendbuf),(sendcount),(displs),(sendtype),(recvbuf),(recvcount),(recvtype),(root),(comm))) 565f12d10ccSJunchao Zhang 566f12d10ccSJunchao Zhang #define MPI_Ialltoall(sendbuf,sendcount,sendtype,recvbuf,recvcount,recvtype,comm,request) \ 567f12d10ccSJunchao Zhang ((petsc_allreduce_ct += PetscMPIParallelComm((comm)),0) || PetscMPITypeSize((sendcount),(sendtype),(&petsc_send_len)) || MPI_Ialltoall((sendbuf),(sendcount),(sendtype),(recvbuf),(recvcount),(recvtype),(comm),(request))) 568f12d10ccSJunchao Zhang 569f12d10ccSJunchao Zhang #define MPI_Ialltoallv(sendbuf,sendcnts,sdispls,sendtype,recvbuf,recvcnts,rdispls,recvtype,comm,request) \ 570f12d10ccSJunchao 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))) 571f12d10ccSJunchao Zhang 572f12d10ccSJunchao Zhang #define MPI_Iallgather(sendbuf,sendcount,sendtype,recvbuf,recvcount,recvtype,comm,request) \ 573f12d10ccSJunchao Zhang ((petsc_gather_ct += PetscMPIParallelComm((comm)),0) || MPI_Iallgather((sendbuf),(sendcount),(sendtype),(recvbuf),(recvcount),(recvtype),(comm),(request))) 574f12d10ccSJunchao Zhang 575f12d10ccSJunchao Zhang #define MPI_Iallgatherv(sendbuf,sendcount,sendtype,recvbuf,recvcount,displs,recvtype,comm,request) \ 576f12d10ccSJunchao Zhang ((petsc_gather_ct += PetscMPIParallelComm((comm)),0) || MPI_Iallgatherv((sendbuf),(sendcount),(sendtype),(recvbuf),(recvcount),(displs),(recvtype),(comm),(request))) 577f12d10ccSJunchao Zhang 578f12d10ccSJunchao Zhang #define MPI_Igather(sendbuf,sendcount,sendtype,recvbuf,recvcount,recvtype,root,comm,request) \ 579f12d10ccSJunchao Zhang ((petsc_gather_ct++,0) || PetscMPITypeSize((sendcount),(sendtype),(&petsc_send_len)) || MPI_Igather((sendbuf),(sendcount),(sendtype),(recvbuf),(recvcount),(recvtype),(root),(comm),(request))) 580f12d10ccSJunchao Zhang 581f12d10ccSJunchao Zhang #define MPI_Igatherv(sendbuf,sendcount,sendtype,recvbuf,recvcount,displs,recvtype,root,comm,request) \ 582f12d10ccSJunchao Zhang ((petsc_gather_ct++,0) || PetscMPITypeSize((sendcount),(sendtype),(&petsc_send_len)) || MPI_Igatherv((sendbuf),(sendcount),(sendtype),(recvbuf),(recvcount),(displs),(recvtype),(root),(comm),(request))) 583f12d10ccSJunchao Zhang 584f12d10ccSJunchao Zhang #define MPI_Iscatter(sendbuf,sendcount,sendtype,recvbuf,recvcount,recvtype,root,comm,request) \ 585f12d10ccSJunchao Zhang ((petsc_scatter_ct++,0) || PetscMPITypeSize((recvcount),(recvtype),(&petsc_recv_len)) || MPI_Iscatter((sendbuf),(sendcount),(sendtype),(recvbuf),(recvcount),(recvtype),(root),(comm),(request))) 586f12d10ccSJunchao Zhang 587f12d10ccSJunchao Zhang #define MPI_Iscatterv(sendbuf,sendcount,displs,sendtype,recvbuf,recvcount,recvtype,root,comm,request) \ 588f12d10ccSJunchao Zhang ((petsc_scatter_ct++,0) || PetscMPITypeSize((recvcount),(recvtype),(&petsc_recv_len)) || MPI_Iscatterv((sendbuf),(sendcount),(displs),(sendtype),(recvbuf),(recvcount),(recvtype),(root),(comm),(request))) 589f12d10ccSJunchao Zhang 590f12d10ccSJunchao Zhang /* We treat MPI_Ineighbor_alltoallv as a set of isend/irecv instead of a traditional MPI collective. 591f12d10ccSJunchao Zhang OpenMPI-3.0 ran into error with outdegree = indegree = 0, so we use ((outdegree) || (indegree)) as a workaround. 592f12d10ccSJunchao Zhang */ 593f12d10ccSJunchao Zhang #define MPI_Start_ineighbor_alltoallv(outdegree,indegree,sendbuf,sendcnts,sdispls,sendtype,recvbuf,recvcnts,rdispls,recvtype,comm,request) \ 594f12d10ccSJunchao Zhang ((petsc_isend_ct += (PetscLogDouble)(outdegree),0) || (petsc_irecv_ct += (PetscLogDouble)(indegree),0) || PetscMPITypeSizeCount((outdegree),(sendcnts),(sendtype),(&petsc_isend_len)) || PetscMPITypeSizeCount((indegree),(recvcnts),(recvtype),(&petsc_irecv_len)) || (((outdegree) || (indegree)) && MPI_Ineighbor_alltoallv((sendbuf),(sendcnts),(sdispls),(sendtype),(recvbuf),(recvcnts),(rdispls),(recvtype),(comm),(request)))) 595f12d10ccSJunchao Zhang 596f12d10ccSJunchao Zhang #define MPI_Start_neighbor_alltoallv(outdegree,indegree,sendbuf,sendcnts,sdispls,sendtype,recvbuf,recvcnts,rdispls,recvtype,comm) \ 597f12d10ccSJunchao Zhang ((petsc_isend_ct += (PetscLogDouble)(outdegree),0) || (petsc_irecv_ct += (PetscLogDouble)(indegree),0) || PetscMPITypeSizeCount((outdegree),(sendcnts),(sendtype),(&petsc_isend_len)) || PetscMPITypeSizeCount((indegree),(recvcnts),(recvtype),(&petsc_irecv_len)) || (((outdegree) || (indegree)) && MPI_Neighbor_alltoallv((sendbuf),(sendcnts),(sdispls),(sendtype),(recvbuf),(recvcnts),(rdispls),(recvtype),(comm)))) 59801faf4e4SMatthew Knepley 5990d4b0b6cSBarry Smith #else 6000d4b0b6cSBarry Smith 601457b14b1SJunchao Zhang #define MPI_Startall_irecv(count,datatype,number,requests) \ 602ea1c87f7SJunchao Zhang ((number) && MPI_Startall((number),(requests))) 6030d4b0b6cSBarry Smith 604457b14b1SJunchao Zhang #define MPI_Startall_isend(count,datatype,number,requests) \ 605ea1c87f7SJunchao Zhang ((number) && MPI_Startall((number),(requests))) 6060d4b0b6cSBarry Smith 607457b14b1SJunchao Zhang #define MPI_Start_isend(count,datatype,requests) \ 6085fa69175SJed Brown (MPI_Start((requests))) 6090d4b0b6cSBarry Smith 610f12d10ccSJunchao Zhang #define MPI_Start_ineighbor_alltoallv(outdegree,indegree,sendbuf,sendcnts,sdispls,sendtype,recvbuf,recvcnts,rdispls,recvtype,comm,request) \ 611f12d10ccSJunchao Zhang (((outdegree) || (indegree)) && MPI_Ineighbor_alltoallv((sendbuf),(sendcnts),(sdispls),(sendtype),(recvbuf),(recvcnts),(rdispls),(recvtype),(comm),(request))) 612f12d10ccSJunchao Zhang 613f12d10ccSJunchao Zhang #define MPI_Start_neighbor_alltoallv(outdegree,indegree,sendbuf,sendcnts,sdispls,sendtype,recvbuf,recvcnts,rdispls,recvtype,comm) \ 614f12d10ccSJunchao Zhang (((outdegree) || (indegree)) && MPI_Neighbor_alltoallv((sendbuf),(sendcnts),(sdispls),(sendtype),(recvbuf),(recvcnts),(rdispls),(recvtype),(comm))) 615df05ca09SBarry Smith 616c9b973beSBarry Smith #endif /* !MPIUNI_H && ! PETSC_HAVE_BROKEN_RECURSIVE_MACRO */ 617614700edSBarry Smith 618df8cf0b5SBarry Smith #else /* ---Logging is turned off --------------------------------------------*/ 619614700edSBarry Smith 620e3ed9ee7SBarry Smith #define PetscLogMemory PETSC_FALSE 621e3ed9ee7SBarry Smith 622b0a32e0cSBarry Smith #define PetscLogFlops(n) 0 623fa2bb9feSLisandro Dalcin #define PetscGetFlops(a) (*(a) = 0.0,0) 624614700edSBarry Smith 625fa2bb9feSLisandro Dalcin #define PetscLogStageRegister(a,b) 0 626fa2bb9feSLisandro Dalcin #define PetscLogStagePush(a) 0 627fa2bb9feSLisandro Dalcin #define PetscLogStagePop() 0 628f5d6ab90SLisandro Dalcin #define PetscLogStageSetActive(a,b) 0 629f5d6ab90SLisandro Dalcin #define PetscLogStageGetActive(a,b) 0 630f5d6ab90SLisandro Dalcin #define PetscLogStageGetVisible(a,b) 0 631f5d6ab90SLisandro Dalcin #define PetscLogStageSetVisible(a,b) 0 632f5d6ab90SLisandro Dalcin #define PetscLogStageGetId(a,b) (*(b)=0,0) 633f5d6ab90SLisandro Dalcin 634fa2bb9feSLisandro Dalcin #define PetscLogEventRegister(a,b,c) 0 635fa2bb9feSLisandro Dalcin #define PetscLogEventSetCollective(a,b) 0 636fa2bb9feSLisandro Dalcin #define PetscLogEventIncludeClass(a) 0 637fa2bb9feSLisandro Dalcin #define PetscLogEventExcludeClass(a) 0 638b0a32e0cSBarry Smith #define PetscLogEventActivate(a) 0 639b0a32e0cSBarry Smith #define PetscLogEventDeactivate(a) 0 640c00cb57fSBarry Smith #define PetscLogEventDeactivatePush(a) 0 641c00cb57fSBarry Smith #define PetscLogEventDeactivatePop(a) 0 642b0a32e0cSBarry Smith #define PetscLogEventActivateClass(a) 0 643b0a32e0cSBarry Smith #define PetscLogEventDeactivateClass(a) 0 644e8e7597cSSatish Balay #define PetscLogEventSetActiveAll(a,b) 0 64546eb3cd7SSatish Balay #define PetscLogEventGetId(a,b) (*(b)=0,0) 646561b2a67SSatish Balay #define PetscLogEventGetPerfInfo(a,b,c) 0 6479c702cfcSMatthew G. Knepley #define PetscLogEventSetDof(a,b,c) 0 6489c702cfcSMatthew G. Knepley #define PetscLogEventSetError(a,b,c) 0 64977c4ece6SBarry Smith 6508b5db460SBarry Smith #define PetscLogPLB 0 6518b5db460SBarry Smith #define PetscLogPLE 0 6528b5db460SBarry Smith #define PetscLogPHC 0 6538b5db460SBarry Smith #define PetscLogPHD 0 654f5d6ab90SLisandro Dalcin 655efee365bSSatish Balay #define PetscLogObjectParents(p,n,c) 0 65652e6d16bSBarry Smith #define PetscLogObjectCreate(h) 0 65752e6d16bSBarry Smith #define PetscLogObjectDestroy(h) 0 658fa2bb9feSLisandro Dalcin PETSC_EXTERN PetscErrorCode PetscLogObjectState(PetscObject,const char[],...); 659fa2bb9feSLisandro Dalcin 660bb1d7374SBarry Smith #define PetscLogDefaultBegin() 0 661b0a32e0cSBarry Smith #define PetscLogAllBegin() 0 662bb1d7374SBarry Smith #define PetscLogNestedBegin() 0 663fa2bb9feSLisandro Dalcin #define PetscLogTraceBegin(file) 0 66473fda44aSBarry Smith #define PetscLogActions(a) 0 665fa2bb9feSLisandro Dalcin #define PetscLogObjects(a) 0 666fa2bb9feSLisandro Dalcin #define PetscLogSetThreshold(a,b) 0 667fa2bb9feSLisandro Dalcin #define PetscLogSet(lb,le) 0 668fa2bb9feSLisandro Dalcin 669fa2bb9feSLisandro Dalcin #define PetscLogView(viewer) 0 670fa2bb9feSLisandro Dalcin #define PetscLogViewFromOptions() 0 671fa2bb9feSLisandro Dalcin #define PetscLogDump(c) 0 672fa2bb9feSLisandro Dalcin 67362872c28SLisandro Dalcin #define PetscLogEventSync(e,comm) 0 674fa2bb9feSLisandro Dalcin #define PetscLogEventBegin(e,o1,o2,o3,o4) 0 675fa2bb9feSLisandro Dalcin #define PetscLogEventEnd(e,o1,o2,o3,o4) 0 676ce6058e1SBarry Smith 677091bc5acSJunchao Zhang #if defined(PETSC_HAVE_DEVICE) 6788157aad8SJunchao Zhang #define PetscLogCpuToGpu(a) 0 6798157aad8SJunchao Zhang #define PetscLogGpuToCpu(a) 0 6808157aad8SJunchao Zhang #define PetscLogGpuFlops(a) 0 6818157aad8SJunchao Zhang #define PetscLogGpuTimeBegin() 0 6828157aad8SJunchao Zhang #define PetscLogGpuTimeEnd() 0 6838157aad8SJunchao Zhang #define PetscLogGpuTimeAdd(a) 0 6848df2f0b1SJunchao Zhang #endif 6858157aad8SJunchao Zhang 686aa482453SBarry Smith /* If PETSC_USE_LOG is NOT defined, these still need to be! */ 687ea1c87f7SJunchao Zhang #define MPI_Startall_irecv(count,datatype,number,requests) ((number) && MPI_Startall(number,requests)) 688ea1c87f7SJunchao Zhang #define MPI_Startall_isend(count,datatype,number,requests) ((number) && MPI_Startall(number,requests)) 689457b14b1SJunchao Zhang #define MPI_Start_isend(count,datatype,requests) MPI_Start(requests) 690f12d10ccSJunchao Zhang #define MPI_Start_ineighbor_alltoallv(outdegree,indegree,sendbuf,sendcnts,sdispls,sendtype,recvbuf,recvcnts,rdispls,recvtype,comm,request) \ 691f12d10ccSJunchao Zhang (((outdegree) || (indegree)) && MPI_Ineighbor_alltoallv((sendbuf),(sendcnts),(sdispls),(sendtype),(recvbuf),(recvcnts),(rdispls),(recvtype),(comm),(request))) 692f12d10ccSJunchao Zhang #define MPI_Start_neighbor_alltoallv(outdegree,indegree,sendbuf,sendcnts,sdispls,sendtype,recvbuf,recvcnts,rdispls,recvtype,comm) \ 693f12d10ccSJunchao Zhang (((outdegree) || (indegree)) && MPI_Neighbor_alltoallv((sendbuf),(sendcnts),(sdispls),(sendtype),(recvbuf),(recvcnts),(rdispls),(recvtype),(comm))) 694f141ce34SMatthew Knepley 695aa482453SBarry Smith #endif /* PETSC_USE_LOG */ 6966daaf66cSBarry Smith 697204a6943SJed Brown #define PetscPreLoadBegin(flag,name) \ 698204a6943SJed Brown do {\ 699204a6943SJed Brown PetscBool PetscPreLoading = flag;\ 700204a6943SJed Brown int PetscPreLoadMax,PetscPreLoadIt;\ 701166c7f25SBarry Smith PetscLogStage _stageNum;\ 7028cbcd9ccSBarry Smith PetscErrorCode _3_ierr; \ 703c5929fdfSBarry Smith _3_ierr = PetscOptionsGetBool(NULL,NULL,"-preload",&PetscPreLoading,NULL);CHKERRQ(_3_ierr); \ 704204a6943SJed Brown PetscPreLoadMax = (int)(PetscPreLoading);\ 705204a6943SJed Brown PetscPreLoadingUsed = PetscPreLoading ? PETSC_TRUE : PetscPreLoadingUsed;\ 706204a6943SJed Brown for (PetscPreLoadIt=0; PetscPreLoadIt<=PetscPreLoadMax; PetscPreLoadIt++) {\ 707204a6943SJed Brown PetscPreLoadingOn = PetscPreLoading;\ 7080298fd71SBarry Smith _3_ierr = PetscBarrier(NULL);CHKERRQ(_3_ierr);\ 709204a6943SJed Brown if (PetscPreLoadIt>0) {\ 7108e58c17dSMatthew Knepley _3_ierr = PetscLogStageGetId(name,&_stageNum);CHKERRQ(_3_ierr);\ 7118e58c17dSMatthew Knepley } else {\ 712a3bc4eb9SBarry Smith _3_ierr = PetscLogStageRegister(name,&_stageNum);CHKERRQ(_3_ierr); \ 7138e58c17dSMatthew Knepley }\ 714204a6943SJed Brown _3_ierr = PetscLogStageSetActive(_stageNum,(PetscBool)(!PetscPreLoadMax || PetscPreLoadIt));\ 7158e58c17dSMatthew Knepley _3_ierr = PetscLogStagePush(_stageNum);CHKERRQ(_3_ierr); 7168e58c17dSMatthew Knepley 717204a6943SJed Brown #define PetscPreLoadEnd() \ 718043328b6SSatish Balay _3_ierr = PetscLogStagePop();CHKERRQ(_3_ierr);\ 719204a6943SJed Brown PetscPreLoading = PETSC_FALSE;\ 720043328b6SSatish Balay }\ 721204a6943SJed Brown } while (0) 7228e58c17dSMatthew Knepley 723204a6943SJed Brown #define PetscPreLoadStage(name) do { \ 724043328b6SSatish Balay _3_ierr = PetscLogStagePop();CHKERRQ(_3_ierr); \ 725204a6943SJed Brown if (PetscPreLoadIt>0) { \ 7268e58c17dSMatthew Knepley _3_ierr = PetscLogStageGetId(name,&_stageNum);CHKERRQ(_3_ierr); \ 7278e58c17dSMatthew Knepley } else { \ 728a3bc4eb9SBarry Smith _3_ierr = PetscLogStageRegister(name,&_stageNum);CHKERRQ(_3_ierr); \ 7298e58c17dSMatthew Knepley } \ 730204a6943SJed Brown _3_ierr = PetscLogStageSetActive(_stageNum,(PetscBool)(!PetscPreLoadMax || PetscPreLoadIt)); \ 731204a6943SJed Brown _3_ierr = PetscLogStagePush(_stageNum);CHKERRQ(_3_ierr); \ 732204a6943SJed Brown } while (0) 733e9fa29b7SSatish Balay 734ad14c47eSJed Brown /* some vars for logging */ 735ad14c47eSJed Brown PETSC_EXTERN PetscBool PetscPreLoadingUsed; /* true if we are or have done preloading */ 736ad14c47eSJed Brown PETSC_EXTERN PetscBool PetscPreLoadingOn; /* true if we are currently in a preloading calculation */ 737ad14c47eSJed Brown 73897bb86f7SLois Curfman McInnes #endif 739