107e4ef11SJacob Faibussowitsch #ifndef PETSCDEVICETYPES_H 2030f984aSJacob Faibussowitsch #define PETSCDEVICETYPES_H 3030f984aSJacob Faibussowitsch 41105d5caSJacob Faibussowitsch #include <petscmacros.h> /*I <petscdevicetypes.h> I*/ 5030f984aSJacob Faibussowitsch 6*ac09b921SBarry Smith /* SUBMANSEC = Sys */ 7*ac09b921SBarry Smith 8030f984aSJacob Faibussowitsch /*E 9030f984aSJacob Faibussowitsch PetscMemType - Memory type of a pointer 10030f984aSJacob Faibussowitsch 11030f984aSJacob Faibussowitsch Developer Note: 12030f984aSJacob Faibussowitsch Encoding of the bitmask in binary: xxxxyyyz 13fe0d65a2SJacob Faibussowitsch 14fe0d65a2SJacob Faibussowitsch $ z = 0 - Host memory 15fe0d65a2SJacob Faibussowitsch $ z = 1 - Device memory 16fe0d65a2SJacob Faibussowitsch $ yyy = 000 - CUDA-related memory 17fe0d65a2SJacob Faibussowitsch $ yyy = 001 - HIP-related memory 18a2158755SJunchao Zhang $ yyy = 010 - SYCL-related memory 19fe0d65a2SJacob Faibussowitsch $ xxxxyyy1 = 0000,0001 - CUDA memory 20fe0d65a2SJacob Faibussowitsch $ xxxxyyy1 = 0001,0001 - CUDA NVSHMEM memory 21fe0d65a2SJacob Faibussowitsch $ xxxxyyy1 = 0000,0011 - HIP memory 22a2158755SJunchao Zhang $ xxxxyyy1 = 0000,0101 - SYCL memory 23030f984aSJacob Faibussowitsch 24030f984aSJacob Faibussowitsch Other types of memory, e.g., CUDA managed memory, can be added when needed. 25030f984aSJacob Faibussowitsch 26fe0d65a2SJacob Faibussowitsch Level: beginner 27fe0d65a2SJacob Faibussowitsch 283214990dSStefano Zampini Notes: 293214990dSStefano Zampini PETSC_MEMTYPE_KOKKOS depends on the KOKKOS backend configuration 303214990dSStefano Zampini 31db781477SPatrick Sanan .seealso: `VecGetArrayAndMemType()`, `PetscSFBcastWithMemTypeBegin()`, `PetscSFReduceWithMemTypeBegin()` 32030f984aSJacob Faibussowitsch E*/ 33fe0d65a2SJacob Faibussowitsch typedef enum { 34fe0d65a2SJacob Faibussowitsch PETSC_MEMTYPE_HOST = 0, 35fe0d65a2SJacob Faibussowitsch PETSC_MEMTYPE_DEVICE = 0x01, 36fe0d65a2SJacob Faibussowitsch PETSC_MEMTYPE_CUDA = 0x01, 37fe0d65a2SJacob Faibussowitsch PETSC_MEMTYPE_NVSHMEM = 0x11, 38a2158755SJunchao Zhang PETSC_MEMTYPE_HIP = 0x03, 393214990dSStefano Zampini PETSC_MEMTYPE_SYCL = 0x05, 40fe0d65a2SJacob Faibussowitsch } PetscMemType; 41c0288c05SSatish Balay #if PetscDefined(HAVE_CUDA) 42c0288c05SSatish Balay # define PETSC_MEMTYPE_KOKKOS PETSC_MEMTYPE_CUDA 43c0288c05SSatish Balay #elif PetscDefined(HAVE_HIP) 44c0288c05SSatish Balay # define PETSC_MEMTYPE_KOKKOS PETSC_MEMTYPE_HIP 45c0288c05SSatish Balay #elif PetscDefined(HAVE_SYCL) 46c0288c05SSatish Balay # define PETSC_MEMTYPE_KOKKOS PETSC_MEMTYPE_SYCL 47c0288c05SSatish Balay #else 48c0288c05SSatish Balay # define PETSC_MEMTYPE_KOKKOS PETSC_MEMTYPE_HOST 49c0288c05SSatish Balay #endif 50030f984aSJacob Faibussowitsch 51030f984aSJacob Faibussowitsch #define PetscMemTypeHost(m) (((m) & 0x1) == PETSC_MEMTYPE_HOST) 52030f984aSJacob Faibussowitsch #define PetscMemTypeDevice(m) (((m) & 0x1) == PETSC_MEMTYPE_DEVICE) 53030f984aSJacob Faibussowitsch #define PetscMemTypeCUDA(m) (((m) & 0xF) == PETSC_MEMTYPE_CUDA) 54030f984aSJacob Faibussowitsch #define PetscMemTypeHIP(m) (((m) & 0xF) == PETSC_MEMTYPE_HIP) 55a2158755SJunchao Zhang #define PetscMemTypeSYCL(m) (((m) & 0xF) == PETSC_MEMTYPE_SYCL) 56030f984aSJacob Faibussowitsch #define PetscMemTypeNVSHMEM(m) ((m) == PETSC_MEMTYPE_NVSHMEM) 57030f984aSJacob Faibussowitsch 585b5f62f7SJacob Faibussowitsch #define PETSC_OFFLOAD_VECKOKKOS_DEPRECATED PETSC_OFFLOAD_VECKOKKOS PETSC_DEPRECATED_ENUM("Use PETSC_OFFLOAD_KOKKOS (since version 3.17.0)") 59030f984aSJacob Faibussowitsch /*E 60030f984aSJacob Faibussowitsch PetscOffloadMask - indicates which memory (CPU, GPU, or none) contains valid data 61030f984aSJacob Faibussowitsch 62fe0d65a2SJacob Faibussowitsch $ PETSC_OFFLOAD_UNALLOCATED - no memory contains valid matrix entries; NEVER used for vectors 63fe0d65a2SJacob Faibussowitsch $ PETSC_OFFLOAD_GPU - GPU has valid vector/matrix entries 64fe0d65a2SJacob Faibussowitsch $ PETSC_OFFLOAD_CPU - CPU has valid vector/matrix entries 65fe0d65a2SJacob Faibussowitsch $ PETSC_OFFLOAD_BOTH - Both GPU and CPU have valid vector/matrix entries and they match 66ae76731bSJunchao 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. 67030f984aSJacob Faibussowitsch 68030f984aSJacob Faibussowitsch Level: developer 69030f984aSJacob Faibussowitsch E*/ 70fe0d65a2SJacob Faibussowitsch typedef enum { 71fe0d65a2SJacob Faibussowitsch PETSC_OFFLOAD_UNALLOCATED = 0x0, 72fe0d65a2SJacob Faibussowitsch PETSC_OFFLOAD_CPU = 0x1, 73fe0d65a2SJacob Faibussowitsch PETSC_OFFLOAD_GPU = 0x2, 74fe0d65a2SJacob Faibussowitsch PETSC_OFFLOAD_BOTH = 0x3, 75d795ed5eSJunchao Zhang PETSC_OFFLOAD_VECKOKKOS_DEPRECATED = 0x100, 76ae76731bSJunchao Zhang PETSC_OFFLOAD_KOKKOS = 0x100 77fe0d65a2SJacob Faibussowitsch } PetscOffloadMask; 78030f984aSJacob Faibussowitsch 79030f984aSJacob Faibussowitsch /*E 80a4af0ceeSJacob Faibussowitsch PetscDeviceInitType - Initialization strategy for PetscDevice 81a4af0ceeSJacob Faibussowitsch 82a4af0ceeSJacob Faibussowitsch $ PETSC_DEVICE_INIT_NONE - PetscDevice is never initialized 83a4af0ceeSJacob Faibussowitsch $ PETSC_DEVICE_INIT_LAZY - PetscDevice is initialized on demand 84a4af0ceeSJacob Faibussowitsch $ PETSC_DEVICE_INIT_EAGER - PetscDevice is initialized as soon as possible 85a4af0ceeSJacob Faibussowitsch 86a4af0ceeSJacob Faibussowitsch Notes: 87a4af0ceeSJacob Faibussowitsch PETSC_DEVICE_INIT_NONE implies that any initialization of PetscDevice is disallowed and 88a4af0ceeSJacob Faibussowitsch doing so results in an error. Useful to ensure that no accelerator is used in a program. 89a4af0ceeSJacob Faibussowitsch 90a4af0ceeSJacob Faibussowitsch Level: beginner 91a4af0ceeSJacob Faibussowitsch 92db781477SPatrick Sanan .seealso: `PetscDevice`, `PetscDeviceType`, `PetscDeviceInitialize()`, `PetscDeviceInitialized()`, `PetscDeviceCreate()` 93a4af0ceeSJacob Faibussowitsch E*/ 94a4af0ceeSJacob Faibussowitsch typedef enum { 95a4af0ceeSJacob Faibussowitsch PETSC_DEVICE_INIT_NONE, 96a4af0ceeSJacob Faibussowitsch PETSC_DEVICE_INIT_LAZY, 97a4af0ceeSJacob Faibussowitsch PETSC_DEVICE_INIT_EAGER 98a4af0ceeSJacob Faibussowitsch } PetscDeviceInitType; 99a4af0ceeSJacob Faibussowitsch PETSC_EXTERN const char *const PetscDeviceInitTypes[]; 100a4af0ceeSJacob Faibussowitsch 101a4af0ceeSJacob Faibussowitsch /*E 102a4af0ceeSJacob Faibussowitsch PetscDeviceType - Kind of accelerator device backend 103030f984aSJacob Faibussowitsch 104030f984aSJacob Faibussowitsch $ PETSC_DEVICE_INVALID - Invalid type, do not use 105030f984aSJacob Faibussowitsch $ PETSC_DEVICE_CUDA - CUDA enabled GPU 106030f984aSJacob Faibussowitsch $ PETSC_DEVICE_HIP - ROCM/HIP enabled GPU 107a2158755SJunchao Zhang $ PETSC_DEVICE_SYCL - SYCL enabled device 108030f984aSJacob Faibussowitsch $ PETSC_DEVICE_DEFAULT - Automatically select backend based on availability 109a4af0ceeSJacob Faibussowitsch $ PETSC_DEVICE_MAX - Always 1 greater than the largest valid PetscDeviceType, invalid type, do not use 110030f984aSJacob Faibussowitsch 111030f984aSJacob Faibussowitsch Notes: 112a2158755SJunchao Zhang PETSC_DEVICE_DEFAULT is selected in the following order: PETSC_DEVICE_HIP, PETSC_DEVICE_CUDA, PETSC_DEVICE_SYCL, PETSC_DEVICE_INVALID. 113030f984aSJacob Faibussowitsch 114030f984aSJacob Faibussowitsch Level: beginner 115030f984aSJacob Faibussowitsch 116db781477SPatrick Sanan .seealso: `PetscDevice`, `PetscDeviceInitType`, `PetscDeviceCreate()` 117030f984aSJacob Faibussowitsch E*/ 118030f984aSJacob Faibussowitsch typedef enum { 119a4af0ceeSJacob Faibussowitsch PETSC_DEVICE_INVALID, 120a4af0ceeSJacob Faibussowitsch PETSC_DEVICE_CUDA, 121a4af0ceeSJacob Faibussowitsch PETSC_DEVICE_HIP, 122a2158755SJunchao Zhang PETSC_DEVICE_SYCL, 123a4af0ceeSJacob Faibussowitsch PETSC_DEVICE_MAX 124a4af0ceeSJacob Faibussowitsch } PetscDeviceType; 125a4af0ceeSJacob Faibussowitsch PETSC_EXTERN const char *const PetscDeviceTypes[]; 12607e4ef11SJacob Faibussowitsch #if defined(PETSC_HAVE_HIP) 1275181c4f9SJacob Faibussowitsch # define PETSC_DEVICE_DEFAULT PETSC_DEVICE_HIP 12807e4ef11SJacob Faibussowitsch #elif defined(PETSC_HAVE_CUDA) 1295181c4f9SJacob Faibussowitsch # define PETSC_DEVICE_DEFAULT PETSC_DEVICE_CUDA 130a2158755SJunchao Zhang #elif PetscDefined(HAVE_SYCL) 131a2158755SJunchao Zhang # define PETSC_DEVICE_DEFAULT PETSC_DEVICE_SYCL 1325181c4f9SJacob Faibussowitsch #else 1335181c4f9SJacob Faibussowitsch # define PETSC_DEVICE_DEFAULT PETSC_DEVICE_INVALID 1345181c4f9SJacob Faibussowitsch #endif 135030f984aSJacob Faibussowitsch 136030f984aSJacob Faibussowitsch /*S 137030f984aSJacob Faibussowitsch PetscDevice - Handle to an accelerator "device" (usually a GPU) 138030f984aSJacob Faibussowitsch 139030f984aSJacob Faibussowitsch Notes: 140030f984aSJacob Faibussowitsch This object is used to house configuration and state of a device, but does not offer any ability to interact with or 141030f984aSJacob Faibussowitsch drive device computation. This functionality is facilitated instead by the PetscDeviceContext object. 142030f984aSJacob Faibussowitsch 143030f984aSJacob Faibussowitsch Level: beginner 144030f984aSJacob Faibussowitsch 145db781477SPatrick Sanan .seealso: `PetscDeviceType`, `PetscDeviceInitType`, `PetscDeviceCreate()`, `PetscDeviceConfigure()`, `PetscDeviceDestroy()`, `PetscDeviceContext`, `PetscDeviceContextSetDevice()`, `PetscDeviceContextGetDevice()` 146030f984aSJacob Faibussowitsch S*/ 147030f984aSJacob Faibussowitsch typedef struct _n_PetscDevice *PetscDevice; 148030f984aSJacob Faibussowitsch 149030f984aSJacob Faibussowitsch /*E 150030f984aSJacob Faibussowitsch PetscStreamType - Stream blocking mode, indicates how a stream implementation will interact with the default "NULL" 151030f984aSJacob Faibussowitsch stream, which is usually blocking. 152030f984aSJacob Faibussowitsch 153030f984aSJacob 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. 154030f984aSJacob Faibussowitsch $ PETSC_STREAM_DEFAULT_BLOCKING - Stream will act independent of other streams, but will still be blocked by actions on the NULL stream. 155030f984aSJacob Faibussowitsch $ PETSC_STREAM_GLOBAL_NONBLOCKING - Stream is truly asynchronous, and is blocked by nothing, not even the NULL stream. 156030f984aSJacob Faibussowitsch $ PETSC_STREAM_MAX - Always 1 greater than the largest PetscStreamType, do not use 157030f984aSJacob Faibussowitsch 158030f984aSJacob Faibussowitsch Level: intermediate 159030f984aSJacob Faibussowitsch 160db781477SPatrick Sanan .seealso: `PetscDeviceContextSetStreamType()`, `PetscDeviceContextGetStreamType()` 161030f984aSJacob Faibussowitsch E*/ 162030f984aSJacob Faibussowitsch typedef enum { 163a4af0ceeSJacob Faibussowitsch PETSC_STREAM_GLOBAL_BLOCKING, 164a4af0ceeSJacob Faibussowitsch PETSC_STREAM_DEFAULT_BLOCKING, 165a4af0ceeSJacob Faibussowitsch PETSC_STREAM_GLOBAL_NONBLOCKING, 166a4af0ceeSJacob Faibussowitsch PETSC_STREAM_MAX 167030f984aSJacob Faibussowitsch } PetscStreamType; 168030f984aSJacob Faibussowitsch PETSC_EXTERN const char *const PetscStreamTypes[]; 169030f984aSJacob Faibussowitsch 170030f984aSJacob Faibussowitsch /*E 171030f984aSJacob Faibussowitsch PetscDeviceContextJoinMode - Describes the type of join operation to perform in PetscDeviceContextJoin() 172030f984aSJacob Faibussowitsch 1735d84059aSJacob Faibussowitsch $ PETSC_DEVICE_CONTEXT_JOIN_DESTROY - Destroy all incoming sub-contexts after join. 1745d84059aSJacob Faibussowitsch $ PETSC_DEVICE_CONTEXT_JOIN_SYNC - Synchronize incoming sub-contexts after join. 1755d84059aSJacob Faibussowitsch $ PETSC_DEVICE_CONTEXT_JOIN_NO_SYNC - Do not synchronize incoming sub-contexts after join. 176030f984aSJacob Faibussowitsch 177030f984aSJacob Faibussowitsch Level: beginner 178030f984aSJacob Faibussowitsch 179db781477SPatrick Sanan .seealso: `PetscDeviceContext`, `PetscDeviceContextFork()`, `PetscDeviceContextJoin()` 180030f984aSJacob Faibussowitsch E*/ 181030f984aSJacob Faibussowitsch typedef enum { 182030f984aSJacob Faibussowitsch PETSC_DEVICE_CONTEXT_JOIN_DESTROY, 183030f984aSJacob Faibussowitsch PETSC_DEVICE_CONTEXT_JOIN_SYNC, 184030f984aSJacob Faibussowitsch PETSC_DEVICE_CONTEXT_JOIN_NO_SYNC 185030f984aSJacob Faibussowitsch } PetscDeviceContextJoinMode; 186030f984aSJacob Faibussowitsch PETSC_EXTERN const char *const PetscDeviceContextJoinModes[]; 187030f984aSJacob Faibussowitsch 188030f984aSJacob Faibussowitsch /*S 189030f984aSJacob Faibussowitsch PetscDeviceContext - Container to manage stream dependencies and the various solver handles for asynchronous device compute. 190030f984aSJacob Faibussowitsch 191030f984aSJacob Faibussowitsch Level: beginner 192030f984aSJacob Faibussowitsch 193db781477SPatrick Sanan .seealso: `PetscDevice`, `PetscDeviceContextCreate()`, `PetscDeviceContextSetDevice()`, `PetscDeviceContextDestroy()`, 194db781477SPatrick Sanan `PetscDeviceContextFork()`, `PetscDeviceContextJoin()` 195030f984aSJacob Faibussowitsch S*/ 196030f984aSJacob Faibussowitsch typedef struct _n_PetscDeviceContext *PetscDeviceContext; 197030f984aSJacob Faibussowitsch #endif /* PETSCDEVICETYPES_H */ 198