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) 21fa2bb9feSLisandro Dalcin #else 22fa2bb9feSLisandro Dalcin #define PetscInfo(A,S) 0 23fa2bb9feSLisandro Dalcin #define PetscInfo1(A,S,a1) 0 24fa2bb9feSLisandro Dalcin #define PetscInfo2(A,S,a1,a2) 0 25fa2bb9feSLisandro Dalcin #define PetscInfo3(A,S,a1,a2,a3) 0 26fa2bb9feSLisandro Dalcin #define PetscInfo4(A,S,a1,a2,a3,a4) 0 27fa2bb9feSLisandro Dalcin #define PetscInfo5(A,S,a1,a2,a3,a4,a5) 0 28fa2bb9feSLisandro Dalcin #define PetscInfo6(A,S,a1,a2,a3,a4,a5,a6) 0 29fa2bb9feSLisandro Dalcin #define PetscInfo7(A,S,a1,a2,a3,a4,a5,a6,a7) 0 30fa2bb9feSLisandro Dalcin #endif 31e94e781bSJacob Faibussowitsch 32e94e781bSJacob Faibussowitsch /*E 33e94e781bSJacob Faibussowitsch PetscInfoCommFlag - Describes the method by which to filter PetscInfo() by communicator size 34e94e781bSJacob Faibussowitsch 35e94e781bSJacob Faibussowitsch Used as an input for PetscInfoSetFilterCommSelf() 36e94e781bSJacob Faibussowitsch 37e94e781bSJacob Faibussowitsch $ PETSC_INFO_COMM_ALL - Default uninitialized value. PetscInfo() will not filter based on communicator size (i.e. will 38e94e781bSJacob Faibussowitsch print for all communicators) 39e94e781bSJacob Faibussowitsch $ PETSC_INFO_COMM_NO_SELF - PetscInfo() will NOT print for communicators with size = 1 (i.e. *_COMM_SELF) 40e94e781bSJacob Faibussowitsch $ PETSC_INFO_COMM_ONLY_SELF - PetscInfo will ONLY print for communicators with size = 1 41e94e781bSJacob Faibussowitsch 42e94e781bSJacob Faibussowitsch Level: intermediate 43e94e781bSJacob Faibussowitsch 44e94e781bSJacob Faibussowitsch .seealso: PetscInfo(), PetscInfoSetFromOptions(), PetscInfoSetFilterCommSelf() 45e94e781bSJacob Faibussowitsch E*/ 46e94e781bSJacob Faibussowitsch typedef enum { 47e94e781bSJacob Faibussowitsch PETSC_INFO_COMM_ALL = -1, 48e94e781bSJacob Faibussowitsch PETSC_INFO_COMM_NO_SELF = 0, 49e94e781bSJacob Faibussowitsch PETSC_INFO_COMM_ONLY_SELF = 1 50e94e781bSJacob Faibussowitsch } PetscInfoCommFlag; 51e94e781bSJacob Faibussowitsch 52e94e781bSJacob Faibussowitsch PETSC_EXTERN const char * const PetscInfoCommFlags[]; 53fa2bb9feSLisandro Dalcin PETSC_EXTERN PetscErrorCode PetscInfoDeactivateClass(PetscClassId); 54fa2bb9feSLisandro Dalcin PETSC_EXTERN PetscErrorCode PetscInfoActivateClass(PetscClassId); 55e94e781bSJacob Faibussowitsch PETSC_EXTERN PetscErrorCode PetscInfoEnabled(PetscClassId, PetscBool *); 56e94e781bSJacob Faibussowitsch PETSC_EXTERN PetscErrorCode PetscInfoAllow(PetscBool); 57e94e781bSJacob Faibussowitsch PETSC_EXTERN PetscErrorCode PetscInfoSetFile(const char[],const char[]); 58e94e781bSJacob Faibussowitsch PETSC_EXTERN PetscErrorCode PetscInfoGetFile(char **,FILE **); 59e94e781bSJacob Faibussowitsch PETSC_EXTERN PetscErrorCode PetscInfoSetClasses(PetscBool,PetscInt,const char *const *); 60e94e781bSJacob Faibussowitsch PETSC_EXTERN PetscErrorCode PetscInfoGetClass(const char *, PetscBool *); 61e94e781bSJacob Faibussowitsch PETSC_EXTERN PetscErrorCode PetscInfoGetInfo(PetscBool *,PetscBool *,PetscBool *,PetscBool *,PetscInfoCommFlag *); 62e94e781bSJacob Faibussowitsch PETSC_EXTERN PetscErrorCode PetscInfoProcessClass(const char[],PetscInt,PetscClassId[]); 63e94e781bSJacob Faibussowitsch PETSC_EXTERN PetscErrorCode PetscInfoSetFilterCommSelf(PetscInfoCommFlag); 64e94e781bSJacob Faibussowitsch PETSC_EXTERN PetscErrorCode PetscInfoSetFromOptions(PetscOptions); 65e94e781bSJacob Faibussowitsch PETSC_EXTERN PetscErrorCode PetscInfoDestroy(void); 66fa2bb9feSLisandro Dalcin PETSC_EXTERN PetscBool PetscLogPrintInfo; /* if true, indicates PetscInfo() is turned on */ 67fa2bb9feSLisandro Dalcin 68b859824cSBarry Smith /*MC 69b859824cSBarry Smith PetscLogEvent - id used to identify PETSc or user events which timed portions (blocks of executable) 70b859824cSBarry Smith code. 71b859824cSBarry Smith 72b859824cSBarry Smith Level: intermediate 73b859824cSBarry Smith 74b859824cSBarry Smith .seealso: PetscLogEventRegister(), PetscLogEventBegin(), PetscLogEventEnd(), PetscLogStage 75b859824cSBarry Smith M*/ 76b859824cSBarry Smith typedef int PetscLogEvent; 77b859824cSBarry Smith 78b859824cSBarry Smith /*MC 79b859824cSBarry Smith PetscLogStage - id used to identify user stages (phases, sections) of runs - for logging 80b859824cSBarry Smith 81b859824cSBarry Smith Level: intermediate 82b859824cSBarry Smith 83522ce795SJed Brown .seealso: PetscLogStageRegister(), PetscLogStagePush(), PetscLogStagePop(), PetscLogEvent 84b859824cSBarry Smith M*/ 85b859824cSBarry Smith typedef int PetscLogStage; 86b859824cSBarry Smith 878ba1e511SMatthew Knepley #define PETSC_EVENT 1311311 88014dd563SJed Brown PETSC_EXTERN PetscLogEvent PETSC_LARGEST_EVENT; 8997bb86f7SLois Curfman McInnes 9019b02663SBarry Smith /* Global flop counter */ 91014dd563SJed Brown PETSC_EXTERN PetscLogDouble petsc_TotalFlops; 92014dd563SJed Brown PETSC_EXTERN PetscLogDouble petsc_tmp_flops; 9319b02663SBarry Smith 9431d06abdSBarry Smith /* We must make the following structures available to access the event 9531d06abdSBarry Smith activation flags in the PetscLogEventBegin/End() macros. These are not part of the PETSc public 9631d06abdSBarry Smith API and are not intended to be used by other parts of PETSc or by users. 97d49d4b11SBarry Smith 98fa2bb9feSLisandro Dalcin The code that manipulates these structures is in src/sys/logging/utils. 9931d06abdSBarry Smith */ 100aa213bdcSJed Brown typedef struct _n_PetscIntStack *PetscIntStack; 1016a6a9b46SSatish Balay 102217044c2SLisandro Dalcin /* -----------------------------------------------------------------------------------------------------*/ 103c60ec953SBarry Smith /* 104aa213bdcSJed Brown PetscClassRegInfo, PetscClassPerfInfo - Each class has two data structures associated with it. The first has 105c60ec953SBarry Smith static information about it, the second collects statistics on how many objects of the class are created, 106c60ec953SBarry Smith how much memory they use, etc. 107c60ec953SBarry Smith 108aa213bdcSJed Brown PetscClassRegLog, PetscClassPerfLog - arrays of the PetscClassRegInfo and PetscClassPerfInfo for all classes. 109c60ec953SBarry Smith */ 1106a6a9b46SSatish Balay typedef struct { 111c60ec953SBarry Smith char *name; /* The class name */ 112c60ec953SBarry Smith PetscClassId classid; /* The integer identifying this class */ 113aa213bdcSJed Brown } PetscClassRegInfo; 1146a6a9b46SSatish Balay 1156a6a9b46SSatish Balay typedef struct { 1160700a824SBarry Smith PetscClassId id; /* The integer identifying this class */ 1176a6a9b46SSatish Balay int creations; /* The number of objects of this class created */ 1186a6a9b46SSatish Balay int destructions; /* The number of objects of this class destroyed */ 1196a6a9b46SSatish Balay PetscLogDouble mem; /* The total memory allocated by objects of this class */ 1206a6a9b46SSatish Balay PetscLogDouble descMem; /* The total memory allocated by descendents of these objects */ 121aa213bdcSJed Brown } PetscClassPerfInfo; 1226a6a9b46SSatish Balay 123aa213bdcSJed Brown typedef struct _n_PetscClassRegLog *PetscClassRegLog; 124aa213bdcSJed Brown struct _n_PetscClassRegLog { 125c60ec953SBarry Smith int numClasses; /* The number of classes registered */ 126c60ec953SBarry Smith int maxClasses; /* The maximum number of classes */ 127aa213bdcSJed Brown PetscClassRegInfo *classInfo; /* The structure for class information (classids are monotonicly increasing) */ 128c60ec953SBarry Smith }; 1296a6a9b46SSatish Balay 130aa213bdcSJed Brown typedef struct _n_PetscClassPerfLog *PetscClassPerfLog; 131aa213bdcSJed Brown struct _n_PetscClassPerfLog { 132c60ec953SBarry Smith int numClasses; /* The number of logging classes */ 133c60ec953SBarry Smith int maxClasses; /* The maximum number of classes */ 134aa213bdcSJed Brown PetscClassPerfInfo *classInfo; /* The structure for class information (classids are monotonicly increasing) */ 135c60ec953SBarry Smith }; 136c60ec953SBarry Smith /* -----------------------------------------------------------------------------------------------------*/ 137c60ec953SBarry Smith /* 138aa213bdcSJed Brown PetscEventRegInfo, PetscEventPerfInfo - Each event has two data structures associated with it. The first has 139c60ec953SBarry Smith static information about it, the second collects statistics on how many times the event is used, how 140c60ec953SBarry Smith much time it takes, etc. 141c60ec953SBarry Smith 142aa213bdcSJed Brown PetscEventRegLog, PetscEventPerfLog - an array of all PetscEventRegInfo and PetscEventPerfInfo for all events. There is one 143c60ec953SBarry Smith of these for each stage. 144c60ec953SBarry Smith 145c60ec953SBarry Smith */ 1466a6a9b46SSatish Balay typedef struct { 1476a6a9b46SSatish Balay char *name; /* The name of this event */ 148c60ec953SBarry Smith PetscClassId classid; /* The class the event is associated with */ 149217044c2SLisandro Dalcin PetscBool collective; /* Flag this event as collective */ 1506a6a9b46SSatish Balay #if defined (PETSC_HAVE_MPE) 1516a6a9b46SSatish Balay int mpe_id_begin; /* MPE IDs that define the event */ 1526a6a9b46SSatish Balay int mpe_id_end; 1536a6a9b46SSatish Balay #endif 154aa213bdcSJed Brown } PetscEventRegInfo; 1556a6a9b46SSatish Balay 156c60ec953SBarry Smith typedef struct { 157c60ec953SBarry Smith int id; /* The integer identifying this event */ 158ace3abfcSBarry Smith PetscBool active; /* The flag to activate logging */ 159ace3abfcSBarry Smith PetscBool visible; /* The flag to print info in summary */ 160c60ec953SBarry Smith int depth; /* The nesting depth of the event call */ 161c60ec953SBarry Smith int count; /* The number of times this event was executed */ 162a42e5b54SMatthew G Knepley PetscLogDouble flops, flops2, flopsTmp; /* The flops and flops^2 used in this event */ 163a42e5b54SMatthew G Knepley PetscLogDouble time, time2, timeTmp; /* The time and time^2 taken for this event */ 164217044c2SLisandro Dalcin PetscLogDouble syncTime; /* The synchronization barrier time */ 165891e75beSMatthew G. Knepley PetscLogDouble dof[8]; /* The number of degrees of freedom associated with this event */ 1665d68e14cSMatthew G. Knepley PetscLogDouble errors[8]; /* The errors (user-defined) associated with this event */ 167c60ec953SBarry Smith PetscLogDouble numMessages; /* The number of messages in this event */ 168c60ec953SBarry Smith PetscLogDouble messageLength; /* The total message lengths in this event */ 169c60ec953SBarry Smith PetscLogDouble numReductions; /* The number of reductions in this event */ 170e3ed9ee7SBarry Smith PetscLogDouble memIncrease; /* How much the resident memory has increased in this event */ 171e3ed9ee7SBarry Smith PetscLogDouble mallocIncrease;/* How much the maximum malloced space has increased in this event */ 172e3ed9ee7SBarry Smith PetscLogDouble mallocSpace; /* How much the space was malloced and kept during this event */ 173e3ed9ee7SBarry Smith PetscLogDouble mallocIncreaseEvent; /* Maximum of the high water mark with in event minus memory available at the end of the event */ 174*091bc5acSJunchao Zhang #if defined(PETSC_HAVE_DEVICE) 175bec0b493Shannah_mairs PetscLogDouble CpuToGpuCount; /* The total number of CPU to GPU copies */ 176bec0b493Shannah_mairs PetscLogDouble GpuToCpuCount; /* The total number of GPU to CPU copies */ 177bec0b493Shannah_mairs PetscLogDouble CpuToGpuSize; /* The total size of CPU to GPU copies */ 178bec0b493Shannah_mairs PetscLogDouble GpuToCpuSize; /* The total size of GPU to CPU copies */ 179958c4211Shannah_mairs PetscLogDouble GpuFlops; /* The flops done on a GPU in this event */ 180958c4211Shannah_mairs PetscLogDouble GpuTime; /* The time spent on a GPU in this event */ 181bec0b493Shannah_mairs #endif 182aa213bdcSJed Brown } PetscEventPerfInfo; 183c60ec953SBarry Smith 184aa213bdcSJed Brown typedef struct _n_PetscEventRegLog *PetscEventRegLog; 185aa213bdcSJed Brown struct _n_PetscEventRegLog { 1866a6a9b46SSatish Balay int numEvents; /* The number of registered events */ 1876a6a9b46SSatish Balay int maxEvents; /* The maximum number of events */ 188aa213bdcSJed Brown PetscEventRegInfo *eventInfo; /* The registration information for each event */ 1896a6a9b46SSatish Balay }; 1906a6a9b46SSatish Balay 191aa213bdcSJed Brown typedef struct _n_PetscEventPerfLog *PetscEventPerfLog; 192aa213bdcSJed Brown struct _n_PetscEventPerfLog { 1936a6a9b46SSatish Balay int numEvents; /* The number of logging events */ 1946a6a9b46SSatish Balay int maxEvents; /* The maximum number of events */ 195aa213bdcSJed Brown PetscEventPerfInfo *eventInfo; /* The performance information for each event */ 1966a6a9b46SSatish Balay }; 197c60ec953SBarry Smith /* ------------------------------------------------------------------------------------------------------------*/ 198c60ec953SBarry Smith /* 199aa213bdcSJed Brown PetscStageInfo - Contains all the information about a particular stage. 2006a6a9b46SSatish Balay 201aa213bdcSJed Brown PetscStageLog - An array of PetscStageInfo for each registered stage. There is a single one of these in the code. 202c60ec953SBarry Smith */ 203aa213bdcSJed Brown typedef struct _PetscStageInfo { 2046a6a9b46SSatish Balay char *name; /* The stage name */ 205ace3abfcSBarry Smith PetscBool used; /* The stage was pushed on this processor */ 206aa213bdcSJed Brown PetscEventPerfInfo perfInfo; /* The stage performance information */ 207aa213bdcSJed Brown PetscEventPerfLog eventLog; /* The event information for this stage */ 208aa213bdcSJed Brown PetscClassPerfLog classLog; /* The class information for this stage */ 209aa213bdcSJed Brown } PetscStageInfo; 2106a6a9b46SSatish Balay 211aa213bdcSJed Brown typedef struct _n_PetscStageLog *PetscStageLog; 212aa213bdcSJed Brown struct _n_PetscStageLog { 2136a6a9b46SSatish Balay int numStages; /* The number of registered stages */ 2146a6a9b46SSatish Balay int maxStages; /* The maximum number of stages */ 215aa213bdcSJed Brown PetscIntStack stack; /* The stack for active stages */ 216aa213bdcSJed Brown int curStage; /* The current stage (only used in macros so we don't call PetscIntStackTop) */ 217aa213bdcSJed Brown PetscStageInfo *stageInfo; /* The information for each stage */ 218aa213bdcSJed Brown PetscEventRegLog eventLog; /* The registered events */ 219aa213bdcSJed Brown PetscClassRegLog classLog; /* The registered classes */ 2206a6a9b46SSatish Balay }; 221217044c2SLisandro Dalcin /* -----------------------------------------------------------------------------------------------------*/ 222fee518ebSJed Brown 2233bb1ff40SBarry Smith PETSC_EXTERN PetscErrorCode PetscLogObjectParent(PetscObject,PetscObject); 2243bb1ff40SBarry Smith PETSC_EXTERN PetscErrorCode PetscLogObjectMemory(PetscObject,PetscLogDouble); 2253bb1ff40SBarry Smith 226aa482453SBarry Smith #if defined(PETSC_USE_LOG) /* --- Logging is turned on --------------------------------*/ 227aeeda9f6SJohn Fettig PETSC_EXTERN PetscStageLog petsc_stageLog; 228f5d6ab90SLisandro Dalcin PETSC_EXTERN PetscErrorCode PetscLogGetStageLog(PetscStageLog*); 229f5d6ab90SLisandro Dalcin PETSC_EXTERN PetscErrorCode PetscStageLogGetCurrent(PetscStageLog,int*); 230f5d6ab90SLisandro Dalcin PETSC_EXTERN PetscErrorCode PetscStageLogGetEventPerfLog(PetscStageLog,int,PetscEventPerfLog*); 231614700edSBarry Smith 232da63de55SLois Curfman McInnes /* 233da63de55SLois Curfman McInnes Flop counting: We count each arithmetic operation (e.g., addition, multiplication) separately. 234da63de55SLois Curfman McInnes 235da63de55SLois Curfman McInnes For the complex numbers version, note that 236da63de55SLois Curfman McInnes 1 complex addition = 2 flops 237da63de55SLois Curfman McInnes 1 complex multiplication = 6 flops, 238da63de55SLois Curfman McInnes where we define 1 flop as that for a double precision scalar. We roughly approximate 239da63de55SLois Curfman McInnes flop counting for complex numbers by multiplying the total flops by 4; this corresponds 240da63de55SLois Curfman McInnes to the assumption that we're counting mostly additions and multiplications -- and 241da63de55SLois Curfman McInnes roughly the same number of each. More accurate counting could be done by distinguishing 242da63de55SLois Curfman McInnes among the various arithmetic operations. 243da63de55SLois Curfman McInnes */ 244da63de55SLois Curfman McInnes 245aa482453SBarry Smith #if defined(PETSC_USE_COMPLEX) 246542d4b3fSSatish Balay #define PETSC_FLOPS_PER_OP 4.0 247da63de55SLois Curfman McInnes #else 248542d4b3fSSatish Balay #define PETSC_FLOPS_PER_OP 1.0 249bf3909cdSBarry Smith #endif 250bf3909cdSBarry Smith 251ca0c957dSBarry Smith /*@ 252ca0c957dSBarry Smith PetscLogFlops - Log how many flops are performed in a calculation 253ca0c957dSBarry Smith 254ca0c957dSBarry Smith Input Paramters: 255ca0c957dSBarry Smith flops - the number of flops 256ca0c957dSBarry Smith 257ca0c957dSBarry Smith Notes: 258ca0c957dSBarry Smith To limit the chance of integer overflow when multiplying by a constant, represent the constant as a double, 259ca0c957dSBarry Smith not an integer. Use PetscLogFlops(4.0*n) not PetscLogFlops(4*n) 260ca0c957dSBarry Smith 261ca0c957dSBarry Smith Level: intermediate 262ca0c957dSBarry Smith 26368481988SMark .seealso: PetscLogView(), PetscLogGpuFlops() 264ca0c957dSBarry Smith @*/ 265ca0c957dSBarry Smith 266dd19b90bSBarry Smith PETSC_STATIC_INLINE PetscErrorCode PetscLogFlops(PetscLogDouble n) 267dd19b90bSBarry Smith { 268dd19b90bSBarry Smith PetscFunctionBegin; 269bf3909cdSBarry Smith #if defined(PETSC_USE_DEBUG) 270dd19b90bSBarry Smith if (n < 0) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_OUTOFRANGE,"Cannot log negative flops"); 271da63de55SLois Curfman McInnes #endif 272dd19b90bSBarry Smith petsc_TotalFlops += PETSC_FLOPS_PER_OP*n; 273dd19b90bSBarry Smith PetscFunctionReturn(0); 274dd19b90bSBarry Smith } 275fa2bb9feSLisandro Dalcin 276*091bc5acSJunchao Zhang #if defined(PETSC_HAVE_DEVICE) 2778df2f0b1SJunchao Zhang /* Global GPU counters */ 2788df2f0b1SJunchao Zhang PETSC_EXTERN PetscLogDouble petsc_ctog_ct; 2798df2f0b1SJunchao Zhang PETSC_EXTERN PetscLogDouble petsc_gtoc_ct; 2808df2f0b1SJunchao Zhang PETSC_EXTERN PetscLogDouble petsc_ctog_sz; 2818df2f0b1SJunchao Zhang PETSC_EXTERN PetscLogDouble petsc_gtoc_sz; 2828df2f0b1SJunchao Zhang PETSC_EXTERN PetscLogDouble petsc_gflops; 2838df2f0b1SJunchao Zhang PETSC_EXTERN PetscLogDouble petsc_gtime; 2848df2f0b1SJunchao Zhang #if defined(PETSC_USE_DEBUG) 2858df2f0b1SJunchao Zhang PETSC_EXTERN PetscBool petsc_gtime_inuse; 2868df2f0b1SJunchao Zhang #endif 2878df2f0b1SJunchao Zhang 2884db21f4bSStefano Zampini PETSC_STATIC_INLINE PetscErrorCode PetscLogCpuToGpu(PetscLogDouble size) 2894db21f4bSStefano Zampini { 290958c4211Shannah_mairs PetscFunctionBegin; 291bec0b493Shannah_mairs petsc_ctog_ct += 1; 292bec0b493Shannah_mairs petsc_ctog_sz += size; 293bec0b493Shannah_mairs PetscFunctionReturn(0); 294bec0b493Shannah_mairs } 2954db21f4bSStefano Zampini 2964db21f4bSStefano Zampini PETSC_STATIC_INLINE PetscErrorCode PetscLogGpuToCpu(PetscLogDouble size) 2974db21f4bSStefano Zampini { 298958c4211Shannah_mairs PetscFunctionBegin; 299bec0b493Shannah_mairs petsc_gtoc_ct += 1; 300bec0b493Shannah_mairs petsc_gtoc_sz += size; 301bec0b493Shannah_mairs PetscFunctionReturn(0); 302bec0b493Shannah_mairs } 3034db21f4bSStefano Zampini 30468481988SMark /*@ 30568481988SMark PetscLogGpuFlops - Log how many flops are performed in a calculation on the device 30668481988SMark 30768481988SMark Input Paramters: 30868481988SMark flops - the number of flops 30968481988SMark 31068481988SMark Notes: 31168481988SMark To limit the chance of integer overflow when multiplying by a constant, represent the constant as a double, 31268481988SMark not an integer. Use PetscLogFlops(4.0*n) not PetscLogFlops(4*n) 31368481988SMark 31468481988SMark Level: intermediate 31568481988SMark 31668481988SMark .seealso: PetscLogView(), PetscLogFlops(), PetscLogGpuTimeBegin(), PetscLogGpuTimeEnd() 31768481988SMark @*/ 3184db21f4bSStefano Zampini PETSC_STATIC_INLINE PetscErrorCode PetscLogGpuFlops(PetscLogDouble n) 3194db21f4bSStefano Zampini { 320958c4211Shannah_mairs PetscFunctionBegin; 321958c4211Shannah_mairs #if defined(PETSC_USE_DEBUG) 322958c4211Shannah_mairs if (n < 0) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_OUTOFRANGE,"Cannot log negative flops"); 323958c4211Shannah_mairs #endif 324958c4211Shannah_mairs petsc_TotalFlops += PETSC_FLOPS_PER_OP*n; 325958c4211Shannah_mairs petsc_gflops += PETSC_FLOPS_PER_OP*n; 326958c4211Shannah_mairs PetscFunctionReturn(0); 327958c4211Shannah_mairs } 3284db21f4bSStefano Zampini 32968481988SMark /*@ 33068481988SMark PetscLogGpuTimeBegin - Start timer for device 33168481988SMark 33268481988SMark Level: intermediate 33368481988SMark 33468481988SMark Notes: 33568481988SMark The timer is run on the CPU, it is just logged separately as time devoted to GPU computations (including kernel launch times). It is used to compute the flop rate on the GPU. 33668481988SMark .seealso: PetscLogView(), PetscLogGpuFlops(), PetscLogGpuTimeEnd() 33768481988SMark @*/ 3384db21f4bSStefano Zampini PETSC_STATIC_INLINE PetscErrorCode PetscLogGpuTimeBegin() 3394db21f4bSStefano Zampini { 340958c4211Shannah_mairs PetscErrorCode ierr; 341958c4211Shannah_mairs PetscFunctionBegin; 342703ce11fSStefano Zampini #if defined(PETSC_USE_DEBUG) 343703ce11fSStefano Zampini if (petsc_gtime_inuse) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_PLIB,"Forgot to call PetscLogGpuTimeEnd()?"); 344703ce11fSStefano Zampini petsc_gtime_inuse = PETSC_TRUE; 345703ce11fSStefano Zampini #endif 346958c4211Shannah_mairs ierr = PetscTimeSubtract(&petsc_gtime);CHKERRQ(ierr); 347958c4211Shannah_mairs PetscFunctionReturn(0); 348958c4211Shannah_mairs } 34968481988SMark /*@ 35068481988SMark PetscLogGpuTimeEnd - Stop timer for device 3514db21f4bSStefano Zampini 35268481988SMark Level: intermediate 35368481988SMark 35468481988SMark .seealso: PetscLogView(), PetscLogGpuFlops(), PetscLogGpuTimeBegin() 35568481988SMark @*/ 3564db21f4bSStefano Zampini PETSC_STATIC_INLINE PetscErrorCode PetscLogGpuTimeEnd() 3574db21f4bSStefano Zampini { 358958c4211Shannah_mairs PetscErrorCode ierr; 359958c4211Shannah_mairs PetscFunctionBegin; 360703ce11fSStefano Zampini #if defined(PETSC_USE_DEBUG) 361703ce11fSStefano Zampini if (!petsc_gtime_inuse) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_PLIB,"Forgot to call PetscLogGpuTimeBegin()?"); 362703ce11fSStefano Zampini petsc_gtime_inuse = PETSC_FALSE; 363703ce11fSStefano Zampini #endif 364958c4211Shannah_mairs ierr = PetscTimeAdd(&petsc_gtime);CHKERRQ(ierr); 365958c4211Shannah_mairs PetscFunctionReturn(0); 366958c4211Shannah_mairs } 3674db21f4bSStefano Zampini 3684db21f4bSStefano Zampini PETSC_STATIC_INLINE PetscErrorCode PetscLogGpuTimeAdd(PetscLogDouble t) 3694db21f4bSStefano Zampini { 3704db21f4bSStefano Zampini PetscFunctionBegin; 3714db21f4bSStefano Zampini petsc_gtime += t; 3724db21f4bSStefano Zampini PetscFunctionReturn(0); 3734db21f4bSStefano Zampini } 374bec0b493Shannah_mairs #endif 375bec0b493Shannah_mairs 376fa2bb9feSLisandro Dalcin PETSC_EXTERN PetscErrorCode PetscGetFlops(PetscLogDouble *); 37777c4ece6SBarry Smith 378aa482453SBarry Smith #if defined (PETSC_HAVE_MPE) 379014dd563SJed Brown PETSC_EXTERN PetscErrorCode PetscLogMPEBegin(void); 380014dd563SJed Brown PETSC_EXTERN PetscErrorCode PetscLogMPEDump(const char[]); 38177c4ece6SBarry Smith #endif 38277c4ece6SBarry Smith 383014dd563SJed Brown PETSC_EXTERN PetscErrorCode (*PetscLogPLB)(PetscLogEvent,int,PetscObject,PetscObject,PetscObject,PetscObject); 384014dd563SJed Brown PETSC_EXTERN PetscErrorCode (*PetscLogPLE)(PetscLogEvent,int,PetscObject,PetscObject,PetscObject,PetscObject); 385014dd563SJed Brown PETSC_EXTERN PetscErrorCode (*PetscLogPHC)(PetscObject); 386014dd563SJed Brown PETSC_EXTERN PetscErrorCode (*PetscLogPHD)(PetscObject); 38777c4ece6SBarry Smith 388e83a5d19SLisandro 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) 389fa2bb9feSLisandro Dalcin #define PetscLogObjectCreate(h) ((PetscLogPHC) ? (*PetscLogPHC)((PetscObject)(h)) : 0) 390fa2bb9feSLisandro Dalcin #define PetscLogObjectDestroy(h) ((PetscLogPHD) ? (*PetscLogPHD)((PetscObject)(h)) : 0) 391fa2bb9feSLisandro Dalcin PETSC_EXTERN PetscErrorCode PetscLogObjectState(PetscObject, const char[], ...); 392fa2bb9feSLisandro Dalcin 3938ba1e511SMatthew Knepley /* Initialization functions */ 394bb1d7374SBarry Smith PETSC_EXTERN PetscErrorCode PetscLogDefaultBegin(void); 395014dd563SJed Brown PETSC_EXTERN PetscErrorCode PetscLogAllBegin(void); 396bb1d7374SBarry Smith PETSC_EXTERN PetscErrorCode PetscLogNestedBegin(void); 397014dd563SJed Brown PETSC_EXTERN PetscErrorCode PetscLogTraceBegin(FILE *); 398014dd563SJed Brown PETSC_EXTERN PetscErrorCode PetscLogActions(PetscBool); 399014dd563SJed Brown PETSC_EXTERN PetscErrorCode PetscLogObjects(PetscBool); 400fa2bb9feSLisandro Dalcin PETSC_EXTERN PetscErrorCode PetscLogSetThreshold(PetscLogDouble,PetscLogDouble*); 401014dd563SJed Brown PETSC_EXTERN PetscErrorCode PetscLogSet(PetscErrorCode (*)(int, int, PetscObject, PetscObject, PetscObject, PetscObject), 4026849ba73SBarry Smith PetscErrorCode (*)(int, int, PetscObject, PetscObject, PetscObject, PetscObject)); 403fa2bb9feSLisandro Dalcin 4048ba1e511SMatthew Knepley /* Output functions */ 405014dd563SJed Brown PETSC_EXTERN PetscErrorCode PetscLogView(PetscViewer); 406f14045dbSBarry Smith PETSC_EXTERN PetscErrorCode PetscLogViewFromOptions(void); 407014dd563SJed Brown PETSC_EXTERN PetscErrorCode PetscLogDump(const char[]); 40831d06abdSBarry Smith 409fa2bb9feSLisandro Dalcin /* Stage functions */ 410014dd563SJed Brown PETSC_EXTERN PetscErrorCode PetscLogStageRegister(const char[],PetscLogStage*); 411014dd563SJed Brown PETSC_EXTERN PetscErrorCode PetscLogStagePush(PetscLogStage); 412014dd563SJed Brown PETSC_EXTERN PetscErrorCode PetscLogStagePop(void); 413014dd563SJed Brown PETSC_EXTERN PetscErrorCode PetscLogStageSetActive(PetscLogStage,PetscBool); 414014dd563SJed Brown PETSC_EXTERN PetscErrorCode PetscLogStageGetActive(PetscLogStage,PetscBool*); 415014dd563SJed Brown PETSC_EXTERN PetscErrorCode PetscLogStageSetVisible(PetscLogStage,PetscBool); 416014dd563SJed Brown PETSC_EXTERN PetscErrorCode PetscLogStageGetVisible(PetscLogStage,PetscBool*); 417014dd563SJed Brown PETSC_EXTERN PetscErrorCode PetscLogStageGetId(const char[],PetscLogStage*); 418f5d6ab90SLisandro Dalcin 4198ba1e511SMatthew Knepley /* Event functions */ 420014dd563SJed Brown PETSC_EXTERN PetscErrorCode PetscLogEventRegister(const char[],PetscClassId,PetscLogEvent*); 421217044c2SLisandro Dalcin PETSC_EXTERN PetscErrorCode PetscLogEventSetCollective(PetscLogEvent,PetscBool); 422fa2bb9feSLisandro Dalcin PETSC_EXTERN PetscErrorCode PetscLogEventIncludeClass(PetscClassId); 423fa2bb9feSLisandro Dalcin PETSC_EXTERN PetscErrorCode PetscLogEventExcludeClass(PetscClassId); 424014dd563SJed Brown PETSC_EXTERN PetscErrorCode PetscLogEventActivate(PetscLogEvent); 425014dd563SJed Brown PETSC_EXTERN PetscErrorCode PetscLogEventDeactivate(PetscLogEvent); 426014dd563SJed Brown PETSC_EXTERN PetscErrorCode PetscLogEventSetActiveAll(PetscLogEvent,PetscBool); 427014dd563SJed Brown PETSC_EXTERN PetscErrorCode PetscLogEventActivateClass(PetscClassId); 428014dd563SJed Brown PETSC_EXTERN PetscErrorCode PetscLogEventDeactivateClass(PetscClassId); 4298c49a8d9SBarry Smith PETSC_EXTERN PetscErrorCode PetscLogEventGetId(const char[],PetscLogEvent*); 43013230571SMichael Lange PETSC_EXTERN PetscErrorCode PetscLogEventGetPerfInfo(int,PetscLogEvent,PetscEventPerfInfo*); 431891e75beSMatthew G. Knepley PETSC_EXTERN PetscErrorCode PetscLogEventSetDof(PetscLogEvent, PetscInt, PetscLogDouble); 4325d68e14cSMatthew G. Knepley PETSC_EXTERN PetscErrorCode PetscLogEventSetError(PetscLogEvent, PetscInt, PetscLogDouble); 4338ba1e511SMatthew Knepley 4348ba1e511SMatthew Knepley /* Global counters */ 435014dd563SJed Brown PETSC_EXTERN PetscLogDouble petsc_irecv_ct; 436014dd563SJed Brown PETSC_EXTERN PetscLogDouble petsc_isend_ct; 437014dd563SJed Brown PETSC_EXTERN PetscLogDouble petsc_recv_ct; 438014dd563SJed Brown PETSC_EXTERN PetscLogDouble petsc_send_ct; 439014dd563SJed Brown PETSC_EXTERN PetscLogDouble petsc_irecv_len; 440014dd563SJed Brown PETSC_EXTERN PetscLogDouble petsc_isend_len; 441014dd563SJed Brown PETSC_EXTERN PetscLogDouble petsc_recv_len; 442014dd563SJed Brown PETSC_EXTERN PetscLogDouble petsc_send_len; 443014dd563SJed Brown PETSC_EXTERN PetscLogDouble petsc_allreduce_ct; 444014dd563SJed Brown PETSC_EXTERN PetscLogDouble petsc_gather_ct; 445014dd563SJed Brown PETSC_EXTERN PetscLogDouble petsc_scatter_ct; 446014dd563SJed Brown PETSC_EXTERN PetscLogDouble petsc_wait_ct; 447014dd563SJed Brown PETSC_EXTERN PetscLogDouble petsc_wait_any_ct; 448014dd563SJed Brown PETSC_EXTERN PetscLogDouble petsc_wait_all_ct; 449014dd563SJed Brown PETSC_EXTERN PetscLogDouble petsc_sum_of_waits_ct; 4508ba1e511SMatthew Knepley 451e3ed9ee7SBarry Smith PETSC_EXTERN PetscBool PetscLogMemory; 452e3ed9ee7SBarry Smith 453fa2bb9feSLisandro Dalcin PETSC_EXTERN PetscBool PetscLogSyncOn; /* true if logging synchronization is enabled */ 45462872c28SLisandro Dalcin PETSC_EXTERN PetscErrorCode PetscLogEventSynchronize(PetscLogEvent, MPI_Comm); 45562872c28SLisandro Dalcin 45662872c28SLisandro Dalcin #define PetscLogEventSync(e,comm) \ 45762872c28SLisandro Dalcin (((PetscLogPLB && petsc_stageLog->stageInfo[petsc_stageLog->curStage].perfInfo.active && petsc_stageLog->stageInfo[petsc_stageLog->curStage].eventLog->eventInfo[e].active) ? \ 45862872c28SLisandro Dalcin PetscLogEventSynchronize((e),(comm)) : 0)) 45977c4ece6SBarry Smith 46052e6d16bSBarry Smith #define PetscLogEventBegin(e,o1,o2,o3,o4) \ 4618b5db460SBarry Smith (((PetscLogPLB && petsc_stageLog->stageInfo[petsc_stageLog->curStage].perfInfo.active && petsc_stageLog->stageInfo[petsc_stageLog->curStage].eventLog->eventInfo[e].active) ? \ 462495fc317SBarry Smith (*PetscLogPLB)((e),0,(PetscObject)(o1),(PetscObject)(o2),(PetscObject)(o3),(PetscObject)(o4)) : 0)) 463043328b6SSatish Balay 46452e6d16bSBarry Smith #define PetscLogEventEnd(e,o1,o2,o3,o4) \ 4658b5db460SBarry Smith (((PetscLogPLE && petsc_stageLog->stageInfo[petsc_stageLog->curStage].perfInfo.active && petsc_stageLog->stageInfo[petsc_stageLog->curStage].eventLog->eventInfo[e].active) ? \ 466495fc317SBarry Smith (*PetscLogPLE)((e),0,(PetscObject)(o1),(PetscObject)(o2),(PetscObject)(o3),(PetscObject)(o4)) : 0)) 46777c4ece6SBarry Smith 468014dd563SJed Brown PETSC_EXTERN PetscErrorCode PetscLogEventGetFlops(PetscLogEvent,PetscLogDouble*); 469014dd563SJed Brown PETSC_EXTERN PetscErrorCode PetscLogEventZeroFlops(PetscLogEvent); 470003131ecSBarry Smith 471ce85283eSBarry Smith /* 472f621e05eSBarry Smith These are used internally in the PETSc routines to keep a count of MPI messages and 473f621e05eSBarry Smith their sizes. 474f621e05eSBarry Smith 475af0996ceSBarry Smith This does not work for MPI-Uni because our include/petsc/mpiuni/mpi.h file 476ce85283eSBarry Smith uses macros to defined the MPI operations. 47715308354SBarry Smith 47815308354SBarry Smith It does not work correctly from HP-UX because it processes the 479bb4af37aSBarry Smith macros in a way that sometimes it double counts, hence 480b6410449SSatish Balay PETSC_HAVE_BROKEN_RECURSIVE_MACRO 4817c1e34a4SSatish Balay 482f569fd43SBarry Smith It does not work with Windows because winmpich lacks MPI_Type_size() 483ce85283eSBarry Smith */ 484c9b973beSBarry Smith #if !defined(MPIUNI_H) && !defined(PETSC_HAVE_BROKEN_RECURSIVE_MACRO) && !defined (PETSC_HAVE_MPI_MISSING_TYPESIZE) 48577a39924SBarry Smith /* 48677a39924SBarry Smith Logging of MPI activities 48777a39924SBarry Smith */ 488b23bfdefSJunchao Zhang PETSC_STATIC_INLINE PetscErrorCode PetscMPITypeSize(PetscInt count,MPI_Datatype type,PetscLogDouble *length) 489f95db71bSBarry Smith { 490f12d10ccSJunchao Zhang PetscMPIInt typesize; 491f12d10ccSJunchao Zhang PetscErrorCode ierr; 4927d30fa4aSBarry Smith if (type == MPI_DATATYPE_NULL) return 0; 493f12d10ccSJunchao Zhang ierr = MPI_Type_size(type,&typesize);CHKERRQ(ierr); 494f12d10ccSJunchao Zhang *length += (PetscLogDouble) (count*typesize); 4959c72ff1eSSatish Balay return 0; 496f95db71bSBarry Smith } 49777a39924SBarry Smith 498f12d10ccSJunchao Zhang PETSC_STATIC_INLINE PetscErrorCode PetscMPITypeSizeComm(MPI_Comm comm,const PetscMPIInt *counts,MPI_Datatype type,PetscLogDouble *length) 4993b9284c0SMatthew G Knepley { 500f12d10ccSJunchao Zhang PetscMPIInt typesize,size,p; 501f12d10ccSJunchao Zhang PetscErrorCode ierr; 5023b9284c0SMatthew G Knepley 5037d30fa4aSBarry Smith if (type == MPI_DATATYPE_NULL) return 0; 504f12d10ccSJunchao Zhang ierr = MPI_Comm_size(comm,&size);CHKERRQ(ierr); 505f12d10ccSJunchao Zhang ierr = MPI_Type_size(type,&typesize);CHKERRQ(ierr); 506f12d10ccSJunchao Zhang for (p=0; p<size; ++p) { 507f12d10ccSJunchao Zhang *length += (PetscLogDouble) (counts[p]*typesize); 508f12d10ccSJunchao Zhang } 509f12d10ccSJunchao Zhang return 0; 510f12d10ccSJunchao Zhang } 511f12d10ccSJunchao Zhang 512f12d10ccSJunchao Zhang PETSC_STATIC_INLINE PetscErrorCode PetscMPITypeSizeCount(PetscInt n,const PetscMPIInt *counts,MPI_Datatype type,PetscLogDouble *length) 513f12d10ccSJunchao Zhang { 514f12d10ccSJunchao Zhang PetscMPIInt typesize,p; 515f12d10ccSJunchao Zhang PetscErrorCode ierr; 516f12d10ccSJunchao Zhang 517f12d10ccSJunchao Zhang if (type == MPI_DATATYPE_NULL) return 0; 518f12d10ccSJunchao Zhang ierr = MPI_Type_size(type,&typesize);CHKERRQ(ierr); 519f12d10ccSJunchao Zhang for (p=0; p<n; ++p) { 520f12d10ccSJunchao Zhang *length += (PetscLogDouble) (counts[p]*typesize); 5213b9284c0SMatthew G Knepley } 5223b9284c0SMatthew G Knepley return 0; 5233b9284c0SMatthew G Knepley } 5243b9284c0SMatthew G Knepley 52572b11a25SBarry Smith /* 52672b11a25SBarry Smith Returns 1 if the communicator is parallel else zero 52772b11a25SBarry Smith */ 52872b11a25SBarry Smith PETSC_STATIC_INLINE int PetscMPIParallelComm(MPI_Comm comm) 52972b11a25SBarry Smith { 53072b11a25SBarry Smith PetscMPIInt size; MPI_Comm_size(comm,&size); return size > 1; 53172b11a25SBarry Smith } 53272b11a25SBarry Smith 53377a39924SBarry Smith #define MPI_Irecv(buf,count,datatype,source,tag,comm,request) \ 534f12d10ccSJunchao Zhang ((petsc_irecv_ct++,0) || PetscMPITypeSize((count),(datatype),&(petsc_irecv_len)) || MPI_Irecv((buf),(count),(datatype),(source),(tag),(comm),(request))) 53515308354SBarry Smith 53677a39924SBarry Smith #define MPI_Isend(buf,count,datatype,dest,tag,comm,request) \ 537f12d10ccSJunchao Zhang ((petsc_isend_ct++,0) || PetscMPITypeSize((count),(datatype),&(petsc_isend_len)) || MPI_Isend((buf),(count),(datatype),(dest),(tag),(comm),(request))) 53815308354SBarry Smith 539457b14b1SJunchao Zhang #define MPI_Startall_irecv(count,datatype,number,requests) \ 540f12d10ccSJunchao Zhang ((petsc_irecv_ct += (PetscLogDouble)(number),0) || PetscMPITypeSize((count),(datatype),&(petsc_irecv_len)) || ((number) && MPI_Startall((number),(requests)))) 5410d4b0b6cSBarry Smith 542457b14b1SJunchao Zhang #define MPI_Startall_isend(count,datatype,number,requests) \ 543f12d10ccSJunchao Zhang ((petsc_isend_ct += (PetscLogDouble)(number),0) || PetscMPITypeSize((count),(datatype),&(petsc_isend_len)) || ((number) && MPI_Startall((number),(requests)))) 5440d4b0b6cSBarry Smith 545457b14b1SJunchao Zhang #define MPI_Start_isend(count,datatype,requests) \ 546f12d10ccSJunchao Zhang ((petsc_isend_ct++,0) || PetscMPITypeSize((count),(datatype),(&petsc_isend_len)) || MPI_Start((requests))) 5470d4b0b6cSBarry Smith 548ce85283eSBarry Smith #define MPI_Recv(buf,count,datatype,source,tag,comm,status) \ 549f12d10ccSJunchao Zhang ((petsc_recv_ct++,0) || PetscMPITypeSize((count),(datatype),(&petsc_recv_len)) || MPI_Recv((buf),(count),(datatype),(source),(tag),(comm),(status))) 55015308354SBarry Smith 55177a39924SBarry Smith #define MPI_Send(buf,count,datatype,dest,tag,comm) \ 552f12d10ccSJunchao Zhang ((petsc_send_ct++,0) || PetscMPITypeSize((count),(datatype),(&petsc_send_len)) || MPI_Send((buf),(count),(datatype),(dest),(tag),(comm))) 55377a39924SBarry Smith 55477a39924SBarry Smith #define MPI_Wait(request,status) \ 5555fa69175SJed Brown ((petsc_wait_ct++,petsc_sum_of_waits_ct++,0) || MPI_Wait((request),(status))) 55677a39924SBarry Smith 55777a39924SBarry Smith #define MPI_Waitany(a,b,c,d) \ 5585fa69175SJed Brown ((petsc_wait_any_ct++,petsc_sum_of_waits_ct++,0) || MPI_Waitany((a),(b),(c),(d))) 55977a39924SBarry Smith 56077a39924SBarry Smith #define MPI_Waitall(count,array_of_requests,array_of_statuses) \ 5615fa69175SJed Brown ((petsc_wait_all_ct++,petsc_sum_of_waits_ct += (PetscLogDouble) (count),0) || MPI_Waitall((count),(array_of_requests),(array_of_statuses))) 56277a39924SBarry Smith 56377a39924SBarry Smith #define MPI_Allreduce(sendbuf,recvbuf,count,datatype,op,comm) \ 5645fa69175SJed Brown ((petsc_allreduce_ct += PetscMPIParallelComm((comm)),0) || MPI_Allreduce((sendbuf),(recvbuf),(count),(datatype),(op),(comm))) 5653914022bSBarry Smith 56654fe5c21SBarry Smith #define MPI_Bcast(buffer,count,datatype,root,comm) \ 5675fa69175SJed Brown ((petsc_allreduce_ct += PetscMPIParallelComm((comm)),0) || MPI_Bcast((buffer),(count),(datatype),(root),(comm))) 56854fe5c21SBarry Smith 569d6e4c47cSJed Brown #define MPI_Reduce_scatter_block(sendbuf,recvbuf,recvcount,datatype,op,comm) \ 5705fa69175SJed Brown ((petsc_allreduce_ct += PetscMPIParallelComm((comm)),0) || MPI_Reduce_scatter_block((sendbuf),(recvbuf),(recvcount),(datatype),(op),(comm))) 571d6e4c47cSJed Brown 5723b9284c0SMatthew G Knepley #define MPI_Alltoall(sendbuf,sendcount,sendtype,recvbuf,recvcount,recvtype,comm) \ 573f12d10ccSJunchao Zhang ((petsc_allreduce_ct += PetscMPIParallelComm((comm)),0) || PetscMPITypeSize((sendcount),(sendtype),(&petsc_send_len)) || MPI_Alltoall((sendbuf),(sendcount),(sendtype),(recvbuf),(recvcount),(recvtype),(comm))) 5743b9284c0SMatthew G Knepley 5753b9284c0SMatthew G Knepley #define MPI_Alltoallv(sendbuf,sendcnts,sdispls,sendtype,recvbuf,recvcnts,rdispls,recvtype,comm) \ 576f12d10ccSJunchao 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))) 5773b9284c0SMatthew G Knepley 57801faf4e4SMatthew Knepley #define MPI_Allgather(sendbuf,sendcount,sendtype,recvbuf,recvcount,recvtype,comm) \ 5795fa69175SJed Brown ((petsc_gather_ct += PetscMPIParallelComm((comm)),0) || MPI_Allgather((sendbuf),(sendcount),(sendtype),(recvbuf),(recvcount),(recvtype),(comm))) 58001faf4e4SMatthew Knepley 58101faf4e4SMatthew Knepley #define MPI_Allgatherv(sendbuf,sendcount,sendtype,recvbuf,recvcount,displs,recvtype,comm) \ 5825fa69175SJed Brown ((petsc_gather_ct += PetscMPIParallelComm((comm)),0) || MPI_Allgatherv((sendbuf),(sendcount),(sendtype),(recvbuf),(recvcount),(displs),(recvtype),(comm))) 58301faf4e4SMatthew Knepley 58401faf4e4SMatthew Knepley #define MPI_Gather(sendbuf,sendcount,sendtype,recvbuf,recvcount,recvtype,root,comm) \ 585f12d10ccSJunchao Zhang ((petsc_gather_ct++,0) || PetscMPITypeSize((sendcount),(sendtype),(&petsc_send_len)) || MPI_Gather((sendbuf),(sendcount),(sendtype),(recvbuf),(recvcount),(recvtype),(root),(comm))) 58601faf4e4SMatthew Knepley 58701faf4e4SMatthew Knepley #define MPI_Gatherv(sendbuf,sendcount,sendtype,recvbuf,recvcount,displs,recvtype,root,comm) \ 588f12d10ccSJunchao Zhang ((petsc_gather_ct++,0) || PetscMPITypeSize((sendcount),(sendtype),(&petsc_send_len)) || MPI_Gatherv((sendbuf),(sendcount),(sendtype),(recvbuf),(recvcount),(displs),(recvtype),(root),(comm))) 58901faf4e4SMatthew Knepley 59001faf4e4SMatthew Knepley #define MPI_Scatter(sendbuf,sendcount,sendtype,recvbuf,recvcount,recvtype,root,comm) \ 591f12d10ccSJunchao Zhang ((petsc_scatter_ct++,0) || PetscMPITypeSize((recvcount),(recvtype),(&petsc_recv_len)) || MPI_Scatter((sendbuf),(sendcount),(sendtype),(recvbuf),(recvcount),(recvtype),(root),(comm))) 59201faf4e4SMatthew Knepley 59301faf4e4SMatthew Knepley #define MPI_Scatterv(sendbuf,sendcount,displs,sendtype,recvbuf,recvcount,recvtype,root,comm) \ 594f12d10ccSJunchao Zhang ((petsc_scatter_ct++,0) || PetscMPITypeSize((recvcount),(recvtype),(&petsc_recv_len)) || MPI_Scatterv((sendbuf),(sendcount),(displs),(sendtype),(recvbuf),(recvcount),(recvtype),(root),(comm))) 595f12d10ccSJunchao Zhang 596f12d10ccSJunchao Zhang #define MPI_Ialltoall(sendbuf,sendcount,sendtype,recvbuf,recvcount,recvtype,comm,request) \ 597f12d10ccSJunchao Zhang ((petsc_allreduce_ct += PetscMPIParallelComm((comm)),0) || PetscMPITypeSize((sendcount),(sendtype),(&petsc_send_len)) || MPI_Ialltoall((sendbuf),(sendcount),(sendtype),(recvbuf),(recvcount),(recvtype),(comm),(request))) 598f12d10ccSJunchao Zhang 599f12d10ccSJunchao Zhang #define MPI_Ialltoallv(sendbuf,sendcnts,sdispls,sendtype,recvbuf,recvcnts,rdispls,recvtype,comm,request) \ 600f12d10ccSJunchao 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))) 601f12d10ccSJunchao Zhang 602f12d10ccSJunchao Zhang #define MPI_Iallgather(sendbuf,sendcount,sendtype,recvbuf,recvcount,recvtype,comm,request) \ 603f12d10ccSJunchao Zhang ((petsc_gather_ct += PetscMPIParallelComm((comm)),0) || MPI_Iallgather((sendbuf),(sendcount),(sendtype),(recvbuf),(recvcount),(recvtype),(comm),(request))) 604f12d10ccSJunchao Zhang 605f12d10ccSJunchao Zhang #define MPI_Iallgatherv(sendbuf,sendcount,sendtype,recvbuf,recvcount,displs,recvtype,comm,request) \ 606f12d10ccSJunchao Zhang ((petsc_gather_ct += PetscMPIParallelComm((comm)),0) || MPI_Iallgatherv((sendbuf),(sendcount),(sendtype),(recvbuf),(recvcount),(displs),(recvtype),(comm),(request))) 607f12d10ccSJunchao Zhang 608f12d10ccSJunchao Zhang #define MPI_Igather(sendbuf,sendcount,sendtype,recvbuf,recvcount,recvtype,root,comm,request) \ 609f12d10ccSJunchao Zhang ((petsc_gather_ct++,0) || PetscMPITypeSize((sendcount),(sendtype),(&petsc_send_len)) || MPI_Igather((sendbuf),(sendcount),(sendtype),(recvbuf),(recvcount),(recvtype),(root),(comm),(request))) 610f12d10ccSJunchao Zhang 611f12d10ccSJunchao Zhang #define MPI_Igatherv(sendbuf,sendcount,sendtype,recvbuf,recvcount,displs,recvtype,root,comm,request) \ 612f12d10ccSJunchao Zhang ((petsc_gather_ct++,0) || PetscMPITypeSize((sendcount),(sendtype),(&petsc_send_len)) || MPI_Igatherv((sendbuf),(sendcount),(sendtype),(recvbuf),(recvcount),(displs),(recvtype),(root),(comm),(request))) 613f12d10ccSJunchao Zhang 614f12d10ccSJunchao Zhang #define MPI_Iscatter(sendbuf,sendcount,sendtype,recvbuf,recvcount,recvtype,root,comm,request) \ 615f12d10ccSJunchao Zhang ((petsc_scatter_ct++,0) || PetscMPITypeSize((recvcount),(recvtype),(&petsc_recv_len)) || MPI_Iscatter((sendbuf),(sendcount),(sendtype),(recvbuf),(recvcount),(recvtype),(root),(comm),(request))) 616f12d10ccSJunchao Zhang 617f12d10ccSJunchao Zhang #define MPI_Iscatterv(sendbuf,sendcount,displs,sendtype,recvbuf,recvcount,recvtype,root,comm,request) \ 618f12d10ccSJunchao Zhang ((petsc_scatter_ct++,0) || PetscMPITypeSize((recvcount),(recvtype),(&petsc_recv_len)) || MPI_Iscatterv((sendbuf),(sendcount),(displs),(sendtype),(recvbuf),(recvcount),(recvtype),(root),(comm),(request))) 619f12d10ccSJunchao Zhang 620f12d10ccSJunchao Zhang /* We treat MPI_Ineighbor_alltoallv as a set of isend/irecv instead of a traditional MPI collective. 621f12d10ccSJunchao Zhang OpenMPI-3.0 ran into error with outdegree = indegree = 0, so we use ((outdegree) || (indegree)) as a workaround. 622f12d10ccSJunchao Zhang */ 623f12d10ccSJunchao Zhang #define MPI_Start_ineighbor_alltoallv(outdegree,indegree,sendbuf,sendcnts,sdispls,sendtype,recvbuf,recvcnts,rdispls,recvtype,comm,request) \ 624f12d10ccSJunchao 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)))) 625f12d10ccSJunchao Zhang 626f12d10ccSJunchao Zhang #define MPI_Start_neighbor_alltoallv(outdegree,indegree,sendbuf,sendcnts,sdispls,sendtype,recvbuf,recvcnts,rdispls,recvtype,comm) \ 627f12d10ccSJunchao 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)))) 62801faf4e4SMatthew Knepley 6290d4b0b6cSBarry Smith #else 6300d4b0b6cSBarry Smith 631457b14b1SJunchao Zhang #define MPI_Startall_irecv(count,datatype,number,requests) \ 632ea1c87f7SJunchao Zhang ((number) && MPI_Startall((number),(requests))) 6330d4b0b6cSBarry Smith 634457b14b1SJunchao Zhang #define MPI_Startall_isend(count,datatype,number,requests) \ 635ea1c87f7SJunchao Zhang ((number) && MPI_Startall((number),(requests))) 6360d4b0b6cSBarry Smith 637457b14b1SJunchao Zhang #define MPI_Start_isend(count,datatype,requests) \ 6385fa69175SJed Brown (MPI_Start((requests))) 6390d4b0b6cSBarry Smith 640f12d10ccSJunchao Zhang #define MPI_Start_ineighbor_alltoallv(outdegree,indegree,sendbuf,sendcnts,sdispls,sendtype,recvbuf,recvcnts,rdispls,recvtype,comm,request) \ 641f12d10ccSJunchao Zhang (((outdegree) || (indegree)) && MPI_Ineighbor_alltoallv((sendbuf),(sendcnts),(sdispls),(sendtype),(recvbuf),(recvcnts),(rdispls),(recvtype),(comm),(request))) 642f12d10ccSJunchao Zhang 643f12d10ccSJunchao Zhang #define MPI_Start_neighbor_alltoallv(outdegree,indegree,sendbuf,sendcnts,sdispls,sendtype,recvbuf,recvcnts,rdispls,recvtype,comm) \ 644f12d10ccSJunchao Zhang (((outdegree) || (indegree)) && MPI_Neighbor_alltoallv((sendbuf),(sendcnts),(sdispls),(sendtype),(recvbuf),(recvcnts),(rdispls),(recvtype),(comm))) 645c9b973beSBarry Smith #endif /* !MPIUNI_H && ! PETSC_HAVE_BROKEN_RECURSIVE_MACRO */ 646614700edSBarry Smith 647df8cf0b5SBarry Smith #else /* ---Logging is turned off --------------------------------------------*/ 648614700edSBarry Smith 649e3ed9ee7SBarry Smith #define PetscLogMemory PETSC_FALSE 650e3ed9ee7SBarry Smith 651b0a32e0cSBarry Smith #define PetscLogFlops(n) 0 652fa2bb9feSLisandro Dalcin #define PetscGetFlops(a) (*(a) = 0.0,0) 653614700edSBarry Smith 654fa2bb9feSLisandro Dalcin #define PetscLogStageRegister(a,b) 0 655fa2bb9feSLisandro Dalcin #define PetscLogStagePush(a) 0 656fa2bb9feSLisandro Dalcin #define PetscLogStagePop() 0 657f5d6ab90SLisandro Dalcin #define PetscLogStageSetActive(a,b) 0 658f5d6ab90SLisandro Dalcin #define PetscLogStageGetActive(a,b) 0 659f5d6ab90SLisandro Dalcin #define PetscLogStageGetVisible(a,b) 0 660f5d6ab90SLisandro Dalcin #define PetscLogStageSetVisible(a,b) 0 661f5d6ab90SLisandro Dalcin #define PetscLogStageGetId(a,b) (*(b)=0,0) 662f5d6ab90SLisandro Dalcin 663fa2bb9feSLisandro Dalcin #define PetscLogEventRegister(a,b,c) 0 664fa2bb9feSLisandro Dalcin #define PetscLogEventSetCollective(a,b) 0 665fa2bb9feSLisandro Dalcin #define PetscLogEventIncludeClass(a) 0 666fa2bb9feSLisandro Dalcin #define PetscLogEventExcludeClass(a) 0 667b0a32e0cSBarry Smith #define PetscLogEventActivate(a) 0 668b0a32e0cSBarry Smith #define PetscLogEventDeactivate(a) 0 669b0a32e0cSBarry Smith #define PetscLogEventActivateClass(a) 0 670b0a32e0cSBarry Smith #define PetscLogEventDeactivateClass(a) 0 671e8e7597cSSatish Balay #define PetscLogEventSetActiveAll(a,b) 0 67246eb3cd7SSatish Balay #define PetscLogEventGetId(a,b) (*(b)=0,0) 673561b2a67SSatish Balay #define PetscLogEventGetPerfInfo(a,b,c) 0 6749c702cfcSMatthew G. Knepley #define PetscLogEventSetDof(a,b,c) 0 6759c702cfcSMatthew G. Knepley #define PetscLogEventSetError(a,b,c) 0 67677c4ece6SBarry Smith 6778b5db460SBarry Smith #define PetscLogPLB 0 6788b5db460SBarry Smith #define PetscLogPLE 0 6798b5db460SBarry Smith #define PetscLogPHC 0 6808b5db460SBarry Smith #define PetscLogPHD 0 681f5d6ab90SLisandro Dalcin 682efee365bSSatish Balay #define PetscLogObjectParents(p,n,c) 0 68352e6d16bSBarry Smith #define PetscLogObjectCreate(h) 0 68452e6d16bSBarry Smith #define PetscLogObjectDestroy(h) 0 685fa2bb9feSLisandro Dalcin PETSC_EXTERN PetscErrorCode PetscLogObjectState(PetscObject,const char[],...); 686fa2bb9feSLisandro Dalcin 687bb1d7374SBarry Smith #define PetscLogDefaultBegin() 0 688b0a32e0cSBarry Smith #define PetscLogAllBegin() 0 689bb1d7374SBarry Smith #define PetscLogNestedBegin() 0 690fa2bb9feSLisandro Dalcin #define PetscLogTraceBegin(file) 0 69173fda44aSBarry Smith #define PetscLogActions(a) 0 692fa2bb9feSLisandro Dalcin #define PetscLogObjects(a) 0 693fa2bb9feSLisandro Dalcin #define PetscLogSetThreshold(a,b) 0 694fa2bb9feSLisandro Dalcin #define PetscLogSet(lb,le) 0 695fa2bb9feSLisandro Dalcin 696fa2bb9feSLisandro Dalcin #define PetscLogView(viewer) 0 697fa2bb9feSLisandro Dalcin #define PetscLogViewFromOptions() 0 698fa2bb9feSLisandro Dalcin #define PetscLogDump(c) 0 699fa2bb9feSLisandro Dalcin 70062872c28SLisandro Dalcin #define PetscLogEventSync(e,comm) 0 701fa2bb9feSLisandro Dalcin #define PetscLogEventBegin(e,o1,o2,o3,o4) 0 702fa2bb9feSLisandro Dalcin #define PetscLogEventEnd(e,o1,o2,o3,o4) 0 703ce6058e1SBarry Smith 704*091bc5acSJunchao Zhang #if defined(PETSC_HAVE_DEVICE) 7058157aad8SJunchao Zhang #define PetscLogCpuToGpu(a) 0 7068157aad8SJunchao Zhang #define PetscLogGpuToCpu(a) 0 7078157aad8SJunchao Zhang #define PetscLogGpuFlops(a) 0 7088157aad8SJunchao Zhang #define PetscLogGpuTimeBegin() 0 7098157aad8SJunchao Zhang #define PetscLogGpuTimeEnd() 0 7108157aad8SJunchao Zhang #define PetscLogGpuTimeAdd(a) 0 7118df2f0b1SJunchao Zhang #endif 7128157aad8SJunchao Zhang 713aa482453SBarry Smith /* If PETSC_USE_LOG is NOT defined, these still need to be! */ 714ea1c87f7SJunchao Zhang #define MPI_Startall_irecv(count,datatype,number,requests) ((number) && MPI_Startall(number,requests)) 715ea1c87f7SJunchao Zhang #define MPI_Startall_isend(count,datatype,number,requests) ((number) && MPI_Startall(number,requests)) 716457b14b1SJunchao Zhang #define MPI_Start_isend(count,datatype,requests) MPI_Start(requests) 717f12d10ccSJunchao Zhang #define MPI_Start_ineighbor_alltoallv(outdegree,indegree,sendbuf,sendcnts,sdispls,sendtype,recvbuf,recvcnts,rdispls,recvtype,comm,request) \ 718f12d10ccSJunchao Zhang (((outdegree) || (indegree)) && MPI_Ineighbor_alltoallv((sendbuf),(sendcnts),(sdispls),(sendtype),(recvbuf),(recvcnts),(rdispls),(recvtype),(comm),(request))) 719f12d10ccSJunchao Zhang #define MPI_Start_neighbor_alltoallv(outdegree,indegree,sendbuf,sendcnts,sdispls,sendtype,recvbuf,recvcnts,rdispls,recvtype,comm) \ 720f12d10ccSJunchao Zhang (((outdegree) || (indegree)) && MPI_Neighbor_alltoallv((sendbuf),(sendcnts),(sdispls),(sendtype),(recvbuf),(recvcnts),(rdispls),(recvtype),(comm))) 721f141ce34SMatthew Knepley 722aa482453SBarry Smith #endif /* PETSC_USE_LOG */ 7236daaf66cSBarry Smith 724204a6943SJed Brown #define PetscPreLoadBegin(flag,name) \ 725204a6943SJed Brown do {\ 726204a6943SJed Brown PetscBool PetscPreLoading = flag;\ 727204a6943SJed Brown int PetscPreLoadMax,PetscPreLoadIt;\ 728166c7f25SBarry Smith PetscLogStage _stageNum;\ 7298cbcd9ccSBarry Smith PetscErrorCode _3_ierr; \ 730c5929fdfSBarry Smith _3_ierr = PetscOptionsGetBool(NULL,NULL,"-preload",&PetscPreLoading,NULL);CHKERRQ(_3_ierr); \ 731204a6943SJed Brown PetscPreLoadMax = (int)(PetscPreLoading);\ 732204a6943SJed Brown PetscPreLoadingUsed = PetscPreLoading ? PETSC_TRUE : PetscPreLoadingUsed;\ 733204a6943SJed Brown for (PetscPreLoadIt=0; PetscPreLoadIt<=PetscPreLoadMax; PetscPreLoadIt++) {\ 734204a6943SJed Brown PetscPreLoadingOn = PetscPreLoading;\ 7350298fd71SBarry Smith _3_ierr = PetscBarrier(NULL);CHKERRQ(_3_ierr);\ 736204a6943SJed Brown if (PetscPreLoadIt>0) {\ 7378e58c17dSMatthew Knepley _3_ierr = PetscLogStageGetId(name,&_stageNum);CHKERRQ(_3_ierr);\ 7388e58c17dSMatthew Knepley } else {\ 739a3bc4eb9SBarry Smith _3_ierr = PetscLogStageRegister(name,&_stageNum);CHKERRQ(_3_ierr); \ 7408e58c17dSMatthew Knepley }\ 741204a6943SJed Brown _3_ierr = PetscLogStageSetActive(_stageNum,(PetscBool)(!PetscPreLoadMax || PetscPreLoadIt));\ 7428e58c17dSMatthew Knepley _3_ierr = PetscLogStagePush(_stageNum);CHKERRQ(_3_ierr); 7438e58c17dSMatthew Knepley 744204a6943SJed Brown #define PetscPreLoadEnd() \ 745043328b6SSatish Balay _3_ierr = PetscLogStagePop();CHKERRQ(_3_ierr);\ 746204a6943SJed Brown PetscPreLoading = PETSC_FALSE;\ 747043328b6SSatish Balay }\ 748204a6943SJed Brown } while (0) 7498e58c17dSMatthew Knepley 750204a6943SJed Brown #define PetscPreLoadStage(name) do { \ 751043328b6SSatish Balay _3_ierr = PetscLogStagePop();CHKERRQ(_3_ierr); \ 752204a6943SJed Brown if (PetscPreLoadIt>0) { \ 7538e58c17dSMatthew Knepley _3_ierr = PetscLogStageGetId(name,&_stageNum);CHKERRQ(_3_ierr); \ 7548e58c17dSMatthew Knepley } else { \ 755a3bc4eb9SBarry Smith _3_ierr = PetscLogStageRegister(name,&_stageNum);CHKERRQ(_3_ierr); \ 7568e58c17dSMatthew Knepley } \ 757204a6943SJed Brown _3_ierr = PetscLogStageSetActive(_stageNum,(PetscBool)(!PetscPreLoadMax || PetscPreLoadIt)); \ 758204a6943SJed Brown _3_ierr = PetscLogStagePush(_stageNum);CHKERRQ(_3_ierr); \ 759204a6943SJed Brown } while (0) 760e9fa29b7SSatish Balay 761ad14c47eSJed Brown /* some vars for logging */ 762ad14c47eSJed Brown PETSC_EXTERN PetscBool PetscPreLoadingUsed; /* true if we are or have done preloading */ 763ad14c47eSJed Brown PETSC_EXTERN PetscBool PetscPreLoadingOn; /* true if we are currently in a preloading calculation */ 764ad14c47eSJed Brown 76597bb86f7SLois Curfman McInnes #endif 766