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 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 @*/ 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 @*/ 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 @*/ 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 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 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