10e6b6b59SJacob Faibussowitsch #include <petsc/private/deviceimpl.h> /*I <petscdevice.h> I*/ 20e6b6b59SJacob Faibussowitsch 30e6b6b59SJacob Faibussowitsch PetscLogEvent CUBLAS_HANDLE_CREATE; 40e6b6b59SJacob Faibussowitsch PetscLogEvent CUSOLVER_HANDLE_CREATE; 50e6b6b59SJacob Faibussowitsch PetscLogEvent HIPSOLVER_HANDLE_CREATE; 60e6b6b59SJacob Faibussowitsch PetscLogEvent HIPBLAS_HANDLE_CREATE; 70e6b6b59SJacob Faibussowitsch 80e6b6b59SJacob Faibussowitsch PetscLogEvent DCONTEXT_Create; 90e6b6b59SJacob Faibussowitsch PetscLogEvent DCONTEXT_Destroy; 100e6b6b59SJacob Faibussowitsch PetscLogEvent DCONTEXT_ChangeStream; 110e6b6b59SJacob Faibussowitsch PetscLogEvent DCONTEXT_SetDevice; 120e6b6b59SJacob Faibussowitsch PetscLogEvent DCONTEXT_SetUp; 130e6b6b59SJacob Faibussowitsch PetscLogEvent DCONTEXT_Duplicate; 140e6b6b59SJacob Faibussowitsch PetscLogEvent DCONTEXT_QueryIdle; 150e6b6b59SJacob Faibussowitsch PetscLogEvent DCONTEXT_WaitForCtx; 160e6b6b59SJacob Faibussowitsch PetscLogEvent DCONTEXT_Fork; 170e6b6b59SJacob Faibussowitsch PetscLogEvent DCONTEXT_Join; 180e6b6b59SJacob Faibussowitsch PetscLogEvent DCONTEXT_Sync; 190e6b6b59SJacob Faibussowitsch PetscLogEvent DCONTEXT_Mark; 200e6b6b59SJacob Faibussowitsch 210e6b6b59SJacob Faibussowitsch // DO NOT MOVE THESE (literally, they must be exactly here)! 220e6b6b59SJacob Faibussowitsch // 230e6b6b59SJacob Faibussowitsch // pgcc has a _very_ strange bug, where if both of these are defined at the top of this file, 240e6b6b59SJacob Faibussowitsch // then building src/sys/objects/device/test/ex2.c results in "undefined reference to 250e6b6b59SJacob Faibussowitsch // PETSC_DEVICE_CONTEXT_CLASSID". If you initialize PETSC_DEVICE_CONTEXT_CLASSID it goes 260e6b6b59SJacob Faibussowitsch // away. If you move the definition down, it goes away. 270e6b6b59SJacob Faibussowitsch PetscClassId PETSC_DEVICE_CLASSID; 280e6b6b59SJacob Faibussowitsch PetscClassId PETSC_DEVICE_CONTEXT_CLASSID; 290e6b6b59SJacob Faibussowitsch 300e6b6b59SJacob Faibussowitsch // clang-format off 310e6b6b59SJacob Faibussowitsch const char *const PetscStreamTypes[] = { 320e6b6b59SJacob Faibussowitsch "global_blocking", 330e6b6b59SJacob Faibussowitsch "default_blocking", 340e6b6b59SJacob Faibussowitsch "global_nonblocking", 350e6b6b59SJacob Faibussowitsch "max", 360e6b6b59SJacob Faibussowitsch "PetscStreamType", 370e6b6b59SJacob Faibussowitsch "PETSC_STREAM_", 380e6b6b59SJacob Faibussowitsch PETSC_NULLPTR 390e6b6b59SJacob Faibussowitsch }; 400e6b6b59SJacob Faibussowitsch 410e6b6b59SJacob Faibussowitsch const char *const PetscDeviceContextJoinModes[] = { 420e6b6b59SJacob Faibussowitsch "destroy", 430e6b6b59SJacob Faibussowitsch "sync", 440e6b6b59SJacob Faibussowitsch "no_sync", 450e6b6b59SJacob Faibussowitsch "PetscDeviceContextJoinMode", 460e6b6b59SJacob Faibussowitsch "PETSC_DEVICE_CONTEXT_JOIN_", 470e6b6b59SJacob Faibussowitsch PETSC_NULLPTR 480e6b6b59SJacob Faibussowitsch }; 490e6b6b59SJacob Faibussowitsch 500e6b6b59SJacob Faibussowitsch const char *const PetscDeviceTypes[] = { 510e6b6b59SJacob Faibussowitsch "host", 520e6b6b59SJacob Faibussowitsch "cuda", 530e6b6b59SJacob Faibussowitsch "hip", 540e6b6b59SJacob Faibussowitsch "sycl", 550e6b6b59SJacob Faibussowitsch "max", 560e6b6b59SJacob Faibussowitsch "PetscDeviceType", 570e6b6b59SJacob Faibussowitsch "PETSC_DEVICE_", 580e6b6b59SJacob Faibussowitsch PETSC_NULLPTR 590e6b6b59SJacob Faibussowitsch }; 600e6b6b59SJacob Faibussowitsch 610e6b6b59SJacob Faibussowitsch const char *const PetscDeviceInitTypes[] = { 620e6b6b59SJacob Faibussowitsch "none", 630e6b6b59SJacob Faibussowitsch "lazy", 640e6b6b59SJacob Faibussowitsch "eager", 650e6b6b59SJacob Faibussowitsch "PetscDeviceInitType", 660e6b6b59SJacob Faibussowitsch "PETSC_DEVICE_INIT_", 670e6b6b59SJacob Faibussowitsch PETSC_NULLPTR 680e6b6b59SJacob Faibussowitsch }; 690e6b6b59SJacob Faibussowitsch 700e6b6b59SJacob Faibussowitsch #ifdef __cplusplus 710e6b6b59SJacob Faibussowitsch #include <petsc/private/cpp/type_traits.hpp> 720e6b6b59SJacob Faibussowitsch 73*bd2fcf0cSJacob Faibussowitsch static_assert(Petsc::util::to_underlying(PETSC_DEVICE_INIT_NONE) == 0, ""); 74*bd2fcf0cSJacob Faibussowitsch static_assert(Petsc::util::to_underlying(PETSC_DEVICE_INIT_LAZY) == 1, ""); 75*bd2fcf0cSJacob Faibussowitsch static_assert(Petsc::util::to_underlying(PETSC_DEVICE_INIT_EAGER) == 2, ""); 760e6b6b59SJacob Faibussowitsch 770e6b6b59SJacob Faibussowitsch static_assert( 780e6b6b59SJacob Faibussowitsch PETSC_STATIC_ARRAY_LENGTH(PetscDeviceInitTypes) == 6, 790e6b6b59SJacob Faibussowitsch "Must change CUPMDevice<T>::initialize number of enum values in -device_enable_cupm to match!" 800e6b6b59SJacob Faibussowitsch ); 810e6b6b59SJacob Faibussowitsch #endif 820e6b6b59SJacob Faibussowitsch 830e6b6b59SJacob Faibussowitsch const char *const PetscDeviceAttributes[] = { 840e6b6b59SJacob Faibussowitsch "shared_mem_per_block", 850e6b6b59SJacob Faibussowitsch "max", 860e6b6b59SJacob Faibussowitsch "PetscDeviceAttribute", 870e6b6b59SJacob Faibussowitsch "PETSC_DEVICE_ATTR_", 880e6b6b59SJacob Faibussowitsch PETSC_NULLPTR 890e6b6b59SJacob Faibussowitsch }; 900e6b6b59SJacob Faibussowitsch // clang-format on 910e6b6b59SJacob Faibussowitsch 920e6b6b59SJacob Faibussowitsch static PetscBool registered = PETSC_FALSE; 930e6b6b59SJacob Faibussowitsch 94d71ae5a4SJacob Faibussowitsch static PetscErrorCode PetscDeviceRegisterEvent_Private(const char name[], PetscClassId id, PetscLogEvent *event) 95d71ae5a4SJacob Faibussowitsch { 960e6b6b59SJacob Faibussowitsch PetscFunctionBegin; 970e6b6b59SJacob Faibussowitsch PetscCall(PetscLogEventRegister(name, id, event)); 980e6b6b59SJacob Faibussowitsch PetscCall(PetscLogEventSetCollective(*event, PETSC_FALSE)); 990e6b6b59SJacob Faibussowitsch PetscFunctionReturn(0); 1000e6b6b59SJacob Faibussowitsch } 1010e6b6b59SJacob Faibussowitsch 1020e6b6b59SJacob Faibussowitsch /*@C 1030e6b6b59SJacob Faibussowitsch PetscDeviceFinalizePackage - This function cleans up all components of the `PetscDevice` 1040e6b6b59SJacob Faibussowitsch package. It is called from `PetscFinalize()`. 1050e6b6b59SJacob Faibussowitsch 1060e6b6b59SJacob Faibussowitsch Developer Note: 1070e6b6b59SJacob Faibussowitsch This function is automatically registered to be called during `PetscFinalize()` by 1080e6b6b59SJacob Faibussowitsch `PetscDeviceInitializePackage()` so there should be no need to call it yourself. 1090e6b6b59SJacob Faibussowitsch 1100e6b6b59SJacob Faibussowitsch Level: developer 1110e6b6b59SJacob Faibussowitsch 1120e6b6b59SJacob Faibussowitsch .seealso: `PetscFinalize()`, `PetscDeviceInitializePackage()` 1130e6b6b59SJacob Faibussowitsch @*/ 114d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscDeviceFinalizePackage(void) 115d71ae5a4SJacob Faibussowitsch { 1160e6b6b59SJacob Faibussowitsch PetscFunctionBegin; 1170e6b6b59SJacob Faibussowitsch registered = PETSC_FALSE; 1180e6b6b59SJacob Faibussowitsch PetscFunctionReturn(0); 1190e6b6b59SJacob Faibussowitsch } 1200e6b6b59SJacob Faibussowitsch 1210e6b6b59SJacob Faibussowitsch /*@C 1220e6b6b59SJacob Faibussowitsch PetscDeviceInitializePackage - This function initializes everything in the `PetscDevice` 1230e6b6b59SJacob Faibussowitsch package. It is called on the first call to `PetscDeviceContextCreate()` or 1240e6b6b59SJacob Faibussowitsch `PetscDeviceCreate()` when using shared or static libraries. 1250e6b6b59SJacob Faibussowitsch 1260e6b6b59SJacob Faibussowitsch Level: developer 1270e6b6b59SJacob Faibussowitsch 1280e6b6b59SJacob Faibussowitsch .seealso: `PetscInitialize()`, `PetscDeviceFinalizePackage()`, `PetscDeviceContextCreate()`, 1290e6b6b59SJacob Faibussowitsch `PetscDeviceCreate()` 1300e6b6b59SJacob Faibussowitsch @*/ 131d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscDeviceInitializePackage(void) 132d71ae5a4SJacob Faibussowitsch { 1330e6b6b59SJacob Faibussowitsch PetscFunctionBegin; 1340e6b6b59SJacob 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()]); 1350e6b6b59SJacob Faibussowitsch if (PetscLikely(registered)) PetscFunctionReturn(0); 1360e6b6b59SJacob Faibussowitsch registered = PETSC_TRUE; 1370e6b6b59SJacob Faibussowitsch PetscCall(PetscRegisterFinalize(PetscDeviceFinalizePackage)); 1380e6b6b59SJacob Faibussowitsch // class registration 1390e6b6b59SJacob Faibussowitsch PetscCall(PetscClassIdRegister("PetscDevice", &PETSC_DEVICE_CLASSID)); 1400e6b6b59SJacob Faibussowitsch PetscCall(PetscClassIdRegister("PetscDeviceContext", &PETSC_DEVICE_CONTEXT_CLASSID)); 1410e6b6b59SJacob Faibussowitsch // events 1420e6b6b59SJacob Faibussowitsch if (PetscDefined(HAVE_CUDA)) { 1430e6b6b59SJacob Faibussowitsch PetscCall(PetscDeviceRegisterEvent_Private("cuBLAS Init", PETSC_DEVICE_CONTEXT_CLASSID, &CUBLAS_HANDLE_CREATE)); 1440e6b6b59SJacob Faibussowitsch PetscCall(PetscDeviceRegisterEvent_Private("cuSolver Init", PETSC_DEVICE_CONTEXT_CLASSID, &CUSOLVER_HANDLE_CREATE)); 1450e6b6b59SJacob Faibussowitsch } 1460e6b6b59SJacob Faibussowitsch if (PetscDefined(HAVE_HIP)) { 1470e6b6b59SJacob Faibussowitsch PetscCall(PetscDeviceRegisterEvent_Private("hipBLAS Init", PETSC_DEVICE_CONTEXT_CLASSID, &HIPBLAS_HANDLE_CREATE)); 1480e6b6b59SJacob Faibussowitsch PetscCall(PetscDeviceRegisterEvent_Private("hipSolver Init", PETSC_DEVICE_CONTEXT_CLASSID, &HIPSOLVER_HANDLE_CREATE)); 1490e6b6b59SJacob Faibussowitsch } 1500e6b6b59SJacob Faibussowitsch PetscCall(PetscDeviceRegisterEvent_Private("DCtxCreate", PETSC_DEVICE_CONTEXT_CLASSID, &DCONTEXT_Create)); 1510e6b6b59SJacob Faibussowitsch PetscCall(PetscDeviceRegisterEvent_Private("DCtxDestroy", PETSC_DEVICE_CONTEXT_CLASSID, &DCONTEXT_Destroy)); 1520e6b6b59SJacob Faibussowitsch PetscCall(PetscDeviceRegisterEvent_Private("DCtxChangeStream", PETSC_DEVICE_CONTEXT_CLASSID, &DCONTEXT_ChangeStream)); 1530e6b6b59SJacob Faibussowitsch PetscCall(PetscDeviceRegisterEvent_Private("DCtxSetUp", PETSC_DEVICE_CONTEXT_CLASSID, &DCONTEXT_SetUp)); 1540e6b6b59SJacob Faibussowitsch PetscCall(PetscDeviceRegisterEvent_Private("DCtxSetDevice", PETSC_DEVICE_CONTEXT_CLASSID, &DCONTEXT_SetDevice)); 1550e6b6b59SJacob Faibussowitsch PetscCall(PetscDeviceRegisterEvent_Private("DCtxDuplicate", PETSC_DEVICE_CONTEXT_CLASSID, &DCONTEXT_Duplicate)); 1560e6b6b59SJacob Faibussowitsch PetscCall(PetscDeviceRegisterEvent_Private("DCtxQueryIdle", PETSC_DEVICE_CONTEXT_CLASSID, &DCONTEXT_QueryIdle)); 1570e6b6b59SJacob Faibussowitsch PetscCall(PetscDeviceRegisterEvent_Private("DCtxWaitForCtx", PETSC_DEVICE_CONTEXT_CLASSID, &DCONTEXT_WaitForCtx)); 1580e6b6b59SJacob Faibussowitsch PetscCall(PetscDeviceRegisterEvent_Private("DCtxFork", PETSC_DEVICE_CONTEXT_CLASSID, &DCONTEXT_Fork)); 1590e6b6b59SJacob Faibussowitsch PetscCall(PetscDeviceRegisterEvent_Private("DCtxJoin", PETSC_DEVICE_CONTEXT_CLASSID, &DCONTEXT_Join)); 1600e6b6b59SJacob Faibussowitsch PetscCall(PetscDeviceRegisterEvent_Private("DCtxSync", PETSC_DEVICE_CONTEXT_CLASSID, &DCONTEXT_Sync)); 1610e6b6b59SJacob Faibussowitsch PetscCall(PetscDeviceRegisterEvent_Private("DCtxMark", PETSC_DEVICE_CONTEXT_CLASSID, &DCONTEXT_Mark)); 1620e6b6b59SJacob Faibussowitsch { 1630e6b6b59SJacob Faibussowitsch const PetscClassId classids[] = {PETSC_DEVICE_CONTEXT_CLASSID, PETSC_DEVICE_CLASSID}; 1640e6b6b59SJacob Faibussowitsch 1650e6b6b59SJacob Faibussowitsch PetscCall(PetscInfoProcessClass("device", PETSC_STATIC_ARRAY_LENGTH(classids), classids)); 1660e6b6b59SJacob Faibussowitsch } 1670e6b6b59SJacob Faibussowitsch PetscFunctionReturn(0); 1680e6b6b59SJacob Faibussowitsch } 169