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