xref: /petsc/include/petscdevicetypes.h (revision 030f984af8d8bb4c203755d35bded3c05b3d83ce)
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