Actual source code: logmpe.c
1: #include <petsc/private/logimpl.h>
2: #include <petsc/private/loghandlerimpl.h>
3: #include <mpe.h>
5: typedef struct _n_PetscEventMPE {
6: int start;
7: int final;
8: } PetscEventMPE;
10: PETSC_LOG_RESIZABLE_ARRAY(MPEArray, PetscEventMPE, void *, NULL, NULL, NULL);
12: typedef struct _n_PetscLogHandler_MPE *PetscLogHandler_MPE;
14: struct _n_PetscLogHandler_MPE {
15: PetscLogMPEArray events;
16: };
18: static PetscErrorCode PetscLogHandlerContextCreate_MPE(PetscLogHandler_MPE *mpe_p)
19: {
20: PetscLogHandler_MPE mpe;
22: PetscFunctionBegin;
23: PetscCall(PetscNew(mpe_p));
24: mpe = *mpe_p;
25: PetscCall(PetscLogMPEArrayCreate(128, &mpe->events));
26: PetscFunctionReturn(PETSC_SUCCESS);
27: }
29: static PetscErrorCode PetscLogHandlerDestroy_MPE(PetscLogHandler h)
30: {
31: PetscLogHandler_MPE mpe = (PetscLogHandler_MPE)h->data;
33: PetscFunctionBegin;
34: PetscCall(PetscLogMPEArrayDestroy(&mpe->events));
35: PetscCall(PetscFree(mpe));
36: PetscFunctionReturn(PETSC_SUCCESS);
37: }
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: "};
46: static PetscErrorCode PetscLogMPEGetRGBColor_Internal(const char *str[])
47: {
48: static int idx = 0;
50: PetscFunctionBegin;
51: *str = PetscLogMPERGBColors[idx];
52: idx = (idx + 1) % PETSC_RGB_COLORS_MAX;
53: PetscFunctionReturn(PETSC_SUCCESS);
54: }
56: static PetscErrorCode PetscLogHandlerMPECreateEvent(const char name[], PetscLogMPEArray array)
57: {
58: PetscEventMPE mpe_event;
59: PetscMPIInt rank;
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;
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: }
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;
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;
87: PetscCall(PetscLogStateEventGetInfo(state, (PetscLogEvent)i, &event_info));
88: PetscCall(PetscLogHandlerMPECreateEvent(event_info.name, mpe->events));
89: }
90: PetscFunctionReturn(PETSC_SUCCESS);
91: }
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;
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: }
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;
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: }
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()`.
123: Level: developer
125: .seealso: [](ch_profiling), `PetscLogHandler`
126: M*/
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: }