xref: /petsc/src/sys/logging/handler/impls/mpe/logmpe.c (revision ad4c700a6ebc38b60b2fdd96cddbb3030870786f)
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