1 #include <petsc/private/logimpl.h> /*I "petscsys.h" I*/ 2 #include <petsc/private/loghandlerimpl.h> 3 #include <mpe.h> 4 5 typedef struct _n_PetscEventMPE { 6 int start; 7 int final; 8 } PetscEventMPE; 9 10 PETSC_LOG_RESIZABLE_ARRAY(MPEArray, PetscEventMPE, void *, NULL, NULL, NULL); 11 12 typedef struct _n_PetscLogHandler_MPE *PetscLogHandler_MPE; 13 14 struct _n_PetscLogHandler_MPE { 15 PetscLogMPEArray events; 16 }; 17 18 static PetscErrorCode PetscLogHandlerContextCreate_MPE(PetscLogHandler_MPE *mpe_p) 19 { 20 PetscLogHandler_MPE mpe; 21 22 PetscFunctionBegin; 23 PetscCall(PetscNew(mpe_p)); 24 mpe = *mpe_p; 25 PetscCall(PetscLogMPEArrayCreate(128, &mpe->events)); 26 PetscFunctionReturn(PETSC_SUCCESS); 27 } 28 29 static PetscErrorCode PetscLogHandlerDestroy_MPE(PetscLogHandler h) 30 { 31 PetscLogHandler_MPE mpe = (PetscLogHandler_MPE)h->data; 32 33 PetscFunctionBegin; 34 PetscCall(PetscLogMPEArrayDestroy(&mpe->events)); 35 PetscCall(PetscFree(mpe)); 36 PetscFunctionReturn(PETSC_SUCCESS); 37 } 38 39 #define PETSC_RGB_COLORS_MAX 39 40 static const char *PetscLogMPERGBColors[PETSC_RGB_COLORS_MAX] = {"OliveDrab: ", "BlueViolet: ", "CadetBlue: ", "CornflowerBlue: ", "DarkGoldenrod: ", "DarkGreen: ", "DarkKhaki: ", "DarkOliveGreen: ", 41 "DarkOrange: ", "DarkOrchid: ", "DarkSeaGreen: ", "DarkSlateGray: ", "DarkTurquoise: ", "DeepPink: ", "DarkKhaki: ", "DimGray: ", 42 "DodgerBlue: ", "GreenYellow: ", "HotPink: ", "IndianRed: ", "LavenderBlush: ", "LawnGreen: ", "LemonChiffon: ", "LightCoral: ", 43 "LightCyan: ", "LightPink: ", "LightSalmon: ", "LightSlateGray: ", "LightYellow: ", "LimeGreen: ", "MediumPurple: ", "MediumSeaGreen: ", 44 "MediumSlateBlue:", "MidnightBlue: ", "MintCream: ", "MistyRose: ", "NavajoWhite: ", "NavyBlue: ", "OliveDrab: "}; 45 46 static PetscErrorCode PetscLogMPEGetRGBColor_Internal(const char *str[]) 47 { 48 static int idx = 0; 49 50 PetscFunctionBegin; 51 *str = PetscLogMPERGBColors[idx]; 52 idx = (idx + 1) % PETSC_RGB_COLORS_MAX; 53 PetscFunctionReturn(PETSC_SUCCESS); 54 } 55 56 static PetscErrorCode PetscLogHandlerMPECreateEvent(const char name[], PetscLogMPEArray array) 57 { 58 PetscEventMPE mpe_event; 59 PetscMPIInt rank; 60 61 PetscFunctionBegin; 62 MPE_Log_get_state_eventIDs(&mpe_event.start, &mpe_event.final); 63 PetscCallMPI(MPI_Comm_rank(PETSC_COMM_WORLD, &rank)); 64 if (rank == 0) { 65 const char *color; 66 67 PetscCall(PetscLogMPEGetRGBColor_Internal(&color)); 68 MPE_Describe_state(mpe_event.start, mpe_event.final, name, (char *)color); 69 } 70 PetscCall(PetscLogMPEArrayPush(array, mpe_event)); 71 PetscFunctionReturn(PETSC_SUCCESS); 72 } 73 74 static PetscErrorCode PetscLogHandlerMPEUpdate(PetscLogHandler h) 75 { 76 PetscLogHandler_MPE mpe = (PetscLogHandler_MPE)h->data; 77 PetscLogState state; 78 PetscInt num_events, num_events_old; 79 80 PetscFunctionBegin; 81 PetscCall(PetscLogHandlerGetState(h, &state)); 82 PetscCall(PetscLogStateGetNumEvents(state, &num_events)); 83 PetscCall(PetscLogMPEArrayGetSize(mpe->events, &num_events_old, NULL)); 84 for (PetscInt i = num_events_old; i < num_events; i++) { 85 PetscLogEventInfo event_info; 86 87 PetscCall(PetscLogStateEventGetInfo(state, (PetscLogEvent)i, &event_info)); 88 PetscCall(PetscLogHandlerMPECreateEvent(event_info.name, mpe->events)); 89 } 90 PetscFunctionReturn(PETSC_SUCCESS); 91 } 92 93 static PetscErrorCode PetscLogHandlerEventBegin_MPE(PetscLogHandler handler, PetscLogEvent event, PetscObject o1, PetscObject o2, PetscObject o3, PetscObject o4) 94 { 95 PetscLogHandler_MPE mpe = (PetscLogHandler_MPE)handler->data; 96 PetscEventMPE mpe_event; 97 98 PetscFunctionBegin; 99 PetscCall(PetscLogHandlerMPEUpdate(handler)); 100 PetscCall(PetscLogMPEArrayGet(mpe->events, event, &mpe_event)); 101 PetscCall(MPE_Log_event(mpe_event.start, 0, NULL)); 102 PetscFunctionReturn(PETSC_SUCCESS); 103 } 104 105 static PetscErrorCode PetscLogHandlerEventEnd_MPE(PetscLogHandler handler, PetscLogEvent event, PetscObject o1, PetscObject o2, PetscObject o3, PetscObject o4) 106 { 107 PetscLogHandler_MPE mpe = (PetscLogHandler_MPE)handler->data; 108 PetscEventMPE mpe_event; 109 110 PetscFunctionBegin; 111 PetscCall(PetscLogHandlerMPEUpdate(handler)); 112 PetscCall(PetscLogMPEArrayGet(mpe->events, event, &mpe_event)); 113 PetscCall(MPE_Log_event(mpe_event.final, 0, NULL)); 114 PetscFunctionReturn(PETSC_SUCCESS); 115 } 116 117 /*MC 118 PETSCLOGHANDLERMPE - PETSCLOGHANDLERMPE = "mpe" - A 119 `PetscLogHandler` that collects data for MPE, the MPI Parallel Environment for 120 performance visualization. A log handler of this type is created and started 121 by `PetscLogMPEBegin()`. 122 123 Level: developer 124 125 .seealso: [](ch_profiling), `PetscLogHandler` 126 M*/ 127 128 PETSC_INTERN PetscErrorCode PetscLogHandlerCreate_MPE(PetscLogHandler handler) 129 { 130 PetscFunctionBegin; 131 PetscCall(PetscLogHandlerContextCreate_MPE((PetscLogHandler_MPE *)&handler->data)); 132 handler->ops->destroy = PetscLogHandlerDestroy_MPE; 133 handler->ops->eventbegin = PetscLogHandlerEventBegin_MPE; 134 handler->ops->eventend = PetscLogHandlerEventEnd_MPE; 135 PetscFunctionReturn(PETSC_SUCCESS); 136 } 137