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
PetscLogHandlerContextCreate_MPE(PetscLogHandler_MPE * mpe_p)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
PetscLogHandlerDestroy_MPE(PetscLogHandler h)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
PetscLogMPEGetRGBColor_Internal(const char * str[])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
PetscLogHandlerMPECreateEvent(const char name[],PetscLogMPEArray array)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
PetscLogHandlerMPEUpdate(PetscLogHandler h)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
PetscLogHandlerEventBegin_MPE(PetscLogHandler handler,PetscLogEvent event,PetscObject o1,PetscObject o2,PetscObject o3,PetscObject o4)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
PetscLogHandlerEventEnd_MPE(PetscLogHandler handler,PetscLogEvent event,PetscObject o1,PetscObject o2,PetscObject o3,PetscObject o4)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
PetscLogHandlerCreate_MPE(PetscLogHandler handler)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