1*030f984aSJacob Faibussowitsch #if !defined(PETSCDEVICETYPES_H) 2*030f984aSJacob Faibussowitsch #define PETSCDEVICETYPES_H 3*030f984aSJacob Faibussowitsch 4*030f984aSJacob Faibussowitsch #include <petscsys.h> /* for PETSC_HAVE_CUDA/HIP/KOKKOS etc */ 5*030f984aSJacob Faibussowitsch 6*030f984aSJacob Faibussowitsch /*E 7*030f984aSJacob Faibussowitsch PetscMemType - Memory type of a pointer 8*030f984aSJacob Faibussowitsch 9*030f984aSJacob Faibussowitsch Level: beginner 10*030f984aSJacob Faibussowitsch 11*030f984aSJacob Faibussowitsch Developer Note: 12*030f984aSJacob Faibussowitsch Encoding of the bitmask in binary: xxxxyyyz 13*030f984aSJacob Faibussowitsch z = 0: Host memory 14*030f984aSJacob Faibussowitsch z = 1: Device memory 15*030f984aSJacob Faibussowitsch yyy = 000: CUDA-related memory 16*030f984aSJacob Faibussowitsch yyy = 001: HIP-related memory 17*030f984aSJacob Faibussowitsch xxxxyyy1 = 0000,0001: CUDA memory 18*030f984aSJacob Faibussowitsch xxxxyyy1 = 0001,0001: CUDA NVSHMEM memory 19*030f984aSJacob Faibussowitsch xxxxyyy1 = 0000,0011: HIP memory 20*030f984aSJacob Faibussowitsch 21*030f984aSJacob Faibussowitsch Other types of memory, e.g., CUDA managed memory, can be added when needed. 22*030f984aSJacob Faibussowitsch 23*030f984aSJacob Faibussowitsch .seealso: VecGetArrayAndMemType(), PetscSFBcastWithMemTypeBegin(), PetscSFReduceWithMemTypeBegin() 24*030f984aSJacob Faibussowitsch E*/ 25*030f984aSJacob Faibussowitsch typedef enum {PETSC_MEMTYPE_HOST=0, PETSC_MEMTYPE_DEVICE=0x01, PETSC_MEMTYPE_CUDA=0x01, PETSC_MEMTYPE_NVSHMEM=0x11,PETSC_MEMTYPE_HIP=0x03} PetscMemType; 26*030f984aSJacob Faibussowitsch 27*030f984aSJacob Faibussowitsch #define PetscMemTypeHost(m) (((m) & 0x1) == PETSC_MEMTYPE_HOST) 28*030f984aSJacob Faibussowitsch #define PetscMemTypeDevice(m) (((m) & 0x1) == PETSC_MEMTYPE_DEVICE) 29*030f984aSJacob Faibussowitsch #define PetscMemTypeCUDA(m) (((m) & 0xF) == PETSC_MEMTYPE_CUDA) 30*030f984aSJacob Faibussowitsch #define PetscMemTypeHIP(m) (((m) & 0xF) == PETSC_MEMTYPE_HIP) 31*030f984aSJacob Faibussowitsch #define PetscMemTypeNVSHMEM(m) ((m) == PETSC_MEMTYPE_NVSHMEM) 32*030f984aSJacob Faibussowitsch 33*030f984aSJacob Faibussowitsch /*E 34*030f984aSJacob Faibussowitsch PetscOffloadMask - indicates which memory (CPU, GPU, or none) contains valid data 35*030f984aSJacob Faibussowitsch 36*030f984aSJacob Faibussowitsch PETSC_OFFLOAD_UNALLOCATED - no memory contains valid matrix entries; NEVER used for vectors 37*030f984aSJacob Faibussowitsch PETSC_OFFLOAD_GPU - GPU has valid vector/matrix entries 38*030f984aSJacob Faibussowitsch PETSC_OFFLOAD_CPU - CPU has valid vector/matrix entries 39*030f984aSJacob Faibussowitsch PETSC_OFFLOAD_BOTH - Both GPU and CPU have valid vector/matrix entries and they match 40*030f984aSJacob Faibussowitsch PETSC_OFFLOAD_VECKOKKOS - Reserved for Vec_Kokkos. The offload is managed by Kokkos, thus this flag is not used in Vec_Kokkos. 41*030f984aSJacob Faibussowitsch 42*030f984aSJacob Faibussowitsch Level: developer 43*030f984aSJacob Faibussowitsch E*/ 44*030f984aSJacob Faibussowitsch typedef enum {PETSC_OFFLOAD_UNALLOCATED=0x0,PETSC_OFFLOAD_CPU=0x1,PETSC_OFFLOAD_GPU=0x2,PETSC_OFFLOAD_BOTH=0x3,PETSC_OFFLOAD_VECKOKKOS=0x100} PetscOffloadMask; 45*030f984aSJacob Faibussowitsch 46*030f984aSJacob Faibussowitsch /*E 47*030f984aSJacob Faibussowitsch PetscDeviceKind - Kind of accelerator device backend 48*030f984aSJacob Faibussowitsch 49*030f984aSJacob Faibussowitsch $ PETSC_DEVICE_INVALID - Invalid type, do not use 50*030f984aSJacob Faibussowitsch $ PETSC_DEVICE_CUDA - CUDA enabled GPU 51*030f984aSJacob Faibussowitsch $ PETSC_DEVICE_HIP - ROCM/HIP enabled GPU 52*030f984aSJacob Faibussowitsch $ PETSC_DEVICE_DEFAULT - Automatically select backend based on availability 53*030f984aSJacob Faibussowitsch $ PETSC_DEVICE_MAX - Always 1 greater than the largest valid PetscDeviceKInd, invalid type, do not use 54*030f984aSJacob Faibussowitsch 55*030f984aSJacob Faibussowitsch Notes: 56*030f984aSJacob Faibussowitsch PETSC_DEVICE_DEFAULT is selected in the following order: PETSC_DEVICE_HIP, PETSC_DEVICE_CUDA, PETSC_DEVICE_INVALID. 57*030f984aSJacob Faibussowitsch 58*030f984aSJacob Faibussowitsch Level: beginner 59*030f984aSJacob Faibussowitsch 60*030f984aSJacob Faibussowitsch .seealso: PetscDevice, PetscDeviceGetDevice() 61*030f984aSJacob Faibussowitsch E*/ 62*030f984aSJacob Faibussowitsch typedef enum { 63*030f984aSJacob Faibussowitsch PETSC_DEVICE_INVALID = 0, 64*030f984aSJacob Faibussowitsch PETSC_DEVICE_CUDA = 1, 65*030f984aSJacob Faibussowitsch PETSC_DEVICE_HIP = 2, 66*030f984aSJacob Faibussowitsch #if PetscDefined(HAVE_HIP) 67*030f984aSJacob Faibussowitsch PETSC_DEVICE_DEFAULT = PETSC_DEVICE_HIP, 68*030f984aSJacob Faibussowitsch #elif PetscDefined(HAVE_CUDA) 69*030f984aSJacob Faibussowitsch PETSC_DEVICE_DEFAULT = PETSC_DEVICE_CUDA, 70*030f984aSJacob Faibussowitsch #else 71*030f984aSJacob Faibussowitsch PETSC_DEVICE_DEFAULT = PETSC_DEVICE_INVALID, 72*030f984aSJacob Faibussowitsch #endif 73*030f984aSJacob Faibussowitsch PETSC_DEVICE_MAX = 3 74*030f984aSJacob Faibussowitsch } PetscDeviceKind; 75*030f984aSJacob Faibussowitsch PETSC_EXTERN const char *const PetscDeviceKinds[]; 76*030f984aSJacob Faibussowitsch 77*030f984aSJacob Faibussowitsch /*S 78*030f984aSJacob Faibussowitsch PetscDevice - Handle to an accelerator "device" (usually a GPU) 79*030f984aSJacob Faibussowitsch 80*030f984aSJacob Faibussowitsch Notes: 81*030f984aSJacob Faibussowitsch This object is used to house configuration and state of a device, but does not offer any ability to interact with or 82*030f984aSJacob Faibussowitsch drive device computation. This functionality is facilitated instead by the PetscDeviceContext object. 83*030f984aSJacob Faibussowitsch 84*030f984aSJacob Faibussowitsch Level: beginner 85*030f984aSJacob Faibussowitsch 86*030f984aSJacob Faibussowitsch .seealso: PetscDeviceKind, PetscDeviceGetDevice(), PetscDeviceDestroy(), PetscDeviceDestroy(), PetscDeviceContext, PetscDeviceContextSetDevice() 87*030f984aSJacob Faibussowitsch S*/ 88*030f984aSJacob Faibussowitsch typedef struct _n_PetscDevice *PetscDevice; 89*030f984aSJacob Faibussowitsch 90*030f984aSJacob Faibussowitsch /*E 91*030f984aSJacob Faibussowitsch PetscStreamType - Stream blocking mode, indicates how a stream implementation will interact with the default "NULL" 92*030f984aSJacob Faibussowitsch stream, which is usually blocking. 93*030f984aSJacob Faibussowitsch 94*030f984aSJacob 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. 95*030f984aSJacob Faibussowitsch $ PETSC_STREAM_DEFAULT_BLOCKING - Stream will act independent of other streams, but will still be blocked by actions on the NULL stream. 96*030f984aSJacob Faibussowitsch $ PETSC_STREAM_GLOBAL_NONBLOCKING - Stream is truly asynchronous, and is blocked by nothing, not even the NULL stream. 97*030f984aSJacob Faibussowitsch $ PETSC_STREAM_MAX - Always 1 greater than the largest PetscStreamType, do not use 98*030f984aSJacob Faibussowitsch 99*030f984aSJacob Faibussowitsch Level: intermediate 100*030f984aSJacob Faibussowitsch 101*030f984aSJacob Faibussowitsch .seealso: PetscDeviceContextSetStreamType(), PetscDeviceContextGetStreamType() 102*030f984aSJacob Faibussowitsch E*/ 103*030f984aSJacob Faibussowitsch typedef enum { 104*030f984aSJacob Faibussowitsch PETSC_STREAM_GLOBAL_BLOCKING = 0, 105*030f984aSJacob Faibussowitsch PETSC_STREAM_DEFAULT_BLOCKING = 1, 106*030f984aSJacob Faibussowitsch PETSC_STREAM_GLOBAL_NONBLOCKING = 2, 107*030f984aSJacob Faibussowitsch PETSC_STREAM_MAX = 3 108*030f984aSJacob Faibussowitsch } PetscStreamType; 109*030f984aSJacob Faibussowitsch PETSC_EXTERN const char *const PetscStreamTypes[]; 110*030f984aSJacob Faibussowitsch 111*030f984aSJacob Faibussowitsch /*E 112*030f984aSJacob Faibussowitsch PetscDeviceContextJoinMode - Describes the type of join operation to perform in PetscDeviceContextJoin() 113*030f984aSJacob Faibussowitsch 114*030f984aSJacob Faibussowitsch $ PETSC_DEVICE_CONTEXT_DESTROY - Destroy all incoming sub-contexts after join. 115*030f984aSJacob Faibussowitsch $ PETSC_CONTEXT_JOIN_SYNC - Synchronize incoming sub-contexts after join. 116*030f984aSJacob Faibussowitsch $ PETSC_CONTEXT_JOIN_NO_SYNC - Do not synchronize incoming sub-contexts after join. 117*030f984aSJacob Faibussowitsch 118*030f984aSJacob Faibussowitsch Level: beginner 119*030f984aSJacob Faibussowitsch 120*030f984aSJacob Faibussowitsch .seealso: PetscDeviceContextFork(), PetscDeviceContextJoin() 121*030f984aSJacob Faibussowitsch E*/ 122*030f984aSJacob Faibussowitsch typedef enum { 123*030f984aSJacob Faibussowitsch PETSC_DEVICE_CONTEXT_JOIN_DESTROY, 124*030f984aSJacob Faibussowitsch PETSC_DEVICE_CONTEXT_JOIN_SYNC, 125*030f984aSJacob Faibussowitsch PETSC_DEVICE_CONTEXT_JOIN_NO_SYNC 126*030f984aSJacob Faibussowitsch } PetscDeviceContextJoinMode; 127*030f984aSJacob Faibussowitsch PETSC_EXTERN const char *const PetscDeviceContextJoinModes[]; 128*030f984aSJacob Faibussowitsch 129*030f984aSJacob Faibussowitsch /*S 130*030f984aSJacob Faibussowitsch PetscDeviceContext - Container to manage stream dependencies and the various solver handles for asynchronous device compute. 131*030f984aSJacob Faibussowitsch 132*030f984aSJacob Faibussowitsch Level: beginner 133*030f984aSJacob Faibussowitsch 134*030f984aSJacob Faibussowitsch .seealso: PetscDevice, PetscDeviceContextCreate(), PetscDeviceContextSetDevice(), PetscDeviceContextDestroy(), 135*030f984aSJacob Faibussowitsch PetscDeviceContextFork(), PetscDeviceContextJoin() 136*030f984aSJacob Faibussowitsch S*/ 137*030f984aSJacob Faibussowitsch typedef struct _n_PetscDeviceContext *PetscDeviceContext; 138*030f984aSJacob Faibussowitsch #endif /* PETSCDEVICETYPES_H */ 139