1 #include <petsc/private/petscimpl.h>
2 #include <petsc/private/loghandlerimpl.h>
3
4 PetscClassId PETSCLOGHANDLER_CLASSID = 0;
5
6 PetscFunctionList PetscLogHandlerList = NULL;
7 PetscBool PetscLogHandlerRegisterAllCalled = PETSC_FALSE;
8 PetscBool PetscLogHandlerPackageInitialized = PETSC_FALSE;
9
10 PETSC_INTERN PetscErrorCode PetscLogHandlerCreate_Default(PetscLogHandler);
11 PETSC_INTERN PetscErrorCode PetscLogHandlerCreate_Nested(PetscLogHandler);
12 PETSC_INTERN PetscErrorCode PetscLogHandlerCreate_Trace(PetscLogHandler);
13 #if PetscDefined(HAVE_MPE)
14 PETSC_INTERN PetscErrorCode PetscLogHandlerCreate_MPE(PetscLogHandler);
15 #endif
16 #if PetscDefined(HAVE_TAU_PERFSTUBS)
17 PETSC_INTERN PetscErrorCode PetscLogHandlerCreate_Perfstubs(PetscLogHandler);
18 #endif
19 PETSC_INTERN PetscErrorCode PetscLogHandlerCreate_Legacy(PetscLogHandler);
20 #if PetscDefined(HAVE_CUDA)
21 PETSC_INTERN PetscErrorCode PetscLogHandlerCreate_NVTX(PetscLogHandler);
22 #endif
23 #if PetscDefined(HAVE_HIP)
24 PETSC_INTERN PetscErrorCode PetscLogHandlerCreate_ROCTX(PetscLogHandler);
25 #endif
26
PetscLogHandlerRegisterAll(void)27 static PetscErrorCode PetscLogHandlerRegisterAll(void)
28 {
29 PetscFunctionBegin;
30 if (PetscLogHandlerRegisterAllCalled) PetscFunctionReturn(PETSC_SUCCESS);
31 PetscLogHandlerRegisterAllCalled = PETSC_TRUE;
32 PetscCall(PetscLogHandlerRegister(PETSCLOGHANDLERDEFAULT, PetscLogHandlerCreate_Default));
33 PetscCall(PetscLogHandlerRegister(PETSCLOGHANDLERNESTED, PetscLogHandlerCreate_Nested));
34 PetscCall(PetscLogHandlerRegister(PETSCLOGHANDLERTRACE, PetscLogHandlerCreate_Trace));
35 #if PetscDefined(HAVE_MPE)
36 PetscCall(PetscLogHandlerRegister(PETSCLOGHANDLERMPE, PetscLogHandlerCreate_MPE));
37 #endif
38 #if PetscDefined(HAVE_TAU_PERFSTUBS)
39 PetscCall(PetscLogHandlerRegister(PETSCLOGHANDLERPERFSTUBS, PetscLogHandlerCreate_Perfstubs));
40 #endif
41 PetscCall(PetscLogHandlerRegister(PETSCLOGHANDLERLEGACY, PetscLogHandlerCreate_Legacy));
42 #if PetscDefined(HAVE_CUDA)
43 PetscCall(PetscLogHandlerRegister(PETSCLOGHANDLERNVTX, PetscLogHandlerCreate_NVTX));
44 #endif
45 #if PetscDefined(HAVE_ROCTX)
46 PetscCall(PetscLogHandlerRegister(PETSCLOGHANDLERROCTX, PetscLogHandlerCreate_ROCTX));
47 #endif
48 PetscFunctionReturn(PETSC_SUCCESS);
49 }
50
51 /*@C
52 PetscLogHandlerRegister - Register a new `PetscLogHandler`
53
54 Not Collective, No Fortran Support
55
56 Input Parameters:
57 + sname - The name of a new user-defined creation routine
58 - function - The creation routine
59
60 Example Usage:
61 .vb
62 PetscLogHandlerRegister("my_profiler", MyPetscLogHandlerCreate);
63 .ve
64
65 Then, your `PetscLogHandler` type can be chosen with the procedural interface via
66 .vb
67 PetscLogHandlerCreate(MPI_Comm, PetscLogHandler *);
68 PetscLogHandlerSetType(PetscFE, "my_fe");
69 .ve
70
71 Level: developer
72
73 .seealso: [](ch_profiling), `PetscLogHandler`, `PetscLogHandlerCreate()`, `PetscLogHandlerSetType()`, `PetscLogHandlerGetType()`
74 @*/
PetscLogHandlerRegister(const char sname[],PetscErrorCode (* function)(PetscLogHandler))75 PetscErrorCode PetscLogHandlerRegister(const char sname[], PetscErrorCode (*function)(PetscLogHandler))
76 {
77 PetscFunctionBegin;
78 PetscCall(PetscFunctionListAdd(&PetscLogHandlerList, sname, function));
79 PetscFunctionReturn(PETSC_SUCCESS);
80 }
81
82 /*@C
83 PetscLogHandlerSetType - Set the type of a `PetscLogHandler`
84
85 Input Parameters:
86 + handler - the `PetscLogHandler`
87 - name - The kind of log handler
88
89 Level: developer
90
91 .seealso: [](ch_profiling), `PetscLogHandler`, `PetscLogHandlerCreate()`, `PetscLogHandlerRegister()`, `PetscLogHandlerGetType()`
92 @*/
PetscLogHandlerSetType(PetscLogHandler handler,PetscLogHandlerType name)93 PetscErrorCode PetscLogHandlerSetType(PetscLogHandler handler, PetscLogHandlerType name)
94 {
95 PetscErrorCode (*r)(PetscLogHandler);
96 PetscBool match;
97
98 PetscFunctionBegin;
99 PetscValidHeaderSpecific(handler, PETSCLOGHANDLER_CLASSID, 1);
100 PetscCall(PetscObjectTypeCompare((PetscObject)handler, name, &match));
101 if (match) PetscFunctionReturn(PETSC_SUCCESS);
102
103 PetscCall(PetscLogHandlerRegisterAll());
104 PetscCall(PetscFunctionListFind(PetscLogHandlerList, name, &r));
105 PetscCheck(r, PetscObjectComm((PetscObject)handler), PETSC_ERR_ARG_UNKNOWN_TYPE, "Unknown PetscLogHandler type: %s", name);
106
107 PetscTryTypeMethod(handler, destroy);
108 handler->ops->destroy = NULL;
109
110 PetscCall((*r)(handler));
111 PetscCall(PetscObjectChangeTypeName((PetscObject)handler, name));
112 PetscFunctionReturn(PETSC_SUCCESS);
113 }
114
115 /*@C
116 PetscLogHandlerGetType - Gets the `PetscLoagHandlerType` (as a string) from the `PetscLogHandler` object.
117
118 Not collective
119
120 Input Parameter:
121 . handler - the `PetscLogHandler`
122
123 Output Parameter:
124 . name - The `PetscLogHandlerType` name
125
126 Level: developer
127
128 .seealso: [](ch_profiling), `PetscLogHandler`, `PetscLogHandlerCreate()`, `PetscLogHandlerRegister()`, `PetscLogHandlerSetType()`
129 @*/
PetscLogHandlerGetType(PetscLogHandler handler,PetscLogHandlerType * name)130 PetscErrorCode PetscLogHandlerGetType(PetscLogHandler handler, PetscLogHandlerType *name)
131 {
132 PetscFunctionBegin;
133 PetscValidHeaderSpecific(handler, PETSCLOGHANDLER_CLASSID, 1);
134 PetscAssertPointer(name, 2);
135 PetscCall(PetscLogHandlerRegisterAll());
136 PetscCall(PetscObjectGetType((PetscObject)handler, name));
137 PetscFunctionReturn(PETSC_SUCCESS);
138 }
139
PetscLogHandlerFinalizePackage(void)140 static PetscErrorCode PetscLogHandlerFinalizePackage(void)
141 {
142 PetscFunctionBegin;
143 PetscCall(PetscFunctionListDestroy(&PetscLogHandlerList));
144 PetscLogHandlerRegisterAllCalled = PETSC_FALSE;
145 PetscLogHandlerPackageInitialized = PETSC_FALSE;
146 PetscFunctionReturn(PETSC_SUCCESS);
147 }
148
PetscLogHandlerPackageInitialize(void)149 PetscErrorCode PetscLogHandlerPackageInitialize(void)
150 {
151 PetscFunctionBegin;
152 if (PetscLogHandlerPackageInitialized) PetscFunctionReturn(PETSC_SUCCESS);
153 PetscLogHandlerPackageInitialized = PETSC_TRUE;
154
155 PetscCall(PetscClassIdRegister("PETSc Log Handler", &PETSCLOGHANDLER_CLASSID));
156 PetscCall(PetscLogHandlerRegisterAll());
157 PetscCall(PetscRegisterFinalize(PetscLogHandlerFinalizePackage));
158 {
159 const PetscClassId classids[] = {PETSCLOGHANDLER_CLASSID};
160
161 PetscCall(PetscInfoProcessClass("loghandler", PETSC_STATIC_ARRAY_LENGTH(classids), classids));
162 }
163 PetscFunctionReturn(PETSC_SUCCESS);
164 }
165