1030f984aSJacob Faibussowitsch #if !defined(PETSCDEVICETYPES_H) 2030f984aSJacob Faibussowitsch #define PETSCDEVICETYPES_H 3030f984aSJacob Faibussowitsch 4030f984aSJacob Faibussowitsch #include <petscsys.h> /* for PETSC_HAVE_CUDA/HIP/KOKKOS etc */ 5030f984aSJacob Faibussowitsch 6030f984aSJacob Faibussowitsch /*E 7030f984aSJacob Faibussowitsch PetscMemType - Memory type of a pointer 8030f984aSJacob Faibussowitsch 9030f984aSJacob Faibussowitsch Level: beginner 10030f984aSJacob Faibussowitsch 11030f984aSJacob Faibussowitsch Developer Note: 12030f984aSJacob Faibussowitsch Encoding of the bitmask in binary: xxxxyyyz 13030f984aSJacob Faibussowitsch z = 0: Host memory 14030f984aSJacob Faibussowitsch z = 1: Device memory 15030f984aSJacob Faibussowitsch yyy = 000: CUDA-related memory 16030f984aSJacob Faibussowitsch yyy = 001: HIP-related memory 17030f984aSJacob Faibussowitsch xxxxyyy1 = 0000,0001: CUDA memory 18030f984aSJacob Faibussowitsch xxxxyyy1 = 0001,0001: CUDA NVSHMEM memory 19030f984aSJacob 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 23030f984aSJacob Faibussowitsch .seealso: VecGetArrayAndMemType(), PetscSFBcastWithMemTypeBegin(), PetscSFReduceWithMemTypeBegin() 24030f984aSJacob Faibussowitsch E*/ 25030f984aSJacob Faibussowitsch typedef enum {PETSC_MEMTYPE_HOST=0, PETSC_MEMTYPE_DEVICE=0x01, PETSC_MEMTYPE_CUDA=0x01, PETSC_MEMTYPE_NVSHMEM=0x11,PETSC_MEMTYPE_HIP=0x03} PetscMemType; 26030f984aSJacob Faibussowitsch 27030f984aSJacob Faibussowitsch #define PetscMemTypeHost(m) (((m) & 0x1) == PETSC_MEMTYPE_HOST) 28030f984aSJacob Faibussowitsch #define PetscMemTypeDevice(m) (((m) & 0x1) == PETSC_MEMTYPE_DEVICE) 29030f984aSJacob Faibussowitsch #define PetscMemTypeCUDA(m) (((m) & 0xF) == PETSC_MEMTYPE_CUDA) 30030f984aSJacob Faibussowitsch #define PetscMemTypeHIP(m) (((m) & 0xF) == PETSC_MEMTYPE_HIP) 31030f984aSJacob Faibussowitsch #define PetscMemTypeNVSHMEM(m) ((m) == PETSC_MEMTYPE_NVSHMEM) 32030f984aSJacob Faibussowitsch 33030f984aSJacob Faibussowitsch /*E 34030f984aSJacob Faibussowitsch PetscOffloadMask - indicates which memory (CPU, GPU, or none) contains valid data 35030f984aSJacob Faibussowitsch 36030f984aSJacob Faibussowitsch PETSC_OFFLOAD_UNALLOCATED - no memory contains valid matrix entries; NEVER used for vectors 37030f984aSJacob Faibussowitsch PETSC_OFFLOAD_GPU - GPU has valid vector/matrix entries 38030f984aSJacob Faibussowitsch PETSC_OFFLOAD_CPU - CPU has valid vector/matrix entries 39030f984aSJacob Faibussowitsch PETSC_OFFLOAD_BOTH - Both GPU and CPU have valid vector/matrix entries and they match 40030f984aSJacob Faibussowitsch PETSC_OFFLOAD_VECKOKKOS - Reserved for Vec_Kokkos. The offload is managed by Kokkos, thus this flag is not used in Vec_Kokkos. 41030f984aSJacob Faibussowitsch 42030f984aSJacob Faibussowitsch Level: developer 43030f984aSJacob Faibussowitsch E*/ 44030f984aSJacob Faibussowitsch typedef enum {PETSC_OFFLOAD_UNALLOCATED=0x0,PETSC_OFFLOAD_CPU=0x1,PETSC_OFFLOAD_GPU=0x2,PETSC_OFFLOAD_BOTH=0x3,PETSC_OFFLOAD_VECKOKKOS=0x100} PetscOffloadMask; 45030f984aSJacob Faibussowitsch 46030f984aSJacob Faibussowitsch /*E 47030f984aSJacob Faibussowitsch PetscDeviceKind - Kind of accelerator device backend 48030f984aSJacob Faibussowitsch 49030f984aSJacob Faibussowitsch $ PETSC_DEVICE_INVALID - Invalid type, do not use 50030f984aSJacob Faibussowitsch $ PETSC_DEVICE_CUDA - CUDA enabled GPU 51030f984aSJacob Faibussowitsch $ PETSC_DEVICE_HIP - ROCM/HIP enabled GPU 52030f984aSJacob Faibussowitsch $ PETSC_DEVICE_DEFAULT - Automatically select backend based on availability 53030f984aSJacob Faibussowitsch $ PETSC_DEVICE_MAX - Always 1 greater than the largest valid PetscDeviceKInd, invalid type, do not use 54030f984aSJacob Faibussowitsch 55030f984aSJacob Faibussowitsch Notes: 56030f984aSJacob Faibussowitsch PETSC_DEVICE_DEFAULT is selected in the following order: PETSC_DEVICE_HIP, PETSC_DEVICE_CUDA, PETSC_DEVICE_INVALID. 57030f984aSJacob Faibussowitsch 58030f984aSJacob Faibussowitsch Level: beginner 59030f984aSJacob Faibussowitsch 60*5181c4f9SJacob Faibussowitsch .seealso: PetscDevice, PetscDeviceCreate() 61030f984aSJacob Faibussowitsch E*/ 62030f984aSJacob Faibussowitsch typedef enum { 63030f984aSJacob Faibussowitsch PETSC_DEVICE_INVALID = 0, 64030f984aSJacob Faibussowitsch PETSC_DEVICE_CUDA = 1, 65030f984aSJacob Faibussowitsch PETSC_DEVICE_HIP = 2, 66030f984aSJacob Faibussowitsch PETSC_DEVICE_MAX = 3 67030f984aSJacob Faibussowitsch } PetscDeviceKind; 68030f984aSJacob Faibussowitsch PETSC_EXTERN const char *const PetscDeviceKinds[]; 69*5181c4f9SJacob Faibussowitsch #if PetscDefined(HAVE_HIP) 70*5181c4f9SJacob Faibussowitsch # define PETSC_DEVICE_DEFAULT PETSC_DEVICE_HIP 71*5181c4f9SJacob Faibussowitsch #elif PetscDefined(HAVE_CUDA) 72*5181c4f9SJacob Faibussowitsch # define PETSC_DEVICE_DEFAULT PETSC_DEVICE_CUDA 73*5181c4f9SJacob Faibussowitsch #else 74*5181c4f9SJacob Faibussowitsch # define PETSC_DEVICE_DEFAULT PETSC_DEVICE_INVALID 75*5181c4f9SJacob Faibussowitsch #endif 76030f984aSJacob Faibussowitsch 77030f984aSJacob Faibussowitsch /*S 78030f984aSJacob Faibussowitsch PetscDevice - Handle to an accelerator "device" (usually a GPU) 79030f984aSJacob Faibussowitsch 80030f984aSJacob Faibussowitsch Notes: 81030f984aSJacob Faibussowitsch This object is used to house configuration and state of a device, but does not offer any ability to interact with or 82030f984aSJacob Faibussowitsch drive device computation. This functionality is facilitated instead by the PetscDeviceContext object. 83030f984aSJacob Faibussowitsch 84030f984aSJacob Faibussowitsch Level: beginner 85030f984aSJacob Faibussowitsch 86*5181c4f9SJacob Faibussowitsch .seealso: PetscDeviceKind, PetscDeviceCreate(), PetscDeviceConfigure(), PetscDeviceDestroy(), PetscDeviceContext, PetscDeviceContextSetDevice(), PetscDeviceContextGetDevice() 87030f984aSJacob Faibussowitsch S*/ 88030f984aSJacob Faibussowitsch typedef struct _n_PetscDevice *PetscDevice; 89030f984aSJacob Faibussowitsch 90030f984aSJacob Faibussowitsch /*E 91030f984aSJacob Faibussowitsch PetscStreamType - Stream blocking mode, indicates how a stream implementation will interact with the default "NULL" 92030f984aSJacob Faibussowitsch stream, which is usually blocking. 93030f984aSJacob Faibussowitsch 94030f984aSJacob 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. 95030f984aSJacob Faibussowitsch $ PETSC_STREAM_DEFAULT_BLOCKING - Stream will act independent of other streams, but will still be blocked by actions on the NULL stream. 96030f984aSJacob Faibussowitsch $ PETSC_STREAM_GLOBAL_NONBLOCKING - Stream is truly asynchronous, and is blocked by nothing, not even the NULL stream. 97030f984aSJacob Faibussowitsch $ PETSC_STREAM_MAX - Always 1 greater than the largest PetscStreamType, do not use 98030f984aSJacob Faibussowitsch 99030f984aSJacob Faibussowitsch Level: intermediate 100030f984aSJacob Faibussowitsch 101030f984aSJacob Faibussowitsch .seealso: PetscDeviceContextSetStreamType(), PetscDeviceContextGetStreamType() 102030f984aSJacob Faibussowitsch E*/ 103030f984aSJacob Faibussowitsch typedef enum { 104030f984aSJacob Faibussowitsch PETSC_STREAM_GLOBAL_BLOCKING = 0, 105030f984aSJacob Faibussowitsch PETSC_STREAM_DEFAULT_BLOCKING = 1, 106030f984aSJacob Faibussowitsch PETSC_STREAM_GLOBAL_NONBLOCKING = 2, 107030f984aSJacob Faibussowitsch PETSC_STREAM_MAX = 3 108030f984aSJacob Faibussowitsch } PetscStreamType; 109030f984aSJacob Faibussowitsch PETSC_EXTERN const char *const PetscStreamTypes[]; 110030f984aSJacob Faibussowitsch 111030f984aSJacob Faibussowitsch /*E 112030f984aSJacob Faibussowitsch PetscDeviceContextJoinMode - Describes the type of join operation to perform in PetscDeviceContextJoin() 113030f984aSJacob Faibussowitsch 114030f984aSJacob Faibussowitsch $ PETSC_DEVICE_CONTEXT_DESTROY - Destroy all incoming sub-contexts after join. 115030f984aSJacob Faibussowitsch $ PETSC_CONTEXT_JOIN_SYNC - Synchronize incoming sub-contexts after join. 116030f984aSJacob Faibussowitsch $ PETSC_CONTEXT_JOIN_NO_SYNC - Do not synchronize incoming sub-contexts after join. 117030f984aSJacob Faibussowitsch 118030f984aSJacob Faibussowitsch Level: beginner 119030f984aSJacob Faibussowitsch 120030f984aSJacob Faibussowitsch .seealso: PetscDeviceContextFork(), PetscDeviceContextJoin() 121030f984aSJacob Faibussowitsch E*/ 122030f984aSJacob Faibussowitsch typedef enum { 123030f984aSJacob Faibussowitsch PETSC_DEVICE_CONTEXT_JOIN_DESTROY, 124030f984aSJacob Faibussowitsch PETSC_DEVICE_CONTEXT_JOIN_SYNC, 125030f984aSJacob Faibussowitsch PETSC_DEVICE_CONTEXT_JOIN_NO_SYNC 126030f984aSJacob Faibussowitsch } PetscDeviceContextJoinMode; 127030f984aSJacob Faibussowitsch PETSC_EXTERN const char *const PetscDeviceContextJoinModes[]; 128030f984aSJacob Faibussowitsch 129030f984aSJacob Faibussowitsch /*S 130030f984aSJacob Faibussowitsch PetscDeviceContext - Container to manage stream dependencies and the various solver handles for asynchronous device compute. 131030f984aSJacob Faibussowitsch 132030f984aSJacob Faibussowitsch Level: beginner 133030f984aSJacob Faibussowitsch 134030f984aSJacob Faibussowitsch .seealso: PetscDevice, PetscDeviceContextCreate(), PetscDeviceContextSetDevice(), PetscDeviceContextDestroy(), 135030f984aSJacob Faibussowitsch PetscDeviceContextFork(), PetscDeviceContextJoin() 136030f984aSJacob Faibussowitsch S*/ 137030f984aSJacob Faibussowitsch typedef struct _n_PetscDeviceContext *PetscDeviceContext; 138030f984aSJacob Faibussowitsch #endif /* PETSCDEVICETYPES_H */ 139