1*0e6b6b59SJacob Faibussowitsch #include <petsc/private/deviceimpl.h> /*I <petscdevice.h> I*/ 2*0e6b6b59SJacob Faibussowitsch 3*0e6b6b59SJacob Faibussowitsch PetscLogEvent CUBLAS_HANDLE_CREATE; 4*0e6b6b59SJacob Faibussowitsch PetscLogEvent CUSOLVER_HANDLE_CREATE; 5*0e6b6b59SJacob Faibussowitsch PetscLogEvent HIPSOLVER_HANDLE_CREATE; 6*0e6b6b59SJacob Faibussowitsch PetscLogEvent HIPBLAS_HANDLE_CREATE; 7*0e6b6b59SJacob Faibussowitsch 8*0e6b6b59SJacob Faibussowitsch PetscLogEvent DCONTEXT_Create; 9*0e6b6b59SJacob Faibussowitsch PetscLogEvent DCONTEXT_Destroy; 10*0e6b6b59SJacob Faibussowitsch PetscLogEvent DCONTEXT_ChangeStream; 11*0e6b6b59SJacob Faibussowitsch PetscLogEvent DCONTEXT_SetDevice; 12*0e6b6b59SJacob Faibussowitsch PetscLogEvent DCONTEXT_SetUp; 13*0e6b6b59SJacob Faibussowitsch PetscLogEvent DCONTEXT_Duplicate; 14*0e6b6b59SJacob Faibussowitsch PetscLogEvent DCONTEXT_QueryIdle; 15*0e6b6b59SJacob Faibussowitsch PetscLogEvent DCONTEXT_WaitForCtx; 16*0e6b6b59SJacob Faibussowitsch PetscLogEvent DCONTEXT_Fork; 17*0e6b6b59SJacob Faibussowitsch PetscLogEvent DCONTEXT_Join; 18*0e6b6b59SJacob Faibussowitsch PetscLogEvent DCONTEXT_Sync; 19*0e6b6b59SJacob Faibussowitsch PetscLogEvent DCONTEXT_Mark; 20*0e6b6b59SJacob Faibussowitsch 21*0e6b6b59SJacob Faibussowitsch // DO NOT MOVE THESE (literally, they must be exactly here)! 22*0e6b6b59SJacob Faibussowitsch // 23*0e6b6b59SJacob Faibussowitsch // pgcc has a _very_ strange bug, where if both of these are defined at the top of this file, 24*0e6b6b59SJacob Faibussowitsch // then building src/sys/objects/device/test/ex2.c results in "undefined reference to 25*0e6b6b59SJacob Faibussowitsch // PETSC_DEVICE_CONTEXT_CLASSID". If you initialize PETSC_DEVICE_CONTEXT_CLASSID it goes 26*0e6b6b59SJacob Faibussowitsch // away. If you move the definition down, it goes away. 27*0e6b6b59SJacob Faibussowitsch PetscClassId PETSC_DEVICE_CLASSID; 28*0e6b6b59SJacob Faibussowitsch PetscClassId PETSC_DEVICE_CONTEXT_CLASSID; 29*0e6b6b59SJacob Faibussowitsch 30*0e6b6b59SJacob Faibussowitsch // clang-format off 31*0e6b6b59SJacob Faibussowitsch const char *const PetscStreamTypes[] = { 32*0e6b6b59SJacob Faibussowitsch "global_blocking", 33*0e6b6b59SJacob Faibussowitsch "default_blocking", 34*0e6b6b59SJacob Faibussowitsch "global_nonblocking", 35*0e6b6b59SJacob Faibussowitsch "max", 36*0e6b6b59SJacob Faibussowitsch "PetscStreamType", 37*0e6b6b59SJacob Faibussowitsch "PETSC_STREAM_", 38*0e6b6b59SJacob Faibussowitsch PETSC_NULLPTR 39*0e6b6b59SJacob Faibussowitsch }; 40*0e6b6b59SJacob Faibussowitsch 41*0e6b6b59SJacob Faibussowitsch const char *const PetscDeviceContextJoinModes[] = { 42*0e6b6b59SJacob Faibussowitsch "destroy", 43*0e6b6b59SJacob Faibussowitsch "sync", 44*0e6b6b59SJacob Faibussowitsch "no_sync", 45*0e6b6b59SJacob Faibussowitsch "PetscDeviceContextJoinMode", 46*0e6b6b59SJacob Faibussowitsch "PETSC_DEVICE_CONTEXT_JOIN_", 47*0e6b6b59SJacob Faibussowitsch PETSC_NULLPTR 48*0e6b6b59SJacob Faibussowitsch }; 49*0e6b6b59SJacob Faibussowitsch 50*0e6b6b59SJacob Faibussowitsch const char *const PetscDeviceTypes[] = { 51*0e6b6b59SJacob Faibussowitsch "host", 52*0e6b6b59SJacob Faibussowitsch "cuda", 53*0e6b6b59SJacob Faibussowitsch "hip", 54*0e6b6b59SJacob Faibussowitsch "sycl", 55*0e6b6b59SJacob Faibussowitsch "max", 56*0e6b6b59SJacob Faibussowitsch "PetscDeviceType", 57*0e6b6b59SJacob Faibussowitsch "PETSC_DEVICE_", 58*0e6b6b59SJacob Faibussowitsch PETSC_NULLPTR 59*0e6b6b59SJacob Faibussowitsch }; 60*0e6b6b59SJacob Faibussowitsch 61*0e6b6b59SJacob Faibussowitsch const char *const PetscDeviceInitTypes[] = { 62*0e6b6b59SJacob Faibussowitsch "none", 63*0e6b6b59SJacob Faibussowitsch "lazy", 64*0e6b6b59SJacob Faibussowitsch "eager", 65*0e6b6b59SJacob Faibussowitsch "PetscDeviceInitType", 66*0e6b6b59SJacob Faibussowitsch "PETSC_DEVICE_INIT_", 67*0e6b6b59SJacob Faibussowitsch PETSC_NULLPTR 68*0e6b6b59SJacob Faibussowitsch }; 69*0e6b6b59SJacob Faibussowitsch 70*0e6b6b59SJacob Faibussowitsch #ifdef __cplusplus 71*0e6b6b59SJacob Faibussowitsch #include <petsc/private/cpp/type_traits.hpp> 72*0e6b6b59SJacob Faibussowitsch 73*0e6b6b59SJacob Faibussowitsch static_assert(Petsc::util::integral_value(PETSC_DEVICE_INIT_NONE) == 0, ""); 74*0e6b6b59SJacob Faibussowitsch static_assert(Petsc::util::integral_value(PETSC_DEVICE_INIT_LAZY) == 1, ""); 75*0e6b6b59SJacob Faibussowitsch static_assert(Petsc::util::integral_value(PETSC_DEVICE_INIT_EAGER) == 2, ""); 76*0e6b6b59SJacob Faibussowitsch 77*0e6b6b59SJacob Faibussowitsch static_assert( 78*0e6b6b59SJacob Faibussowitsch PETSC_STATIC_ARRAY_LENGTH(PetscDeviceInitTypes) == 6, 79*0e6b6b59SJacob Faibussowitsch "Must change CUPMDevice<T>::initialize number of enum values in -device_enable_cupm to match!" 80*0e6b6b59SJacob Faibussowitsch ); 81*0e6b6b59SJacob Faibussowitsch #endif 82*0e6b6b59SJacob Faibussowitsch 83*0e6b6b59SJacob Faibussowitsch const char *const PetscDeviceAttributes[] = { 84*0e6b6b59SJacob Faibussowitsch "shared_mem_per_block", 85*0e6b6b59SJacob Faibussowitsch "max", 86*0e6b6b59SJacob Faibussowitsch "PetscDeviceAttribute", 87*0e6b6b59SJacob Faibussowitsch "PETSC_DEVICE_ATTR_", 88*0e6b6b59SJacob Faibussowitsch PETSC_NULLPTR 89*0e6b6b59SJacob Faibussowitsch }; 90*0e6b6b59SJacob Faibussowitsch // clang-format on 91*0e6b6b59SJacob Faibussowitsch 92*0e6b6b59SJacob Faibussowitsch static PetscBool registered = PETSC_FALSE; 93*0e6b6b59SJacob Faibussowitsch 94*0e6b6b59SJacob Faibussowitsch static PetscErrorCode PetscDeviceRegisterEvent_Private(const char name[], PetscClassId id, PetscLogEvent *event) { 95*0e6b6b59SJacob Faibussowitsch PetscFunctionBegin; 96*0e6b6b59SJacob Faibussowitsch PetscCall(PetscLogEventRegister(name, id, event)); 97*0e6b6b59SJacob Faibussowitsch PetscCall(PetscLogEventSetCollective(*event, PETSC_FALSE)); 98*0e6b6b59SJacob Faibussowitsch PetscFunctionReturn(0); 99*0e6b6b59SJacob Faibussowitsch } 100*0e6b6b59SJacob Faibussowitsch 101*0e6b6b59SJacob Faibussowitsch /*@C 102*0e6b6b59SJacob Faibussowitsch PetscDeviceFinalizePackage - This function cleans up all components of the `PetscDevice` 103*0e6b6b59SJacob Faibussowitsch package. It is called from `PetscFinalize()`. 104*0e6b6b59SJacob Faibussowitsch 105*0e6b6b59SJacob Faibussowitsch Developer Note: 106*0e6b6b59SJacob Faibussowitsch This function is automatically registered to be called during `PetscFinalize()` by 107*0e6b6b59SJacob Faibussowitsch `PetscDeviceInitializePackage()` so there should be no need to call it yourself. 108*0e6b6b59SJacob Faibussowitsch 109*0e6b6b59SJacob Faibussowitsch Level: developer 110*0e6b6b59SJacob Faibussowitsch 111*0e6b6b59SJacob Faibussowitsch .seealso: `PetscFinalize()`, `PetscDeviceInitializePackage()` 112*0e6b6b59SJacob Faibussowitsch @*/ 113*0e6b6b59SJacob Faibussowitsch PetscErrorCode PetscDeviceFinalizePackage(void) { 114*0e6b6b59SJacob Faibussowitsch PetscFunctionBegin; 115*0e6b6b59SJacob Faibussowitsch registered = PETSC_FALSE; 116*0e6b6b59SJacob Faibussowitsch PetscFunctionReturn(0); 117*0e6b6b59SJacob Faibussowitsch } 118*0e6b6b59SJacob Faibussowitsch 119*0e6b6b59SJacob Faibussowitsch /*@C 120*0e6b6b59SJacob Faibussowitsch PetscDeviceInitializePackage - This function initializes everything in the `PetscDevice` 121*0e6b6b59SJacob Faibussowitsch package. It is called on the first call to `PetscDeviceContextCreate()` or 122*0e6b6b59SJacob Faibussowitsch `PetscDeviceCreate()` when using shared or static libraries. 123*0e6b6b59SJacob Faibussowitsch 124*0e6b6b59SJacob Faibussowitsch Level: developer 125*0e6b6b59SJacob Faibussowitsch 126*0e6b6b59SJacob Faibussowitsch .seealso: `PetscInitialize()`, `PetscDeviceFinalizePackage()`, `PetscDeviceContextCreate()`, 127*0e6b6b59SJacob Faibussowitsch `PetscDeviceCreate()` 128*0e6b6b59SJacob Faibussowitsch @*/ 129*0e6b6b59SJacob Faibussowitsch PetscErrorCode PetscDeviceInitializePackage(void) { 130*0e6b6b59SJacob Faibussowitsch PetscFunctionBegin; 131*0e6b6b59SJacob Faibussowitsch PetscCheck(PetscDeviceConfiguredFor_Internal(PETSC_DEVICE_DEFAULT()), PETSC_COMM_SELF, PETSC_ERR_SUP, "PETSc is not configured with device support (PETSC_DEVICE_DEFAULT = '%s')", PetscDeviceTypes[PETSC_DEVICE_DEFAULT()]); 132*0e6b6b59SJacob Faibussowitsch if (PetscLikely(registered)) PetscFunctionReturn(0); 133*0e6b6b59SJacob Faibussowitsch registered = PETSC_TRUE; 134*0e6b6b59SJacob Faibussowitsch PetscCall(PetscRegisterFinalize(PetscDeviceFinalizePackage)); 135*0e6b6b59SJacob Faibussowitsch // class registration 136*0e6b6b59SJacob Faibussowitsch PetscCall(PetscClassIdRegister("PetscDevice", &PETSC_DEVICE_CLASSID)); 137*0e6b6b59SJacob Faibussowitsch PetscCall(PetscClassIdRegister("PetscDeviceContext", &PETSC_DEVICE_CONTEXT_CLASSID)); 138*0e6b6b59SJacob Faibussowitsch // events 139*0e6b6b59SJacob Faibussowitsch if (PetscDefined(HAVE_CUDA)) { 140*0e6b6b59SJacob Faibussowitsch PetscCall(PetscDeviceRegisterEvent_Private("cuBLAS Init", PETSC_DEVICE_CONTEXT_CLASSID, &CUBLAS_HANDLE_CREATE)); 141*0e6b6b59SJacob Faibussowitsch PetscCall(PetscDeviceRegisterEvent_Private("cuSolver Init", PETSC_DEVICE_CONTEXT_CLASSID, &CUSOLVER_HANDLE_CREATE)); 142*0e6b6b59SJacob Faibussowitsch } 143*0e6b6b59SJacob Faibussowitsch if (PetscDefined(HAVE_HIP)) { 144*0e6b6b59SJacob Faibussowitsch PetscCall(PetscDeviceRegisterEvent_Private("hipBLAS Init", PETSC_DEVICE_CONTEXT_CLASSID, &HIPBLAS_HANDLE_CREATE)); 145*0e6b6b59SJacob Faibussowitsch PetscCall(PetscDeviceRegisterEvent_Private("hipSolver Init", PETSC_DEVICE_CONTEXT_CLASSID, &HIPSOLVER_HANDLE_CREATE)); 146*0e6b6b59SJacob Faibussowitsch } 147*0e6b6b59SJacob Faibussowitsch PetscCall(PetscDeviceRegisterEvent_Private("DCtxCreate", PETSC_DEVICE_CONTEXT_CLASSID, &DCONTEXT_Create)); 148*0e6b6b59SJacob Faibussowitsch PetscCall(PetscDeviceRegisterEvent_Private("DCtxDestroy", PETSC_DEVICE_CONTEXT_CLASSID, &DCONTEXT_Destroy)); 149*0e6b6b59SJacob Faibussowitsch PetscCall(PetscDeviceRegisterEvent_Private("DCtxChangeStream", PETSC_DEVICE_CONTEXT_CLASSID, &DCONTEXT_ChangeStream)); 150*0e6b6b59SJacob Faibussowitsch PetscCall(PetscDeviceRegisterEvent_Private("DCtxSetUp", PETSC_DEVICE_CONTEXT_CLASSID, &DCONTEXT_SetUp)); 151*0e6b6b59SJacob Faibussowitsch PetscCall(PetscDeviceRegisterEvent_Private("DCtxSetDevice", PETSC_DEVICE_CONTEXT_CLASSID, &DCONTEXT_SetDevice)); 152*0e6b6b59SJacob Faibussowitsch PetscCall(PetscDeviceRegisterEvent_Private("DCtxDuplicate", PETSC_DEVICE_CONTEXT_CLASSID, &DCONTEXT_Duplicate)); 153*0e6b6b59SJacob Faibussowitsch PetscCall(PetscDeviceRegisterEvent_Private("DCtxQueryIdle", PETSC_DEVICE_CONTEXT_CLASSID, &DCONTEXT_QueryIdle)); 154*0e6b6b59SJacob Faibussowitsch PetscCall(PetscDeviceRegisterEvent_Private("DCtxWaitForCtx", PETSC_DEVICE_CONTEXT_CLASSID, &DCONTEXT_WaitForCtx)); 155*0e6b6b59SJacob Faibussowitsch PetscCall(PetscDeviceRegisterEvent_Private("DCtxFork", PETSC_DEVICE_CONTEXT_CLASSID, &DCONTEXT_Fork)); 156*0e6b6b59SJacob Faibussowitsch PetscCall(PetscDeviceRegisterEvent_Private("DCtxJoin", PETSC_DEVICE_CONTEXT_CLASSID, &DCONTEXT_Join)); 157*0e6b6b59SJacob Faibussowitsch PetscCall(PetscDeviceRegisterEvent_Private("DCtxSync", PETSC_DEVICE_CONTEXT_CLASSID, &DCONTEXT_Sync)); 158*0e6b6b59SJacob Faibussowitsch PetscCall(PetscDeviceRegisterEvent_Private("DCtxMark", PETSC_DEVICE_CONTEXT_CLASSID, &DCONTEXT_Mark)); 159*0e6b6b59SJacob Faibussowitsch { 160*0e6b6b59SJacob Faibussowitsch const PetscClassId classids[] = {PETSC_DEVICE_CONTEXT_CLASSID, PETSC_DEVICE_CLASSID}; 161*0e6b6b59SJacob Faibussowitsch 162*0e6b6b59SJacob Faibussowitsch PetscCall(PetscInfoProcessClass("device", PETSC_STATIC_ARRAY_LENGTH(classids), classids)); 163*0e6b6b59SJacob Faibussowitsch } 164*0e6b6b59SJacob Faibussowitsch PetscFunctionReturn(0); 165*0e6b6b59SJacob Faibussowitsch } 166