1030f984aSJacob Faibussowitsch #if !defined(PETSCDEVICETYPES_H) 2030f984aSJacob Faibussowitsch #define PETSCDEVICETYPES_H 3030f984aSJacob Faibussowitsch 4fe0d65a2SJacob Faibussowitsch /* for PETSC_HAVE_CUDA/HIP/KOKKOS etc */ 5fe0d65a2SJacob 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 12fe0d65a2SJacob Faibussowitsch 13fe0d65a2SJacob Faibussowitsch $ z = 0 - Host memory 14fe0d65a2SJacob Faibussowitsch $ z = 1 - Device memory 15fe0d65a2SJacob Faibussowitsch $ yyy = 000 - CUDA-related memory 16fe0d65a2SJacob Faibussowitsch $ yyy = 001 - HIP-related memory 17fe0d65a2SJacob Faibussowitsch $ xxxxyyy1 = 0000,0001 - CUDA memory 18fe0d65a2SJacob Faibussowitsch $ xxxxyyy1 = 0001,0001 - CUDA NVSHMEM memory 19fe0d65a2SJacob 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 23fe0d65a2SJacob Faibussowitsch Level: beginner 24fe0d65a2SJacob Faibussowitsch 25030f984aSJacob Faibussowitsch .seealso: VecGetArrayAndMemType(), PetscSFBcastWithMemTypeBegin(), PetscSFReduceWithMemTypeBegin() 26030f984aSJacob Faibussowitsch E*/ 27fe0d65a2SJacob Faibussowitsch typedef enum { 28fe0d65a2SJacob Faibussowitsch PETSC_MEMTYPE_HOST = 0, 29fe0d65a2SJacob Faibussowitsch PETSC_MEMTYPE_DEVICE = 0x01, 30fe0d65a2SJacob Faibussowitsch PETSC_MEMTYPE_CUDA = 0x01, 31fe0d65a2SJacob Faibussowitsch PETSC_MEMTYPE_NVSHMEM = 0x11, 32fe0d65a2SJacob Faibussowitsch PETSC_MEMTYPE_HIP = 0x03 33fe0d65a2SJacob 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 44fe0d65a2SJacob Faibussowitsch $ PETSC_OFFLOAD_UNALLOCATED - no memory contains valid matrix entries; NEVER used for vectors 45fe0d65a2SJacob Faibussowitsch $ PETSC_OFFLOAD_GPU - GPU has valid vector/matrix entries 46fe0d65a2SJacob Faibussowitsch $ PETSC_OFFLOAD_CPU - CPU has valid vector/matrix entries 47fe0d65a2SJacob Faibussowitsch $ PETSC_OFFLOAD_BOTH - Both GPU and CPU have valid vector/matrix entries and they match 48fe0d65a2SJacob 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*/ 52fe0d65a2SJacob Faibussowitsch typedef enum { 53fe0d65a2SJacob Faibussowitsch PETSC_OFFLOAD_UNALLOCATED = 0x0, 54fe0d65a2SJacob Faibussowitsch PETSC_OFFLOAD_CPU = 0x1, 55fe0d65a2SJacob Faibussowitsch PETSC_OFFLOAD_GPU = 0x2, 56fe0d65a2SJacob Faibussowitsch PETSC_OFFLOAD_BOTH = 0x3, 57fe0d65a2SJacob Faibussowitsch PETSC_OFFLOAD_VECKOKKOS = 0x100 58fe0d65a2SJacob Faibussowitsch } PetscOffloadMask; 59030f984aSJacob Faibussowitsch 60030f984aSJacob Faibussowitsch /*E 61*a4af0ceeSJacob Faibussowitsch PetscDeviceInitType - Initialization strategy for PetscDevice 62*a4af0ceeSJacob Faibussowitsch 63*a4af0ceeSJacob Faibussowitsch $ PETSC_DEVICE_INIT_NONE - PetscDevice is never initialized 64*a4af0ceeSJacob Faibussowitsch $ PETSC_DEVICE_INIT_LAZY - PetscDevice is initialized on demand 65*a4af0ceeSJacob Faibussowitsch $ PETSC_DEVICE_INIT_EAGER - PetscDevice is initialized as soon as possible 66*a4af0ceeSJacob Faibussowitsch 67*a4af0ceeSJacob Faibussowitsch Notes: 68*a4af0ceeSJacob Faibussowitsch PETSC_DEVICE_INIT_NONE implies that any initialization of PetscDevice is disallowed and 69*a4af0ceeSJacob Faibussowitsch doing so results in an error. Useful to ensure that no accelerator is used in a program. 70*a4af0ceeSJacob Faibussowitsch 71*a4af0ceeSJacob Faibussowitsch Level: beginner 72*a4af0ceeSJacob Faibussowitsch 73*a4af0ceeSJacob Faibussowitsch .seealso: PetscDevice, PetscDeviceType, PetscDeviceInitialize(), PetscDeviceInitialized(), PetscDeviceCreate() 74*a4af0ceeSJacob Faibussowitsch E*/ 75*a4af0ceeSJacob Faibussowitsch typedef enum { 76*a4af0ceeSJacob Faibussowitsch PETSC_DEVICE_INIT_NONE, 77*a4af0ceeSJacob Faibussowitsch PETSC_DEVICE_INIT_LAZY, 78*a4af0ceeSJacob Faibussowitsch PETSC_DEVICE_INIT_EAGER 79*a4af0ceeSJacob Faibussowitsch } PetscDeviceInitType; 80*a4af0ceeSJacob Faibussowitsch PETSC_EXTERN const char *const PetscDeviceInitTypes[]; 81*a4af0ceeSJacob Faibussowitsch 82*a4af0ceeSJacob Faibussowitsch /*E 83*a4af0ceeSJacob Faibussowitsch PetscDeviceType - Kind of accelerator device backend 84030f984aSJacob Faibussowitsch 85030f984aSJacob Faibussowitsch $ PETSC_DEVICE_INVALID - Invalid type, do not use 86030f984aSJacob Faibussowitsch $ PETSC_DEVICE_CUDA - CUDA enabled GPU 87030f984aSJacob Faibussowitsch $ PETSC_DEVICE_HIP - ROCM/HIP enabled GPU 88030f984aSJacob Faibussowitsch $ PETSC_DEVICE_DEFAULT - Automatically select backend based on availability 89*a4af0ceeSJacob Faibussowitsch $ PETSC_DEVICE_MAX - Always 1 greater than the largest valid PetscDeviceType, invalid type, do not use 90030f984aSJacob Faibussowitsch 91030f984aSJacob Faibussowitsch Notes: 92030f984aSJacob Faibussowitsch PETSC_DEVICE_DEFAULT is selected in the following order: PETSC_DEVICE_HIP, PETSC_DEVICE_CUDA, PETSC_DEVICE_INVALID. 93030f984aSJacob Faibussowitsch 94030f984aSJacob Faibussowitsch Level: beginner 95030f984aSJacob Faibussowitsch 96*a4af0ceeSJacob Faibussowitsch .seealso: PetscDevice, PetscDeviceInitType, PetscDeviceCreate() 97030f984aSJacob Faibussowitsch E*/ 98030f984aSJacob Faibussowitsch typedef enum { 99*a4af0ceeSJacob Faibussowitsch PETSC_DEVICE_INVALID, 100*a4af0ceeSJacob Faibussowitsch PETSC_DEVICE_CUDA, 101*a4af0ceeSJacob Faibussowitsch PETSC_DEVICE_HIP, 102*a4af0ceeSJacob Faibussowitsch PETSC_DEVICE_MAX 103*a4af0ceeSJacob Faibussowitsch } PetscDeviceType; 104*a4af0ceeSJacob Faibussowitsch PETSC_EXTERN const char *const PetscDeviceTypes[]; 1055181c4f9SJacob Faibussowitsch #if PetscDefined(HAVE_HIP) 1065181c4f9SJacob Faibussowitsch # define PETSC_DEVICE_DEFAULT PETSC_DEVICE_HIP 1075181c4f9SJacob Faibussowitsch #elif PetscDefined(HAVE_CUDA) 1085181c4f9SJacob Faibussowitsch # define PETSC_DEVICE_DEFAULT PETSC_DEVICE_CUDA 1095181c4f9SJacob Faibussowitsch #else 1105181c4f9SJacob Faibussowitsch # define PETSC_DEVICE_DEFAULT PETSC_DEVICE_INVALID 1115181c4f9SJacob Faibussowitsch #endif 112030f984aSJacob Faibussowitsch 113030f984aSJacob Faibussowitsch /*S 114030f984aSJacob Faibussowitsch PetscDevice - Handle to an accelerator "device" (usually a GPU) 115030f984aSJacob Faibussowitsch 116030f984aSJacob Faibussowitsch Notes: 117030f984aSJacob Faibussowitsch This object is used to house configuration and state of a device, but does not offer any ability to interact with or 118030f984aSJacob Faibussowitsch drive device computation. This functionality is facilitated instead by the PetscDeviceContext object. 119030f984aSJacob Faibussowitsch 120030f984aSJacob Faibussowitsch Level: beginner 121030f984aSJacob Faibussowitsch 122*a4af0ceeSJacob Faibussowitsch .seealso: PetscDeviceType, PetscDeviceInitType, PetscDeviceCreate(), PetscDeviceConfigure(), PetscDeviceDestroy(), PetscDeviceContext, PetscDeviceContextSetDevice(), PetscDeviceContextGetDevice() 123030f984aSJacob Faibussowitsch S*/ 124030f984aSJacob Faibussowitsch typedef struct _n_PetscDevice *PetscDevice; 125030f984aSJacob Faibussowitsch 126030f984aSJacob Faibussowitsch /*E 127030f984aSJacob Faibussowitsch PetscStreamType - Stream blocking mode, indicates how a stream implementation will interact with the default "NULL" 128030f984aSJacob Faibussowitsch stream, which is usually blocking. 129030f984aSJacob Faibussowitsch 130030f984aSJacob 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. 131030f984aSJacob Faibussowitsch $ PETSC_STREAM_DEFAULT_BLOCKING - Stream will act independent of other streams, but will still be blocked by actions on the NULL stream. 132030f984aSJacob Faibussowitsch $ PETSC_STREAM_GLOBAL_NONBLOCKING - Stream is truly asynchronous, and is blocked by nothing, not even the NULL stream. 133030f984aSJacob Faibussowitsch $ PETSC_STREAM_MAX - Always 1 greater than the largest PetscStreamType, do not use 134030f984aSJacob Faibussowitsch 135030f984aSJacob Faibussowitsch Level: intermediate 136030f984aSJacob Faibussowitsch 137030f984aSJacob Faibussowitsch .seealso: PetscDeviceContextSetStreamType(), PetscDeviceContextGetStreamType() 138030f984aSJacob Faibussowitsch E*/ 139030f984aSJacob Faibussowitsch typedef enum { 140*a4af0ceeSJacob Faibussowitsch PETSC_STREAM_GLOBAL_BLOCKING, 141*a4af0ceeSJacob Faibussowitsch PETSC_STREAM_DEFAULT_BLOCKING, 142*a4af0ceeSJacob Faibussowitsch PETSC_STREAM_GLOBAL_NONBLOCKING, 143*a4af0ceeSJacob Faibussowitsch PETSC_STREAM_MAX 144030f984aSJacob Faibussowitsch } PetscStreamType; 145030f984aSJacob Faibussowitsch PETSC_EXTERN const char *const PetscStreamTypes[]; 146030f984aSJacob Faibussowitsch 147030f984aSJacob Faibussowitsch /*E 148030f984aSJacob Faibussowitsch PetscDeviceContextJoinMode - Describes the type of join operation to perform in PetscDeviceContextJoin() 149030f984aSJacob Faibussowitsch 150030f984aSJacob Faibussowitsch $ PETSC_DEVICE_CONTEXT_DESTROY - Destroy all incoming sub-contexts after join. 151030f984aSJacob Faibussowitsch $ PETSC_CONTEXT_JOIN_SYNC - Synchronize incoming sub-contexts after join. 152030f984aSJacob Faibussowitsch $ PETSC_CONTEXT_JOIN_NO_SYNC - Do not synchronize incoming sub-contexts after join. 153030f984aSJacob Faibussowitsch 154030f984aSJacob Faibussowitsch Level: beginner 155030f984aSJacob Faibussowitsch 156*a4af0ceeSJacob Faibussowitsch .seealso: PetscDeviceContext, PetscDeviceContextFork(), PetscDeviceContextJoin() 157030f984aSJacob Faibussowitsch E*/ 158030f984aSJacob Faibussowitsch typedef enum { 159030f984aSJacob Faibussowitsch PETSC_DEVICE_CONTEXT_JOIN_DESTROY, 160030f984aSJacob Faibussowitsch PETSC_DEVICE_CONTEXT_JOIN_SYNC, 161030f984aSJacob Faibussowitsch PETSC_DEVICE_CONTEXT_JOIN_NO_SYNC 162030f984aSJacob Faibussowitsch } PetscDeviceContextJoinMode; 163030f984aSJacob Faibussowitsch PETSC_EXTERN const char *const PetscDeviceContextJoinModes[]; 164030f984aSJacob Faibussowitsch 165030f984aSJacob Faibussowitsch /*S 166030f984aSJacob Faibussowitsch PetscDeviceContext - Container to manage stream dependencies and the various solver handles for asynchronous device compute. 167030f984aSJacob Faibussowitsch 168030f984aSJacob Faibussowitsch Level: beginner 169030f984aSJacob Faibussowitsch 170030f984aSJacob Faibussowitsch .seealso: PetscDevice, PetscDeviceContextCreate(), PetscDeviceContextSetDevice(), PetscDeviceContextDestroy(), 171030f984aSJacob Faibussowitsch PetscDeviceContextFork(), PetscDeviceContextJoin() 172030f984aSJacob Faibussowitsch S*/ 173030f984aSJacob Faibussowitsch typedef struct _n_PetscDeviceContext *PetscDeviceContext; 174030f984aSJacob Faibussowitsch #endif /* PETSCDEVICETYPES_H */ 175