1856bee69SToby Isaac #include <petsc/private/logimpl.h> /*I "petscsys.h" I*/ 2856bee69SToby Isaac #include <petsc/private/loghandlerimpl.h> 3856bee69SToby Isaac #include <mpe.h> 4856bee69SToby Isaac 5856bee69SToby Isaac typedef struct _n_PetscEventMPE { 6856bee69SToby Isaac int start; 7856bee69SToby Isaac int final; 8856bee69SToby Isaac } PetscEventMPE; 9856bee69SToby Isaac 10856bee69SToby Isaac PETSC_LOG_RESIZABLE_ARRAY(MPEArray, PetscEventMPE, void *, NULL, NULL, NULL); 11856bee69SToby Isaac 12856bee69SToby Isaac typedef struct _n_PetscLogHandler_MPE *PetscLogHandler_MPE; 13856bee69SToby Isaac 14856bee69SToby Isaac struct _n_PetscLogHandler_MPE { 15856bee69SToby Isaac PetscLogMPEArray events; 16856bee69SToby Isaac }; 17856bee69SToby Isaac 18856bee69SToby Isaac static PetscErrorCode PetscLogHandlerContextCreate_MPE(PetscLogHandler_MPE *mpe_p) 19856bee69SToby Isaac { 20856bee69SToby Isaac PetscLogHandler_MPE mpe; 21856bee69SToby Isaac 22856bee69SToby Isaac PetscFunctionBegin; 23856bee69SToby Isaac PetscCall(PetscNew(mpe_p)); 24856bee69SToby Isaac mpe = *mpe_p; 25856bee69SToby Isaac PetscCall(PetscLogMPEArrayCreate(128, &mpe->events)); 26856bee69SToby Isaac PetscFunctionReturn(PETSC_SUCCESS); 27856bee69SToby Isaac } 28856bee69SToby Isaac 29856bee69SToby Isaac static PetscErrorCode PetscLogHandlerDestroy_MPE(PetscLogHandler h) 30856bee69SToby Isaac { 31856bee69SToby Isaac PetscLogHandler_MPE mpe = (PetscLogHandler_MPE)h->data; 32856bee69SToby Isaac 33856bee69SToby Isaac PetscFunctionBegin; 34856bee69SToby Isaac PetscCall(PetscLogMPEArrayDestroy(&mpe->events)); 35856bee69SToby Isaac PetscCall(PetscFree(mpe)); 36856bee69SToby Isaac PetscFunctionReturn(PETSC_SUCCESS); 37856bee69SToby Isaac } 38856bee69SToby Isaac 39856bee69SToby Isaac #define PETSC_RGB_COLORS_MAX 39 40856bee69SToby Isaac static const char *PetscLogMPERGBColors[PETSC_RGB_COLORS_MAX] = {"OliveDrab: ", "BlueViolet: ", "CadetBlue: ", "CornflowerBlue: ", "DarkGoldenrod: ", "DarkGreen: ", "DarkKhaki: ", "DarkOliveGreen: ", 41856bee69SToby Isaac "DarkOrange: ", "DarkOrchid: ", "DarkSeaGreen: ", "DarkSlateGray: ", "DarkTurquoise: ", "DeepPink: ", "DarkKhaki: ", "DimGray: ", 42856bee69SToby Isaac "DodgerBlue: ", "GreenYellow: ", "HotPink: ", "IndianRed: ", "LavenderBlush: ", "LawnGreen: ", "LemonChiffon: ", "LightCoral: ", 43856bee69SToby Isaac "LightCyan: ", "LightPink: ", "LightSalmon: ", "LightSlateGray: ", "LightYellow: ", "LimeGreen: ", "MediumPurple: ", "MediumSeaGreen: ", 44856bee69SToby Isaac "MediumSlateBlue:", "MidnightBlue: ", "MintCream: ", "MistyRose: ", "NavajoWhite: ", "NavyBlue: ", "OliveDrab: "}; 45856bee69SToby Isaac 46856bee69SToby Isaac static PetscErrorCode PetscLogMPEGetRGBColor_Internal(const char *str[]) 47856bee69SToby Isaac { 48856bee69SToby Isaac static int idx = 0; 49856bee69SToby Isaac 50856bee69SToby Isaac PetscFunctionBegin; 51856bee69SToby Isaac *str = PetscLogMPERGBColors[idx]; 52856bee69SToby Isaac idx = (idx + 1) % PETSC_RGB_COLORS_MAX; 53856bee69SToby Isaac PetscFunctionReturn(PETSC_SUCCESS); 54856bee69SToby Isaac } 55856bee69SToby Isaac 56856bee69SToby Isaac static PetscErrorCode PetscLogHandlerMPECreateEvent(const char name[], PetscLogMPEArray array) 57856bee69SToby Isaac { 58856bee69SToby Isaac PetscEventMPE mpe_event; 59856bee69SToby Isaac PetscMPIInt rank; 60856bee69SToby Isaac 61856bee69SToby Isaac PetscFunctionBegin; 62856bee69SToby Isaac MPE_Log_get_state_eventIDs(&mpe_event.start, &mpe_event.final); 63856bee69SToby Isaac PetscCallMPI(MPI_Comm_rank(PETSC_COMM_WORLD, &rank)); 64856bee69SToby Isaac if (rank == 0) { 65856bee69SToby Isaac const char *color; 66856bee69SToby Isaac 67856bee69SToby Isaac PetscCall(PetscLogMPEGetRGBColor_Internal(&color)); 68856bee69SToby Isaac MPE_Describe_state(mpe_event.start, mpe_event.final, name, (char *)color); 69856bee69SToby Isaac } 70856bee69SToby Isaac PetscCall(PetscLogMPEArrayPush(array, mpe_event)); 71856bee69SToby Isaac PetscFunctionReturn(PETSC_SUCCESS); 72856bee69SToby Isaac } 73856bee69SToby Isaac 74856bee69SToby Isaac static PetscErrorCode PetscLogHandlerMPEUpdate(PetscLogHandler h) 75856bee69SToby Isaac { 76856bee69SToby Isaac PetscLogHandler_MPE mpe = (PetscLogHandler_MPE)h->data; 77856bee69SToby Isaac PetscLogState state; 78856bee69SToby Isaac PetscInt num_events, num_events_old; 79856bee69SToby Isaac 80856bee69SToby Isaac PetscFunctionBegin; 81856bee69SToby Isaac PetscCall(PetscLogHandlerGetState(h, &state)); 82856bee69SToby Isaac PetscCall(PetscLogStateGetNumEvents(state, &num_events)); 83856bee69SToby Isaac PetscCall(PetscLogMPEArrayGetSize(mpe->events, &num_events_old, NULL)); 84856bee69SToby Isaac for (PetscInt i = num_events_old; i < num_events; i++) { 85856bee69SToby Isaac PetscLogEventInfo event_info; 86856bee69SToby Isaac 87856bee69SToby Isaac PetscCall(PetscLogStateEventGetInfo(state, (PetscLogEvent)i, &event_info)); 88856bee69SToby Isaac PetscCall(PetscLogHandlerMPECreateEvent(event_info.name, mpe->events)); 89856bee69SToby Isaac } 90856bee69SToby Isaac PetscFunctionReturn(PETSC_SUCCESS); 91856bee69SToby Isaac } 92856bee69SToby Isaac 93856bee69SToby Isaac static PetscErrorCode PetscLogHandlerEventBegin_MPE(PetscLogHandler handler, PetscLogEvent event, PetscObject o1, PetscObject o2, PetscObject o3, PetscObject o4) 94856bee69SToby Isaac { 95856bee69SToby Isaac PetscLogHandler_MPE mpe = (PetscLogHandler_MPE)handler->data; 96856bee69SToby Isaac PetscEventMPE mpe_event; 97856bee69SToby Isaac 98856bee69SToby Isaac PetscFunctionBegin; 99856bee69SToby Isaac PetscCall(PetscLogHandlerMPEUpdate(handler)); 100856bee69SToby Isaac PetscCall(PetscLogMPEArrayGet(mpe->events, event, &mpe_event)); 101856bee69SToby Isaac PetscCall(MPE_Log_event(mpe_event.start, 0, NULL)); 102856bee69SToby Isaac PetscFunctionReturn(PETSC_SUCCESS); 103856bee69SToby Isaac } 104856bee69SToby Isaac 105856bee69SToby Isaac static PetscErrorCode PetscLogHandlerEventEnd_MPE(PetscLogHandler handler, PetscLogEvent event, PetscObject o1, PetscObject o2, PetscObject o3, PetscObject o4) 106856bee69SToby Isaac { 107856bee69SToby Isaac PetscLogHandler_MPE mpe = (PetscLogHandler_MPE)handler->data; 108856bee69SToby Isaac PetscEventMPE mpe_event; 109856bee69SToby Isaac 110856bee69SToby Isaac PetscFunctionBegin; 111856bee69SToby Isaac PetscCall(PetscLogHandlerMPEUpdate(handler)); 112856bee69SToby Isaac PetscCall(PetscLogMPEArrayGet(mpe->events, event, &mpe_event)); 113856bee69SToby Isaac PetscCall(MPE_Log_event(mpe_event.final, 0, NULL)); 114856bee69SToby Isaac PetscFunctionReturn(PETSC_SUCCESS); 115856bee69SToby Isaac } 116856bee69SToby Isaac 117856bee69SToby Isaac /*MC 118*294de794SToby Isaac PETSCLOGHANDLERMPE - PETSCLOGHANDLERMPE = "mpe" - A 119856bee69SToby Isaac `PetscLogHandler` that collects data for MPE, the MPI Parallel Enviornment for 120b665b14eSToby Isaac performance visualization. A log handler of this type is created and started 121b665b14eSToby Isaac by `PetscLogMPEBegin()`. 122856bee69SToby Isaac 123856bee69SToby Isaac Level: developer 124856bee69SToby Isaac 125856bee69SToby Isaac .seealso: [](ch_profiling), `PetscLogHandler` 126856bee69SToby Isaac M*/ 127856bee69SToby Isaac 128856bee69SToby Isaac PETSC_INTERN PetscErrorCode PetscLogHandlerCreate_MPE(PetscLogHandler handler) 129856bee69SToby Isaac { 130856bee69SToby Isaac PetscFunctionBegin; 131856bee69SToby Isaac PetscCall(PetscLogHandlerContextCreate_MPE((PetscLogHandler_MPE *)&handler->data)); 132856bee69SToby Isaac handler->ops->destroy = PetscLogHandlerDestroy_MPE; 133856bee69SToby Isaac handler->ops->eventbegin = PetscLogHandlerEventBegin_MPE; 134856bee69SToby Isaac handler->ops->eventend = PetscLogHandlerEventEnd_MPE; 135856bee69SToby Isaac PetscFunctionReturn(PETSC_SUCCESS); 136856bee69SToby Isaac } 137