xref: /petsc/include/petscdevicetypes.h (revision 3214990d875dc1a3b02e51c216d765bae6da68a9)
107e4ef11SJacob Faibussowitsch #ifndef 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
17a2158755SJunchao Zhang $ yyy = 010            - SYCL-related memory
18fe0d65a2SJacob Faibussowitsch $ xxxxyyy1 = 0000,0001 - CUDA memory
19fe0d65a2SJacob Faibussowitsch $ xxxxyyy1 = 0001,0001 - CUDA NVSHMEM memory
20fe0d65a2SJacob Faibussowitsch $ xxxxyyy1 = 0000,0011 - HIP memory
21a2158755SJunchao Zhang $ xxxxyyy1 = 0000,0101 - SYCL memory
22030f984aSJacob Faibussowitsch 
23030f984aSJacob Faibussowitsch   Other types of memory, e.g., CUDA managed memory, can be added when needed.
24030f984aSJacob Faibussowitsch 
25fe0d65a2SJacob Faibussowitsch   Level: beginner
26fe0d65a2SJacob Faibussowitsch 
27*3214990dSStefano Zampini   Notes:
28*3214990dSStefano Zampini   PETSC_MEMTYPE_KOKKOS depends on the KOKKOS backend configuration
29*3214990dSStefano Zampini 
30030f984aSJacob Faibussowitsch .seealso: VecGetArrayAndMemType(), PetscSFBcastWithMemTypeBegin(), PetscSFReduceWithMemTypeBegin()
31030f984aSJacob Faibussowitsch E*/
32fe0d65a2SJacob Faibussowitsch typedef enum {
33fe0d65a2SJacob Faibussowitsch   PETSC_MEMTYPE_HOST    = 0,
34fe0d65a2SJacob Faibussowitsch   PETSC_MEMTYPE_DEVICE  = 0x01,
35fe0d65a2SJacob Faibussowitsch   PETSC_MEMTYPE_CUDA    = 0x01,
36fe0d65a2SJacob Faibussowitsch   PETSC_MEMTYPE_NVSHMEM = 0x11,
37a2158755SJunchao Zhang   PETSC_MEMTYPE_HIP     = 0x03,
38*3214990dSStefano Zampini   PETSC_MEMTYPE_SYCL    = 0x05,
39*3214990dSStefano Zampini #if PetscDefined(HAVE_CUDA)
40*3214990dSStefano Zampini   PETSC_MEMTYPE_KOKKOS  = PETSC_MEMTYPE_CUDA
41*3214990dSStefano Zampini #elif PetscDefined(HAVE_HIP)
42*3214990dSStefano Zampini   PETSC_MEMTYPE_KOKKOS  = PETSC_MEMTYPE_HIP
43*3214990dSStefano Zampini #elif PetscDefined(HAVE_SYCL)
44*3214990dSStefano Zampini   PETSC_MEMTYPE_KOKKOS  = PETSC_MEMTYPE_SYCL
45*3214990dSStefano Zampini #else
46*3214990dSStefano Zampini   PETSC_MEMTYPE_KOKKOS  = PETSC_MEMTYPE_HOST
47*3214990dSStefano Zampini #endif
48fe0d65a2SJacob Faibussowitsch } PetscMemType;
49030f984aSJacob Faibussowitsch 
50030f984aSJacob Faibussowitsch #define PetscMemTypeHost(m)    (((m) & 0x1) == PETSC_MEMTYPE_HOST)
51030f984aSJacob Faibussowitsch #define PetscMemTypeDevice(m)  (((m) & 0x1) == PETSC_MEMTYPE_DEVICE)
52030f984aSJacob Faibussowitsch #define PetscMemTypeCUDA(m)    (((m) & 0xF) == PETSC_MEMTYPE_CUDA)
53030f984aSJacob Faibussowitsch #define PetscMemTypeHIP(m)     (((m) & 0xF) == PETSC_MEMTYPE_HIP)
54a2158755SJunchao Zhang #define PetscMemTypeSYCL(m)    (((m) & 0xF) == PETSC_MEMTYPE_SYCL)
55030f984aSJacob Faibussowitsch #define PetscMemTypeNVSHMEM(m) ((m) == PETSC_MEMTYPE_NVSHMEM)
56030f984aSJacob Faibussowitsch 
575b5f62f7SJacob Faibussowitsch #define PETSC_OFFLOAD_VECKOKKOS_DEPRECATED PETSC_OFFLOAD_VECKOKKOS PETSC_DEPRECATED_ENUM("Use PETSC_OFFLOAD_KOKKOS (since version 3.17.0)")
58030f984aSJacob Faibussowitsch /*E
59030f984aSJacob Faibussowitsch   PetscOffloadMask - indicates which memory (CPU, GPU, or none) contains valid data
60030f984aSJacob Faibussowitsch 
61fe0d65a2SJacob Faibussowitsch $ PETSC_OFFLOAD_UNALLOCATED - no memory contains valid matrix entries; NEVER used for vectors
62fe0d65a2SJacob Faibussowitsch $ PETSC_OFFLOAD_GPU         - GPU has valid vector/matrix entries
63fe0d65a2SJacob Faibussowitsch $ PETSC_OFFLOAD_CPU         - CPU has valid vector/matrix entries
64fe0d65a2SJacob Faibussowitsch $ PETSC_OFFLOAD_BOTH        - Both GPU and CPU have valid vector/matrix entries and they match
65ae76731bSJunchao 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.
66030f984aSJacob Faibussowitsch 
67030f984aSJacob Faibussowitsch   Level: developer
68030f984aSJacob Faibussowitsch E*/
69fe0d65a2SJacob Faibussowitsch typedef enum {
70fe0d65a2SJacob Faibussowitsch   PETSC_OFFLOAD_UNALLOCATED = 0x0,
71fe0d65a2SJacob Faibussowitsch   PETSC_OFFLOAD_CPU         = 0x1,
72fe0d65a2SJacob Faibussowitsch   PETSC_OFFLOAD_GPU         = 0x2,
73fe0d65a2SJacob Faibussowitsch   PETSC_OFFLOAD_BOTH        = 0x3,
74d795ed5eSJunchao Zhang   PETSC_OFFLOAD_VECKOKKOS_DEPRECATED = 0x100,
75ae76731bSJunchao Zhang   PETSC_OFFLOAD_KOKKOS      = 0x100
76fe0d65a2SJacob Faibussowitsch } PetscOffloadMask;
77030f984aSJacob Faibussowitsch 
78030f984aSJacob Faibussowitsch /*E
79a4af0ceeSJacob Faibussowitsch   PetscDeviceInitType - Initialization strategy for PetscDevice
80a4af0ceeSJacob Faibussowitsch 
81a4af0ceeSJacob Faibussowitsch $ PETSC_DEVICE_INIT_NONE  - PetscDevice is never initialized
82a4af0ceeSJacob Faibussowitsch $ PETSC_DEVICE_INIT_LAZY  - PetscDevice is initialized on demand
83a4af0ceeSJacob Faibussowitsch $ PETSC_DEVICE_INIT_EAGER - PetscDevice is initialized as soon as possible
84a4af0ceeSJacob Faibussowitsch 
85a4af0ceeSJacob Faibussowitsch   Notes:
86a4af0ceeSJacob Faibussowitsch   PETSC_DEVICE_INIT_NONE implies that any initialization of PetscDevice is disallowed and
87a4af0ceeSJacob Faibussowitsch   doing so results in an error. Useful to ensure that no accelerator is used in a program.
88a4af0ceeSJacob Faibussowitsch 
89a4af0ceeSJacob Faibussowitsch   Level: beginner
90a4af0ceeSJacob Faibussowitsch 
91a4af0ceeSJacob Faibussowitsch .seealso: PetscDevice, PetscDeviceType, PetscDeviceInitialize(), PetscDeviceInitialized(), PetscDeviceCreate()
92a4af0ceeSJacob Faibussowitsch E*/
93a4af0ceeSJacob Faibussowitsch typedef enum {
94a4af0ceeSJacob Faibussowitsch   PETSC_DEVICE_INIT_NONE,
95a4af0ceeSJacob Faibussowitsch   PETSC_DEVICE_INIT_LAZY,
96a4af0ceeSJacob Faibussowitsch   PETSC_DEVICE_INIT_EAGER
97a4af0ceeSJacob Faibussowitsch } PetscDeviceInitType;
98a4af0ceeSJacob Faibussowitsch PETSC_EXTERN const char *const PetscDeviceInitTypes[];
99a4af0ceeSJacob Faibussowitsch 
100a4af0ceeSJacob Faibussowitsch /*E
101a4af0ceeSJacob Faibussowitsch   PetscDeviceType - Kind of accelerator device backend
102030f984aSJacob Faibussowitsch 
103030f984aSJacob Faibussowitsch $ PETSC_DEVICE_INVALID - Invalid type, do not use
104030f984aSJacob Faibussowitsch $ PETSC_DEVICE_CUDA    - CUDA enabled GPU
105030f984aSJacob Faibussowitsch $ PETSC_DEVICE_HIP     - ROCM/HIP enabled GPU
106a2158755SJunchao Zhang $ PETSC_DEVICE_SYCL    - SYCL enabled device
107030f984aSJacob Faibussowitsch $ PETSC_DEVICE_DEFAULT - Automatically select backend based on availability
108a4af0ceeSJacob Faibussowitsch $ PETSC_DEVICE_MAX     - Always 1 greater than the largest valid PetscDeviceType, invalid type, do not use
109030f984aSJacob Faibussowitsch 
110030f984aSJacob Faibussowitsch   Notes:
111a2158755SJunchao Zhang   PETSC_DEVICE_DEFAULT is selected in the following order: PETSC_DEVICE_HIP, PETSC_DEVICE_CUDA, PETSC_DEVICE_SYCL, PETSC_DEVICE_INVALID.
112030f984aSJacob Faibussowitsch 
113030f984aSJacob Faibussowitsch   Level: beginner
114030f984aSJacob Faibussowitsch 
115a4af0ceeSJacob Faibussowitsch .seealso: PetscDevice, PetscDeviceInitType, PetscDeviceCreate()
116030f984aSJacob Faibussowitsch E*/
117030f984aSJacob Faibussowitsch typedef enum {
118a4af0ceeSJacob Faibussowitsch   PETSC_DEVICE_INVALID,
119a4af0ceeSJacob Faibussowitsch   PETSC_DEVICE_CUDA,
120a4af0ceeSJacob Faibussowitsch   PETSC_DEVICE_HIP,
121a2158755SJunchao Zhang   PETSC_DEVICE_SYCL,
122a4af0ceeSJacob Faibussowitsch   PETSC_DEVICE_MAX
123a4af0ceeSJacob Faibussowitsch } PetscDeviceType;
124a4af0ceeSJacob Faibussowitsch PETSC_EXTERN const char *const PetscDeviceTypes[];
12507e4ef11SJacob Faibussowitsch #if defined(PETSC_HAVE_HIP)
1265181c4f9SJacob Faibussowitsch #  define PETSC_DEVICE_DEFAULT PETSC_DEVICE_HIP
12707e4ef11SJacob Faibussowitsch #elif defined(PETSC_HAVE_CUDA)
1285181c4f9SJacob Faibussowitsch #  define PETSC_DEVICE_DEFAULT PETSC_DEVICE_CUDA
129a2158755SJunchao Zhang #elif PetscDefined(HAVE_SYCL)
130a2158755SJunchao Zhang #  define PETSC_DEVICE_DEFAULT PETSC_DEVICE_SYCL
1315181c4f9SJacob Faibussowitsch #else
1325181c4f9SJacob Faibussowitsch #  define PETSC_DEVICE_DEFAULT PETSC_DEVICE_INVALID
1335181c4f9SJacob Faibussowitsch #endif
134030f984aSJacob Faibussowitsch 
135030f984aSJacob Faibussowitsch /*S
136030f984aSJacob Faibussowitsch   PetscDevice - Handle to an accelerator "device" (usually a GPU)
137030f984aSJacob Faibussowitsch 
138030f984aSJacob Faibussowitsch   Notes:
139030f984aSJacob Faibussowitsch   This object is used to house configuration and state of a device, but does not offer any ability to interact with or
140030f984aSJacob Faibussowitsch   drive device computation. This functionality is facilitated instead by the PetscDeviceContext object.
141030f984aSJacob Faibussowitsch 
142030f984aSJacob Faibussowitsch   Level: beginner
143030f984aSJacob Faibussowitsch 
144a4af0ceeSJacob Faibussowitsch .seealso: PetscDeviceType, PetscDeviceInitType, PetscDeviceCreate(), PetscDeviceConfigure(), PetscDeviceDestroy(), PetscDeviceContext, PetscDeviceContextSetDevice(), PetscDeviceContextGetDevice()
145030f984aSJacob Faibussowitsch S*/
146030f984aSJacob Faibussowitsch typedef struct _n_PetscDevice *PetscDevice;
147030f984aSJacob Faibussowitsch 
148030f984aSJacob Faibussowitsch /*E
149030f984aSJacob Faibussowitsch   PetscStreamType - Stream blocking mode, indicates how a stream implementation will interact with the default "NULL"
150030f984aSJacob Faibussowitsch   stream, which is usually blocking.
151030f984aSJacob Faibussowitsch 
152030f984aSJacob 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.
153030f984aSJacob Faibussowitsch $ PETSC_STREAM_DEFAULT_BLOCKING   - Stream will act independent of other streams, but will still be blocked by actions on the NULL stream.
154030f984aSJacob Faibussowitsch $ PETSC_STREAM_GLOBAL_NONBLOCKING - Stream is truly asynchronous, and is blocked by nothing, not even the NULL stream.
155030f984aSJacob Faibussowitsch $ PETSC_STREAM_MAX                - Always 1 greater than the largest PetscStreamType, do not use
156030f984aSJacob Faibussowitsch 
157030f984aSJacob Faibussowitsch   Level: intermediate
158030f984aSJacob Faibussowitsch 
159030f984aSJacob Faibussowitsch .seealso: PetscDeviceContextSetStreamType(), PetscDeviceContextGetStreamType()
160030f984aSJacob Faibussowitsch E*/
161030f984aSJacob Faibussowitsch typedef enum {
162a4af0ceeSJacob Faibussowitsch   PETSC_STREAM_GLOBAL_BLOCKING,
163a4af0ceeSJacob Faibussowitsch   PETSC_STREAM_DEFAULT_BLOCKING,
164a4af0ceeSJacob Faibussowitsch   PETSC_STREAM_GLOBAL_NONBLOCKING,
165a4af0ceeSJacob Faibussowitsch   PETSC_STREAM_MAX
166030f984aSJacob Faibussowitsch } PetscStreamType;
167030f984aSJacob Faibussowitsch PETSC_EXTERN const char *const PetscStreamTypes[];
168030f984aSJacob Faibussowitsch 
169030f984aSJacob Faibussowitsch /*E
170030f984aSJacob Faibussowitsch   PetscDeviceContextJoinMode - Describes the type of join operation to perform in PetscDeviceContextJoin()
171030f984aSJacob Faibussowitsch 
172030f984aSJacob Faibussowitsch $ PETSC_DEVICE_CONTEXT_DESTROY - Destroy all incoming sub-contexts after join.
173030f984aSJacob Faibussowitsch $ PETSC_CONTEXT_JOIN_SYNC      - Synchronize incoming sub-contexts after join.
174030f984aSJacob Faibussowitsch $ PETSC_CONTEXT_JOIN_NO_SYNC   - Do not synchronize incoming sub-contexts after join.
175030f984aSJacob Faibussowitsch 
176030f984aSJacob Faibussowitsch   Level: beginner
177030f984aSJacob Faibussowitsch 
178a4af0ceeSJacob Faibussowitsch .seealso: PetscDeviceContext, PetscDeviceContextFork(), PetscDeviceContextJoin()
179030f984aSJacob Faibussowitsch E*/
180030f984aSJacob Faibussowitsch typedef enum {
181030f984aSJacob Faibussowitsch   PETSC_DEVICE_CONTEXT_JOIN_DESTROY,
182030f984aSJacob Faibussowitsch   PETSC_DEVICE_CONTEXT_JOIN_SYNC,
183030f984aSJacob Faibussowitsch   PETSC_DEVICE_CONTEXT_JOIN_NO_SYNC
184030f984aSJacob Faibussowitsch } PetscDeviceContextJoinMode;
185030f984aSJacob Faibussowitsch PETSC_EXTERN const char *const PetscDeviceContextJoinModes[];
186030f984aSJacob Faibussowitsch 
187030f984aSJacob Faibussowitsch /*S
188030f984aSJacob Faibussowitsch   PetscDeviceContext - Container to manage stream dependencies and the various solver handles for asynchronous device compute.
189030f984aSJacob Faibussowitsch 
190030f984aSJacob Faibussowitsch   Level: beginner
191030f984aSJacob Faibussowitsch 
192030f984aSJacob Faibussowitsch .seealso: PetscDevice, PetscDeviceContextCreate(), PetscDeviceContextSetDevice(), PetscDeviceContextDestroy(),
193030f984aSJacob Faibussowitsch PetscDeviceContextFork(), PetscDeviceContextJoin()
194030f984aSJacob Faibussowitsch S*/
195030f984aSJacob Faibussowitsch typedef struct _n_PetscDeviceContext *PetscDeviceContext;
196030f984aSJacob Faibussowitsch #endif /* PETSCDEVICETYPES_H */
197