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 48*ae76731bSJunchao Zhang $ PETSC_OFFLOAD_KOKKOS - Reserved for Kokkos matrix and vector. It means the offload is managed by Kokkos, thus this flag itself cannot tell you where the valid data is. 49030f984aSJacob Faibussowitsch 50030f984aSJacob Faibussowitsch Level: developer 51030f984aSJacob Faibussowitsch E*/ 52*ae76731bSJunchao Zhang #define PETSC_OFFLOAD_VECKOKKOS_DPRECATED PETSC_OFFLOAD_VECKOKKOS PETSC_DEPRECATED_ENUM("Use PETSC_OFFLOAD_KOKKOS (since version 3.17.0)") 53fe0d65a2SJacob Faibussowitsch typedef enum { 54fe0d65a2SJacob Faibussowitsch PETSC_OFFLOAD_UNALLOCATED = 0x0, 55fe0d65a2SJacob Faibussowitsch PETSC_OFFLOAD_CPU = 0x1, 56fe0d65a2SJacob Faibussowitsch PETSC_OFFLOAD_GPU = 0x2, 57fe0d65a2SJacob Faibussowitsch PETSC_OFFLOAD_BOTH = 0x3, 58*ae76731bSJunchao Zhang PETSC_OFFLOAD_VECKOKKOS_DPRECATED = 0x100, 59*ae76731bSJunchao Zhang PETSC_OFFLOAD_KOKKOS = 0x100 60fe0d65a2SJacob Faibussowitsch } PetscOffloadMask; 61030f984aSJacob Faibussowitsch 62030f984aSJacob Faibussowitsch /*E 63a4af0ceeSJacob Faibussowitsch PetscDeviceInitType - Initialization strategy for PetscDevice 64a4af0ceeSJacob Faibussowitsch 65a4af0ceeSJacob Faibussowitsch $ PETSC_DEVICE_INIT_NONE - PetscDevice is never initialized 66a4af0ceeSJacob Faibussowitsch $ PETSC_DEVICE_INIT_LAZY - PetscDevice is initialized on demand 67a4af0ceeSJacob Faibussowitsch $ PETSC_DEVICE_INIT_EAGER - PetscDevice is initialized as soon as possible 68a4af0ceeSJacob Faibussowitsch 69a4af0ceeSJacob Faibussowitsch Notes: 70a4af0ceeSJacob Faibussowitsch PETSC_DEVICE_INIT_NONE implies that any initialization of PetscDevice is disallowed and 71a4af0ceeSJacob Faibussowitsch doing so results in an error. Useful to ensure that no accelerator is used in a program. 72a4af0ceeSJacob Faibussowitsch 73a4af0ceeSJacob Faibussowitsch Level: beginner 74a4af0ceeSJacob Faibussowitsch 75a4af0ceeSJacob Faibussowitsch .seealso: PetscDevice, PetscDeviceType, PetscDeviceInitialize(), PetscDeviceInitialized(), PetscDeviceCreate() 76a4af0ceeSJacob Faibussowitsch E*/ 77a4af0ceeSJacob Faibussowitsch typedef enum { 78a4af0ceeSJacob Faibussowitsch PETSC_DEVICE_INIT_NONE, 79a4af0ceeSJacob Faibussowitsch PETSC_DEVICE_INIT_LAZY, 80a4af0ceeSJacob Faibussowitsch PETSC_DEVICE_INIT_EAGER 81a4af0ceeSJacob Faibussowitsch } PetscDeviceInitType; 82a4af0ceeSJacob Faibussowitsch PETSC_EXTERN const char *const PetscDeviceInitTypes[]; 83a4af0ceeSJacob Faibussowitsch 84a4af0ceeSJacob Faibussowitsch /*E 85a4af0ceeSJacob Faibussowitsch PetscDeviceType - Kind of accelerator device backend 86030f984aSJacob Faibussowitsch 87030f984aSJacob Faibussowitsch $ PETSC_DEVICE_INVALID - Invalid type, do not use 88030f984aSJacob Faibussowitsch $ PETSC_DEVICE_CUDA - CUDA enabled GPU 89030f984aSJacob Faibussowitsch $ PETSC_DEVICE_HIP - ROCM/HIP enabled GPU 90030f984aSJacob Faibussowitsch $ PETSC_DEVICE_DEFAULT - Automatically select backend based on availability 91a4af0ceeSJacob Faibussowitsch $ PETSC_DEVICE_MAX - Always 1 greater than the largest valid PetscDeviceType, invalid type, do not use 92030f984aSJacob Faibussowitsch 93030f984aSJacob Faibussowitsch Notes: 94030f984aSJacob Faibussowitsch PETSC_DEVICE_DEFAULT is selected in the following order: PETSC_DEVICE_HIP, PETSC_DEVICE_CUDA, PETSC_DEVICE_INVALID. 95030f984aSJacob Faibussowitsch 96030f984aSJacob Faibussowitsch Level: beginner 97030f984aSJacob Faibussowitsch 98a4af0ceeSJacob Faibussowitsch .seealso: PetscDevice, PetscDeviceInitType, PetscDeviceCreate() 99030f984aSJacob Faibussowitsch E*/ 100030f984aSJacob Faibussowitsch typedef enum { 101a4af0ceeSJacob Faibussowitsch PETSC_DEVICE_INVALID, 102a4af0ceeSJacob Faibussowitsch PETSC_DEVICE_CUDA, 103a4af0ceeSJacob Faibussowitsch PETSC_DEVICE_HIP, 104a4af0ceeSJacob Faibussowitsch PETSC_DEVICE_MAX 105a4af0ceeSJacob Faibussowitsch } PetscDeviceType; 106a4af0ceeSJacob Faibussowitsch PETSC_EXTERN const char *const PetscDeviceTypes[]; 1075181c4f9SJacob Faibussowitsch #if PetscDefined(HAVE_HIP) 1085181c4f9SJacob Faibussowitsch # define PETSC_DEVICE_DEFAULT PETSC_DEVICE_HIP 1095181c4f9SJacob Faibussowitsch #elif PetscDefined(HAVE_CUDA) 1105181c4f9SJacob Faibussowitsch # define PETSC_DEVICE_DEFAULT PETSC_DEVICE_CUDA 1115181c4f9SJacob Faibussowitsch #else 1125181c4f9SJacob Faibussowitsch # define PETSC_DEVICE_DEFAULT PETSC_DEVICE_INVALID 1135181c4f9SJacob Faibussowitsch #endif 114030f984aSJacob Faibussowitsch 115030f984aSJacob Faibussowitsch /*S 116030f984aSJacob Faibussowitsch PetscDevice - Handle to an accelerator "device" (usually a GPU) 117030f984aSJacob Faibussowitsch 118030f984aSJacob Faibussowitsch Notes: 119030f984aSJacob Faibussowitsch This object is used to house configuration and state of a device, but does not offer any ability to interact with or 120030f984aSJacob Faibussowitsch drive device computation. This functionality is facilitated instead by the PetscDeviceContext object. 121030f984aSJacob Faibussowitsch 122030f984aSJacob Faibussowitsch Level: beginner 123030f984aSJacob Faibussowitsch 124a4af0ceeSJacob Faibussowitsch .seealso: PetscDeviceType, PetscDeviceInitType, PetscDeviceCreate(), PetscDeviceConfigure(), PetscDeviceDestroy(), PetscDeviceContext, PetscDeviceContextSetDevice(), PetscDeviceContextGetDevice() 125030f984aSJacob Faibussowitsch S*/ 126030f984aSJacob Faibussowitsch typedef struct _n_PetscDevice *PetscDevice; 127030f984aSJacob Faibussowitsch 128030f984aSJacob Faibussowitsch /*E 129030f984aSJacob Faibussowitsch PetscStreamType - Stream blocking mode, indicates how a stream implementation will interact with the default "NULL" 130030f984aSJacob Faibussowitsch stream, which is usually blocking. 131030f984aSJacob Faibussowitsch 132030f984aSJacob 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. 133030f984aSJacob Faibussowitsch $ PETSC_STREAM_DEFAULT_BLOCKING - Stream will act independent of other streams, but will still be blocked by actions on the NULL stream. 134030f984aSJacob Faibussowitsch $ PETSC_STREAM_GLOBAL_NONBLOCKING - Stream is truly asynchronous, and is blocked by nothing, not even the NULL stream. 135030f984aSJacob Faibussowitsch $ PETSC_STREAM_MAX - Always 1 greater than the largest PetscStreamType, do not use 136030f984aSJacob Faibussowitsch 137030f984aSJacob Faibussowitsch Level: intermediate 138030f984aSJacob Faibussowitsch 139030f984aSJacob Faibussowitsch .seealso: PetscDeviceContextSetStreamType(), PetscDeviceContextGetStreamType() 140030f984aSJacob Faibussowitsch E*/ 141030f984aSJacob Faibussowitsch typedef enum { 142a4af0ceeSJacob Faibussowitsch PETSC_STREAM_GLOBAL_BLOCKING, 143a4af0ceeSJacob Faibussowitsch PETSC_STREAM_DEFAULT_BLOCKING, 144a4af0ceeSJacob Faibussowitsch PETSC_STREAM_GLOBAL_NONBLOCKING, 145a4af0ceeSJacob Faibussowitsch PETSC_STREAM_MAX 146030f984aSJacob Faibussowitsch } PetscStreamType; 147030f984aSJacob Faibussowitsch PETSC_EXTERN const char *const PetscStreamTypes[]; 148030f984aSJacob Faibussowitsch 149030f984aSJacob Faibussowitsch /*E 150030f984aSJacob Faibussowitsch PetscDeviceContextJoinMode - Describes the type of join operation to perform in PetscDeviceContextJoin() 151030f984aSJacob Faibussowitsch 152030f984aSJacob Faibussowitsch $ PETSC_DEVICE_CONTEXT_DESTROY - Destroy all incoming sub-contexts after join. 153030f984aSJacob Faibussowitsch $ PETSC_CONTEXT_JOIN_SYNC - Synchronize incoming sub-contexts after join. 154030f984aSJacob Faibussowitsch $ PETSC_CONTEXT_JOIN_NO_SYNC - Do not synchronize incoming sub-contexts after join. 155030f984aSJacob Faibussowitsch 156030f984aSJacob Faibussowitsch Level: beginner 157030f984aSJacob Faibussowitsch 158a4af0ceeSJacob Faibussowitsch .seealso: PetscDeviceContext, PetscDeviceContextFork(), PetscDeviceContextJoin() 159030f984aSJacob Faibussowitsch E*/ 160030f984aSJacob Faibussowitsch typedef enum { 161030f984aSJacob Faibussowitsch PETSC_DEVICE_CONTEXT_JOIN_DESTROY, 162030f984aSJacob Faibussowitsch PETSC_DEVICE_CONTEXT_JOIN_SYNC, 163030f984aSJacob Faibussowitsch PETSC_DEVICE_CONTEXT_JOIN_NO_SYNC 164030f984aSJacob Faibussowitsch } PetscDeviceContextJoinMode; 165030f984aSJacob Faibussowitsch PETSC_EXTERN const char *const PetscDeviceContextJoinModes[]; 166030f984aSJacob Faibussowitsch 167030f984aSJacob Faibussowitsch /*S 168030f984aSJacob Faibussowitsch PetscDeviceContext - Container to manage stream dependencies and the various solver handles for asynchronous device compute. 169030f984aSJacob Faibussowitsch 170030f984aSJacob Faibussowitsch Level: beginner 171030f984aSJacob Faibussowitsch 172030f984aSJacob Faibussowitsch .seealso: PetscDevice, PetscDeviceContextCreate(), PetscDeviceContextSetDevice(), PetscDeviceContextDestroy(), 173030f984aSJacob Faibussowitsch PetscDeviceContextFork(), PetscDeviceContextJoin() 174030f984aSJacob Faibussowitsch S*/ 175030f984aSJacob Faibussowitsch typedef struct _n_PetscDeviceContext *PetscDeviceContext; 176030f984aSJacob Faibussowitsch #endif /* PETSCDEVICETYPES_H */ 177