119ef957cSToby Isaac #include <petsc/private/petscimpl.h> 219ef957cSToby Isaac #include <petsc/private/loghandlerimpl.h> 319ef957cSToby Isaac 419ef957cSToby Isaac PetscClassId PETSCLOGHANDLER_CLASSID = 0; 519ef957cSToby Isaac 619ef957cSToby Isaac PetscFunctionList PetscLogHandlerList = NULL; 719ef957cSToby Isaac PetscBool PetscLogHandlerRegisterAllCalled = PETSC_FALSE; 819ef957cSToby Isaac PetscBool PetscLogHandlerPackageInitialized = PETSC_FALSE; 919ef957cSToby Isaac 1078f1b9b4SToby Isaac PETSC_INTERN PetscErrorCode PetscLogHandlerCreate_Default(PetscLogHandler); 11b9321188SToby Isaac PETSC_INTERN PetscErrorCode PetscLogHandlerCreate_Nested(PetscLogHandler); 126467efc9SToby Isaac PETSC_INTERN PetscErrorCode PetscLogHandlerCreate_Trace(PetscLogHandler); 13856bee69SToby Isaac #if PetscDefined(HAVE_MPE) 14856bee69SToby Isaac PETSC_INTERN PetscErrorCode PetscLogHandlerCreate_MPE(PetscLogHandler); 15856bee69SToby Isaac #endif 16ccf0b5c1SToby Isaac #if PetscDefined(HAVE_TAU_PERFSTUBS) 17ccf0b5c1SToby Isaac PETSC_INTERN PetscErrorCode PetscLogHandlerCreate_Perfstubs(PetscLogHandler); 18ccf0b5c1SToby Isaac #endif 190970d93fSToby Isaac PETSC_INTERN PetscErrorCode PetscLogHandlerCreate_Legacy(PetscLogHandler); 2061cc7448SToby Isaac #if PetscDefined(HAVE_CUDA) 2161cc7448SToby Isaac PETSC_INTERN PetscErrorCode PetscLogHandlerCreate_NVTX(PetscLogHandler); 2261cc7448SToby Isaac #endif 23*56a72328SZach Atkins #if PetscDefined(HAVE_HIP) 24*56a72328SZach Atkins PETSC_INTERN PetscErrorCode PetscLogHandlerCreate_ROCTX(PetscLogHandler); 25*56a72328SZach Atkins #endif 2678f1b9b4SToby Isaac 2719ef957cSToby Isaac static PetscErrorCode PetscLogHandlerRegisterAll(void) 2819ef957cSToby Isaac { 2919ef957cSToby Isaac PetscFunctionBegin; 3019ef957cSToby Isaac if (PetscLogHandlerRegisterAllCalled) PetscFunctionReturn(PETSC_SUCCESS); 3119ef957cSToby Isaac PetscLogHandlerRegisterAllCalled = PETSC_TRUE; 32294de794SToby Isaac PetscCall(PetscLogHandlerRegister(PETSCLOGHANDLERDEFAULT, PetscLogHandlerCreate_Default)); 33294de794SToby Isaac PetscCall(PetscLogHandlerRegister(PETSCLOGHANDLERNESTED, PetscLogHandlerCreate_Nested)); 34294de794SToby Isaac PetscCall(PetscLogHandlerRegister(PETSCLOGHANDLERTRACE, PetscLogHandlerCreate_Trace)); 35856bee69SToby Isaac #if PetscDefined(HAVE_MPE) 36294de794SToby Isaac PetscCall(PetscLogHandlerRegister(PETSCLOGHANDLERMPE, PetscLogHandlerCreate_MPE)); 37856bee69SToby Isaac #endif 38ccf0b5c1SToby Isaac #if PetscDefined(HAVE_TAU_PERFSTUBS) 39294de794SToby Isaac PetscCall(PetscLogHandlerRegister(PETSCLOGHANDLERPERFSTUBS, PetscLogHandlerCreate_Perfstubs)); 40ccf0b5c1SToby Isaac #endif 41294de794SToby Isaac PetscCall(PetscLogHandlerRegister(PETSCLOGHANDLERLEGACY, PetscLogHandlerCreate_Legacy)); 4261cc7448SToby Isaac #if PetscDefined(HAVE_CUDA) 4361cc7448SToby Isaac PetscCall(PetscLogHandlerRegister(PETSCLOGHANDLERNVTX, PetscLogHandlerCreate_NVTX)); 4461cc7448SToby Isaac #endif 45*56a72328SZach Atkins #if PetscDefined(HAVE_ROCTX) 46*56a72328SZach Atkins PetscCall(PetscLogHandlerRegister(PETSCLOGHANDLERROCTX, PetscLogHandlerCreate_ROCTX)); 47*56a72328SZach Atkins #endif 4819ef957cSToby Isaac PetscFunctionReturn(PETSC_SUCCESS); 4919ef957cSToby Isaac } 5019ef957cSToby Isaac 5119ef957cSToby Isaac /*@C 5219ef957cSToby Isaac PetscLogHandlerRegister - Register a new `PetscLogHandler` 5319ef957cSToby Isaac 54cc4c1da9SBarry Smith Not Collective, No Fortran Support 5519ef957cSToby Isaac 5619ef957cSToby Isaac Input Parameters: 5719ef957cSToby Isaac + sname - The name of a new user-defined creation routine 5819ef957cSToby Isaac - function - The creation routine 5919ef957cSToby Isaac 6019ef957cSToby Isaac Example Usage: 6119ef957cSToby Isaac .vb 6219ef957cSToby Isaac PetscLogHandlerRegister("my_profiler", MyPetscLogHandlerCreate); 6319ef957cSToby Isaac .ve 6419ef957cSToby Isaac 6519ef957cSToby Isaac Then, your `PetscLogHandler` type can be chosen with the procedural interface via 6619ef957cSToby Isaac .vb 6719ef957cSToby Isaac PetscLogHandlerCreate(MPI_Comm, PetscLogHandler *); 6819ef957cSToby Isaac PetscLogHandlerSetType(PetscFE, "my_fe"); 6919ef957cSToby Isaac .ve 7019ef957cSToby Isaac 7119ef957cSToby Isaac Level: developer 7219ef957cSToby Isaac 7319ef957cSToby Isaac .seealso: [](ch_profiling), `PetscLogHandler`, `PetscLogHandlerCreate()`, `PetscLogHandlerSetType()`, `PetscLogHandlerGetType()` 7419ef957cSToby Isaac @*/ 7519ef957cSToby Isaac PetscErrorCode PetscLogHandlerRegister(const char sname[], PetscErrorCode (*function)(PetscLogHandler)) 7619ef957cSToby Isaac { 7719ef957cSToby Isaac PetscFunctionBegin; 7819ef957cSToby Isaac PetscCall(PetscFunctionListAdd(&PetscLogHandlerList, sname, function)); 7919ef957cSToby Isaac PetscFunctionReturn(PETSC_SUCCESS); 8019ef957cSToby Isaac } 8119ef957cSToby Isaac 8219ef957cSToby Isaac /*@C 8319ef957cSToby Isaac PetscLogHandlerSetType - Set the type of a `PetscLogHandler` 8419ef957cSToby Isaac 8519ef957cSToby Isaac Input Parameters: 8619ef957cSToby Isaac + handler - the `PetscLogHandler` 8719ef957cSToby Isaac - name - The kind of log handler 8819ef957cSToby Isaac 8919ef957cSToby Isaac Level: developer 9019ef957cSToby Isaac 9119ef957cSToby Isaac .seealso: [](ch_profiling), `PetscLogHandler`, `PetscLogHandlerCreate()`, `PetscLogHandlerRegister()`, `PetscLogHandlerGetType()` 9219ef957cSToby Isaac @*/ 9319ef957cSToby Isaac PetscErrorCode PetscLogHandlerSetType(PetscLogHandler handler, PetscLogHandlerType name) 9419ef957cSToby Isaac { 9519ef957cSToby Isaac PetscErrorCode (*r)(PetscLogHandler); 9619ef957cSToby Isaac PetscBool match; 9719ef957cSToby Isaac 9819ef957cSToby Isaac PetscFunctionBegin; 9919ef957cSToby Isaac PetscValidHeaderSpecific(handler, PETSCLOGHANDLER_CLASSID, 1); 10019ef957cSToby Isaac PetscCall(PetscObjectTypeCompare((PetscObject)handler, name, &match)); 10119ef957cSToby Isaac if (match) PetscFunctionReturn(PETSC_SUCCESS); 10219ef957cSToby Isaac 10319ef957cSToby Isaac PetscCall(PetscLogHandlerRegisterAll()); 10419ef957cSToby Isaac PetscCall(PetscFunctionListFind(PetscLogHandlerList, name, &r)); 10519ef957cSToby Isaac PetscCheck(r, PetscObjectComm((PetscObject)handler), PETSC_ERR_ARG_UNKNOWN_TYPE, "Unknown PetscLogHandler type: %s", name); 10619ef957cSToby Isaac 10719ef957cSToby Isaac PetscTryTypeMethod(handler, destroy); 10819ef957cSToby Isaac handler->ops->destroy = NULL; 10919ef957cSToby Isaac 11019ef957cSToby Isaac PetscCall((*r)(handler)); 11119ef957cSToby Isaac PetscCall(PetscObjectChangeTypeName((PetscObject)handler, name)); 11219ef957cSToby Isaac PetscFunctionReturn(PETSC_SUCCESS); 11319ef957cSToby Isaac } 11419ef957cSToby Isaac 11519ef957cSToby Isaac /*@C 11619ef957cSToby Isaac PetscLogHandlerGetType - Gets the `PetscLoagHandlerType` (as a string) from the `PetscLogHandler` object. 11719ef957cSToby Isaac 11819ef957cSToby Isaac Not collective 11919ef957cSToby Isaac 12019ef957cSToby Isaac Input Parameter: 12119ef957cSToby Isaac . handler - the `PetscLogHandler` 12219ef957cSToby Isaac 12319ef957cSToby Isaac Output Parameter: 12419ef957cSToby Isaac . name - The `PetscLogHandlerType` name 12519ef957cSToby Isaac 12619ef957cSToby Isaac Level: developer 12719ef957cSToby Isaac 12819ef957cSToby Isaac .seealso: [](ch_profiling), `PetscLogHandler`, `PetscLogHandlerCreate()`, `PetscLogHandlerRegister()`, `PetscLogHandlerSetType()` 12919ef957cSToby Isaac @*/ 13019ef957cSToby Isaac PetscErrorCode PetscLogHandlerGetType(PetscLogHandler handler, PetscLogHandlerType *name) 13119ef957cSToby Isaac { 13219ef957cSToby Isaac PetscFunctionBegin; 13319ef957cSToby Isaac PetscValidHeaderSpecific(handler, PETSCLOGHANDLER_CLASSID, 1); 13419ef957cSToby Isaac PetscAssertPointer(name, 2); 13519ef957cSToby Isaac PetscCall(PetscLogHandlerRegisterAll()); 13619ef957cSToby Isaac PetscCall(PetscObjectGetType((PetscObject)handler, name)); 13719ef957cSToby Isaac PetscFunctionReturn(PETSC_SUCCESS); 13819ef957cSToby Isaac } 13919ef957cSToby Isaac 14019ef957cSToby Isaac static PetscErrorCode PetscLogHandlerFinalizePackage(void) 14119ef957cSToby Isaac { 14219ef957cSToby Isaac PetscFunctionBegin; 14319ef957cSToby Isaac PetscCall(PetscFunctionListDestroy(&PetscLogHandlerList)); 14419ef957cSToby Isaac PetscLogHandlerRegisterAllCalled = PETSC_FALSE; 14519ef957cSToby Isaac PetscLogHandlerPackageInitialized = PETSC_FALSE; 14619ef957cSToby Isaac PetscFunctionReturn(PETSC_SUCCESS); 14719ef957cSToby Isaac } 14819ef957cSToby Isaac 14919ef957cSToby Isaac PetscErrorCode PetscLogHandlerPackageInitialize(void) 15019ef957cSToby Isaac { 15119ef957cSToby Isaac PetscFunctionBegin; 15219ef957cSToby Isaac if (PetscLogHandlerPackageInitialized) PetscFunctionReturn(PETSC_SUCCESS); 15319ef957cSToby Isaac PetscLogHandlerPackageInitialized = PETSC_TRUE; 15419ef957cSToby Isaac 155f0b74427SPierre Jolivet PetscCall(PetscClassIdRegister("PETSc Log Handler", &PETSCLOGHANDLER_CLASSID)); 15619ef957cSToby Isaac PetscCall(PetscLogHandlerRegisterAll()); 15719ef957cSToby Isaac PetscCall(PetscRegisterFinalize(PetscLogHandlerFinalizePackage)); 15819ef957cSToby Isaac { 15919ef957cSToby Isaac const PetscClassId classids[] = {PETSCLOGHANDLER_CLASSID}; 16019ef957cSToby Isaac 16119ef957cSToby Isaac PetscCall(PetscInfoProcessClass("loghandler", PETSC_STATIC_ARRAY_LENGTH(classids), classids)); 16219ef957cSToby Isaac } 16319ef957cSToby Isaac PetscFunctionReturn(PETSC_SUCCESS); 16419ef957cSToby Isaac } 165