1030f984aSJacob Faibussowitsch #if !defined(PETSCDEVICETYPES_H) 2030f984aSJacob Faibussowitsch #define PETSCDEVICETYPES_H 3030f984aSJacob Faibussowitsch 4*fe0d65a2SJacob Faibussowitsch /* for PETSC_HAVE_CUDA/HIP/KOKKOS etc */ 5*fe0d65a2SJacob Faibussowitsch #include <petscsys.h> /*I petscsys.h I*/ 6030f984aSJacob Faibussowitsch 7030f984aSJacob Faibussowitsch /*E 8030f984aSJacob Faibussowitsch PetscMemType - Memory type of a pointer 9030f984aSJacob Faibussowitsch 10030f984aSJacob Faibussowitsch Developer Note: 11030f984aSJacob Faibussowitsch Encoding of the bitmask in binary: xxxxyyyz 12*fe0d65a2SJacob Faibussowitsch 13*fe0d65a2SJacob Faibussowitsch $ z = 0 - Host memory 14*fe0d65a2SJacob Faibussowitsch $ z = 1 - Device memory 15*fe0d65a2SJacob Faibussowitsch $ yyy = 000 - CUDA-related memory 16*fe0d65a2SJacob Faibussowitsch $ yyy = 001 - HIP-related memory 17*fe0d65a2SJacob Faibussowitsch $ xxxxyyy1 = 0000,0001 - CUDA memory 18*fe0d65a2SJacob Faibussowitsch $ xxxxyyy1 = 0001,0001 - CUDA NVSHMEM memory 19*fe0d65a2SJacob Faibussowitsch $ xxxxyyy1 = 0000,0011 - HIP memory 20030f984aSJacob Faibussowitsch 21030f984aSJacob Faibussowitsch Other types of memory, e.g., CUDA managed memory, can be added when needed. 22030f984aSJacob Faibussowitsch 23*fe0d65a2SJacob Faibussowitsch Level: beginner 24*fe0d65a2SJacob Faibussowitsch 25030f984aSJacob Faibussowitsch .seealso: VecGetArrayAndMemType(), PetscSFBcastWithMemTypeBegin(), PetscSFReduceWithMemTypeBegin() 26030f984aSJacob Faibussowitsch E*/ 27*fe0d65a2SJacob Faibussowitsch typedef enum { 28*fe0d65a2SJacob Faibussowitsch PETSC_MEMTYPE_HOST = 0, 29*fe0d65a2SJacob Faibussowitsch PETSC_MEMTYPE_DEVICE = 0x01, 30*fe0d65a2SJacob Faibussowitsch PETSC_MEMTYPE_CUDA = 0x01, 31*fe0d65a2SJacob Faibussowitsch PETSC_MEMTYPE_NVSHMEM = 0x11, 32*fe0d65a2SJacob Faibussowitsch PETSC_MEMTYPE_HIP = 0x03 33*fe0d65a2SJacob Faibussowitsch } PetscMemType; 34030f984aSJacob Faibussowitsch 35030f984aSJacob Faibussowitsch #define PetscMemTypeHost(m) (((m) & 0x1) == PETSC_MEMTYPE_HOST) 36030f984aSJacob Faibussowitsch #define PetscMemTypeDevice(m) (((m) & 0x1) == PETSC_MEMTYPE_DEVICE) 37030f984aSJacob Faibussowitsch #define PetscMemTypeCUDA(m) (((m) & 0xF) == PETSC_MEMTYPE_CUDA) 38030f984aSJacob Faibussowitsch #define PetscMemTypeHIP(m) (((m) & 0xF) == PETSC_MEMTYPE_HIP) 39030f984aSJacob Faibussowitsch #define PetscMemTypeNVSHMEM(m) ((m) == PETSC_MEMTYPE_NVSHMEM) 40030f984aSJacob Faibussowitsch 41030f984aSJacob Faibussowitsch /*E 42030f984aSJacob Faibussowitsch PetscOffloadMask - indicates which memory (CPU, GPU, or none) contains valid data 43030f984aSJacob Faibussowitsch 44*fe0d65a2SJacob Faibussowitsch $ PETSC_OFFLOAD_UNALLOCATED - no memory contains valid matrix entries; NEVER used for vectors 45*fe0d65a2SJacob Faibussowitsch $ PETSC_OFFLOAD_GPU - GPU has valid vector/matrix entries 46*fe0d65a2SJacob Faibussowitsch $ PETSC_OFFLOAD_CPU - CPU has valid vector/matrix entries 47*fe0d65a2SJacob Faibussowitsch $ PETSC_OFFLOAD_BOTH - Both GPU and CPU have valid vector/matrix entries and they match 48*fe0d65a2SJacob Faibussowitsch $ PETSC_OFFLOAD_VECKOKKOS - Reserved for Vec_Kokkos. The offload is managed by Kokkos, thus this flag is not used in Vec_Kokkos. 49030f984aSJacob Faibussowitsch 50030f984aSJacob Faibussowitsch Level: developer 51030f984aSJacob Faibussowitsch E*/ 52*fe0d65a2SJacob Faibussowitsch typedef enum { 53*fe0d65a2SJacob Faibussowitsch PETSC_OFFLOAD_UNALLOCATED = 0x0, 54*fe0d65a2SJacob Faibussowitsch PETSC_OFFLOAD_CPU = 0x1, 55*fe0d65a2SJacob Faibussowitsch PETSC_OFFLOAD_GPU = 0x2, 56*fe0d65a2SJacob Faibussowitsch PETSC_OFFLOAD_BOTH = 0x3, 57*fe0d65a2SJacob Faibussowitsch PETSC_OFFLOAD_VECKOKKOS = 0x100 58*fe0d65a2SJacob Faibussowitsch } PetscOffloadMask; 59030f984aSJacob Faibussowitsch 60030f984aSJacob Faibussowitsch /*E 61030f984aSJacob Faibussowitsch PetscDeviceKind - Kind of accelerator device backend 62030f984aSJacob Faibussowitsch 63030f984aSJacob Faibussowitsch $ PETSC_DEVICE_INVALID - Invalid type, do not use 64030f984aSJacob Faibussowitsch $ PETSC_DEVICE_CUDA - CUDA enabled GPU 65030f984aSJacob Faibussowitsch $ PETSC_DEVICE_HIP - ROCM/HIP enabled GPU 66030f984aSJacob Faibussowitsch $ PETSC_DEVICE_DEFAULT - Automatically select backend based on availability 67030f984aSJacob Faibussowitsch $ PETSC_DEVICE_MAX - Always 1 greater than the largest valid PetscDeviceKInd, invalid type, do not use 68030f984aSJacob Faibussowitsch 69030f984aSJacob Faibussowitsch Notes: 70030f984aSJacob Faibussowitsch PETSC_DEVICE_DEFAULT is selected in the following order: PETSC_DEVICE_HIP, PETSC_DEVICE_CUDA, PETSC_DEVICE_INVALID. 71030f984aSJacob Faibussowitsch 72030f984aSJacob Faibussowitsch Level: beginner 73030f984aSJacob Faibussowitsch 745181c4f9SJacob Faibussowitsch .seealso: PetscDevice, PetscDeviceCreate() 75030f984aSJacob Faibussowitsch E*/ 76030f984aSJacob Faibussowitsch typedef enum { 77030f984aSJacob Faibussowitsch PETSC_DEVICE_INVALID = 0, 78030f984aSJacob Faibussowitsch PETSC_DEVICE_CUDA = 1, 79030f984aSJacob Faibussowitsch PETSC_DEVICE_HIP = 2, 80030f984aSJacob Faibussowitsch PETSC_DEVICE_MAX = 3 81030f984aSJacob Faibussowitsch } PetscDeviceKind; 82030f984aSJacob Faibussowitsch PETSC_EXTERN const char *const PetscDeviceKinds[]; 835181c4f9SJacob Faibussowitsch #if PetscDefined(HAVE_HIP) 845181c4f9SJacob Faibussowitsch # define PETSC_DEVICE_DEFAULT PETSC_DEVICE_HIP 855181c4f9SJacob Faibussowitsch #elif PetscDefined(HAVE_CUDA) 865181c4f9SJacob Faibussowitsch # define PETSC_DEVICE_DEFAULT PETSC_DEVICE_CUDA 875181c4f9SJacob Faibussowitsch #else 885181c4f9SJacob Faibussowitsch # define PETSC_DEVICE_DEFAULT PETSC_DEVICE_INVALID 895181c4f9SJacob Faibussowitsch #endif 90030f984aSJacob Faibussowitsch 91030f984aSJacob Faibussowitsch /*S 92030f984aSJacob Faibussowitsch PetscDevice - Handle to an accelerator "device" (usually a GPU) 93030f984aSJacob Faibussowitsch 94030f984aSJacob Faibussowitsch Notes: 95030f984aSJacob Faibussowitsch This object is used to house configuration and state of a device, but does not offer any ability to interact with or 96030f984aSJacob Faibussowitsch drive device computation. This functionality is facilitated instead by the PetscDeviceContext object. 97030f984aSJacob Faibussowitsch 98030f984aSJacob Faibussowitsch Level: beginner 99030f984aSJacob Faibussowitsch 1005181c4f9SJacob Faibussowitsch .seealso: PetscDeviceKind, PetscDeviceCreate(), PetscDeviceConfigure(), PetscDeviceDestroy(), PetscDeviceContext, PetscDeviceContextSetDevice(), PetscDeviceContextGetDevice() 101030f984aSJacob Faibussowitsch S*/ 102030f984aSJacob Faibussowitsch typedef struct _n_PetscDevice *PetscDevice; 103030f984aSJacob Faibussowitsch 104030f984aSJacob Faibussowitsch /*E 105030f984aSJacob Faibussowitsch PetscStreamType - Stream blocking mode, indicates how a stream implementation will interact with the default "NULL" 106030f984aSJacob Faibussowitsch stream, which is usually blocking. 107030f984aSJacob Faibussowitsch 108030f984aSJacob Faibussowitsch $ PETSC_STREAM_GLOBAL_BLOCKING - Alias for NULL stream. Any stream of this type will block the host for all other streams to finish work before starting its operations. 109030f984aSJacob Faibussowitsch $ PETSC_STREAM_DEFAULT_BLOCKING - Stream will act independent of other streams, but will still be blocked by actions on the NULL stream. 110030f984aSJacob Faibussowitsch $ PETSC_STREAM_GLOBAL_NONBLOCKING - Stream is truly asynchronous, and is blocked by nothing, not even the NULL stream. 111030f984aSJacob Faibussowitsch $ PETSC_STREAM_MAX - Always 1 greater than the largest PetscStreamType, do not use 112030f984aSJacob Faibussowitsch 113030f984aSJacob Faibussowitsch Level: intermediate 114030f984aSJacob Faibussowitsch 115030f984aSJacob Faibussowitsch .seealso: PetscDeviceContextSetStreamType(), PetscDeviceContextGetStreamType() 116030f984aSJacob Faibussowitsch E*/ 117030f984aSJacob Faibussowitsch typedef enum { 118030f984aSJacob Faibussowitsch PETSC_STREAM_GLOBAL_BLOCKING = 0, 119030f984aSJacob Faibussowitsch PETSC_STREAM_DEFAULT_BLOCKING = 1, 120030f984aSJacob Faibussowitsch PETSC_STREAM_GLOBAL_NONBLOCKING = 2, 121030f984aSJacob Faibussowitsch PETSC_STREAM_MAX = 3 122030f984aSJacob Faibussowitsch } PetscStreamType; 123030f984aSJacob Faibussowitsch PETSC_EXTERN const char *const PetscStreamTypes[]; 124030f984aSJacob Faibussowitsch 125030f984aSJacob Faibussowitsch /*E 126030f984aSJacob Faibussowitsch PetscDeviceContextJoinMode - Describes the type of join operation to perform in PetscDeviceContextJoin() 127030f984aSJacob Faibussowitsch 128030f984aSJacob Faibussowitsch $ PETSC_DEVICE_CONTEXT_DESTROY - Destroy all incoming sub-contexts after join. 129030f984aSJacob Faibussowitsch $ PETSC_CONTEXT_JOIN_SYNC - Synchronize incoming sub-contexts after join. 130030f984aSJacob Faibussowitsch $ PETSC_CONTEXT_JOIN_NO_SYNC - Do not synchronize incoming sub-contexts after join. 131030f984aSJacob Faibussowitsch 132030f984aSJacob Faibussowitsch Level: beginner 133030f984aSJacob Faibussowitsch 134030f984aSJacob Faibussowitsch .seealso: PetscDeviceContextFork(), PetscDeviceContextJoin() 135030f984aSJacob Faibussowitsch E*/ 136030f984aSJacob Faibussowitsch typedef enum { 137030f984aSJacob Faibussowitsch PETSC_DEVICE_CONTEXT_JOIN_DESTROY, 138030f984aSJacob Faibussowitsch PETSC_DEVICE_CONTEXT_JOIN_SYNC, 139030f984aSJacob Faibussowitsch PETSC_DEVICE_CONTEXT_JOIN_NO_SYNC 140030f984aSJacob Faibussowitsch } PetscDeviceContextJoinMode; 141030f984aSJacob Faibussowitsch PETSC_EXTERN const char *const PetscDeviceContextJoinModes[]; 142030f984aSJacob Faibussowitsch 143030f984aSJacob Faibussowitsch /*S 144030f984aSJacob Faibussowitsch PetscDeviceContext - Container to manage stream dependencies and the various solver handles for asynchronous device compute. 145030f984aSJacob Faibussowitsch 146030f984aSJacob Faibussowitsch Level: beginner 147030f984aSJacob Faibussowitsch 148030f984aSJacob Faibussowitsch .seealso: PetscDevice, PetscDeviceContextCreate(), PetscDeviceContextSetDevice(), PetscDeviceContextDestroy(), 149030f984aSJacob Faibussowitsch PetscDeviceContextFork(), PetscDeviceContextJoin() 150030f984aSJacob Faibussowitsch S*/ 151030f984aSJacob Faibussowitsch typedef struct _n_PetscDeviceContext *PetscDeviceContext; 152030f984aSJacob Faibussowitsch #endif /* PETSCDEVICETYPES_H */ 153