xref: /petsc/src/sys/logging/handler/impls/mpe/logmpe.c (revision ad4c700a6ebc38b60b2fdd96cddbb3030870786f)
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 
PetscLogHandlerContextCreate_MPE(PetscLogHandler_MPE * mpe_p)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 
PetscLogHandlerDestroy_MPE(PetscLogHandler h)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 
PetscLogMPEGetRGBColor_Internal(const char * str[])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 
PetscLogHandlerMPECreateEvent(const char name[],PetscLogMPEArray array)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 
PetscLogHandlerMPEUpdate(PetscLogHandler h)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 
PetscLogHandlerEventBegin_MPE(PetscLogHandler handler,PetscLogEvent event,PetscObject o1,PetscObject o2,PetscObject o3,PetscObject o4)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 
PetscLogHandlerEventEnd_MPE(PetscLogHandler handler,PetscLogEvent event,PetscObject o1,PetscObject o2,PetscObject o3,PetscObject o4)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
118294de794SToby Isaac   PETSCLOGHANDLERMPE - PETSCLOGHANDLERMPE = "mpe" -  A
119*baca6076SPierre Jolivet   `PetscLogHandler` that collects data for MPE, the MPI Parallel Environment 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 
PetscLogHandlerCreate_MPE(PetscLogHandler handler)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