1*b9321188SToby Isaac #if !defined(PETSC_LOGNESTED_H) 2*b9321188SToby Isaac #define PETSC_LOGNESTED_H 3*b9321188SToby Isaac 4*b9321188SToby Isaac #include <petsc/private/loghandlerimpl.h> 5*b9321188SToby Isaac #include <petsc/private/logimpl.h> 6*b9321188SToby Isaac #include <../src/sys/logging/handler/impls/default/logdefault.h> 7*b9321188SToby Isaac #include <petsc/private/hashmap.h> 8*b9321188SToby Isaac 9*b9321188SToby Isaac typedef int NestedId; 10*b9321188SToby Isaac 11*b9321188SToby Isaac static inline PETSC_UNUSED NestedId NestedIdFromEvent(PetscLogEvent e) 12*b9321188SToby Isaac { 13*b9321188SToby Isaac return e; 14*b9321188SToby Isaac } 15*b9321188SToby Isaac static inline PETSC_UNUSED NestedId NestedIdFromStage(PetscLogStage s) 16*b9321188SToby Isaac { 17*b9321188SToby Isaac return -(s + 2); 18*b9321188SToby Isaac } 19*b9321188SToby Isaac 20*b9321188SToby Isaac typedef struct _n_NestedIdPair NestedIdPair; 21*b9321188SToby Isaac struct _n_NestedIdPair { 22*b9321188SToby Isaac PetscLogEvent root; 23*b9321188SToby Isaac NestedId leaf; 24*b9321188SToby Isaac }; 25*b9321188SToby Isaac 26*b9321188SToby Isaac #define NestedIdPairHash(key) PetscHashCombine(PetscHash_UInt32((PetscHash32_t)((key).root)), PetscHash_UInt32((PetscHash32_t)((key).leaf))) 27*b9321188SToby Isaac #define NestedIdPairEqual(k1, k2) (((k1).root == (k2).root) && ((k1).leaf == (k2).leaf)) 28*b9321188SToby Isaac 29*b9321188SToby Isaac PETSC_HASH_MAP(NestedHash, NestedIdPair, PetscLogEvent, NestedIdPairHash, NestedIdPairEqual, -1) 30*b9321188SToby Isaac 31*b9321188SToby Isaac typedef struct _n_PetscLogHandler_Nested *PetscLogHandler_Nested; 32*b9321188SToby Isaac struct _n_PetscLogHandler_Nested { 33*b9321188SToby Isaac PetscLogState state; 34*b9321188SToby Isaac PetscLogHandler handler; 35*b9321188SToby Isaac PetscNestedHash pair_map; 36*b9321188SToby Isaac PetscIntStack stack; // stack of nested ids 37*b9321188SToby Isaac PetscClassId nested_stage_id; 38*b9321188SToby Isaac PetscLogDouble threshold; 39*b9321188SToby Isaac }; 40*b9321188SToby Isaac 41*b9321188SToby Isaac typedef struct { 42*b9321188SToby Isaac const char *name; 43*b9321188SToby Isaac PetscInt id; 44*b9321188SToby Isaac PetscInt parent; 45*b9321188SToby Isaac PetscInt num_descendants; 46*b9321188SToby Isaac } PetscNestedEventNode; 47*b9321188SToby Isaac 48*b9321188SToby Isaac typedef struct { 49*b9321188SToby Isaac MPI_Comm comm; 50*b9321188SToby Isaac PetscLogGlobalNames global_events; 51*b9321188SToby Isaac PetscNestedEventNode *nodes; 52*b9321188SToby Isaac PetscEventPerfInfo *perf; 53*b9321188SToby Isaac } PetscNestedEventTree; 54*b9321188SToby Isaac 55*b9321188SToby Isaac typedef enum { 56*b9321188SToby Isaac PETSC_LOG_NESTED_XML, 57*b9321188SToby Isaac PETSC_LOG_NESTED_FLAMEGRAPH 58*b9321188SToby Isaac } PetscLogNestedType; 59*b9321188SToby Isaac 60*b9321188SToby Isaac PETSC_INTERN PetscErrorCode PetscLogHandlerView_Nested_XML(PetscLogHandler_Nested, PetscNestedEventTree *, PetscViewer); 61*b9321188SToby Isaac PETSC_INTERN PetscErrorCode PetscLogHandlerView_Nested_Flamegraph(PetscLogHandler_Nested, PetscNestedEventTree *, PetscViewer); 62*b9321188SToby Isaac 63*b9321188SToby Isaac #endif // #define PETSC_LOGNESTED_H 64