xref: /petsc/include/petscdevicetypes.h (revision 07e4ef11009734ce1ace5c38974ff15d0b33dbb6)
1*07e4ef11SJacob 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 
27030f984aSJacob Faibussowitsch .seealso: VecGetArrayAndMemType(), PetscSFBcastWithMemTypeBegin(), PetscSFReduceWithMemTypeBegin()
28030f984aSJacob Faibussowitsch E*/
29fe0d65a2SJacob Faibussowitsch typedef enum {
30fe0d65a2SJacob Faibussowitsch   PETSC_MEMTYPE_HOST    = 0,
31fe0d65a2SJacob Faibussowitsch   PETSC_MEMTYPE_DEVICE  = 0x01,
32fe0d65a2SJacob Faibussowitsch   PETSC_MEMTYPE_CUDA    = 0x01,
33fe0d65a2SJacob Faibussowitsch   PETSC_MEMTYPE_NVSHMEM = 0x11,
34a2158755SJunchao Zhang   PETSC_MEMTYPE_HIP     = 0x03,
35a2158755SJunchao Zhang   PETSC_MEMTYPE_SYCL    = 0x05
36fe0d65a2SJacob Faibussowitsch } PetscMemType;
37030f984aSJacob Faibussowitsch 
38030f984aSJacob Faibussowitsch #define PetscMemTypeHost(m)    (((m) & 0x1) == PETSC_MEMTYPE_HOST)
39030f984aSJacob Faibussowitsch #define PetscMemTypeDevice(m)  (((m) & 0x1) == PETSC_MEMTYPE_DEVICE)
40030f984aSJacob Faibussowitsch #define PetscMemTypeCUDA(m)    (((m) & 0xF) == PETSC_MEMTYPE_CUDA)
41030f984aSJacob Faibussowitsch #define PetscMemTypeHIP(m)     (((m) & 0xF) == PETSC_MEMTYPE_HIP)
42a2158755SJunchao Zhang #define PetscMemTypeSYCL(m)    (((m) & 0xF) == PETSC_MEMTYPE_SYCL)
43030f984aSJacob Faibussowitsch #define PetscMemTypeNVSHMEM(m) ((m) == PETSC_MEMTYPE_NVSHMEM)
44030f984aSJacob Faibussowitsch 
455b5f62f7SJacob Faibussowitsch #define PETSC_OFFLOAD_VECKOKKOS_DEPRECATED PETSC_OFFLOAD_VECKOKKOS PETSC_DEPRECATED_ENUM("Use PETSC_OFFLOAD_KOKKOS (since version 3.17.0)")
46030f984aSJacob Faibussowitsch /*E
47030f984aSJacob Faibussowitsch   PetscOffloadMask - indicates which memory (CPU, GPU, or none) contains valid data
48030f984aSJacob Faibussowitsch 
49fe0d65a2SJacob Faibussowitsch $ PETSC_OFFLOAD_UNALLOCATED - no memory contains valid matrix entries; NEVER used for vectors
50fe0d65a2SJacob Faibussowitsch $ PETSC_OFFLOAD_GPU         - GPU has valid vector/matrix entries
51fe0d65a2SJacob Faibussowitsch $ PETSC_OFFLOAD_CPU         - CPU has valid vector/matrix entries
52fe0d65a2SJacob Faibussowitsch $ PETSC_OFFLOAD_BOTH        - Both GPU and CPU have valid vector/matrix entries and they match
53ae76731bSJunchao 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.
54030f984aSJacob Faibussowitsch 
55030f984aSJacob Faibussowitsch   Level: developer
56030f984aSJacob Faibussowitsch E*/
57fe0d65a2SJacob Faibussowitsch typedef enum {
58fe0d65a2SJacob Faibussowitsch   PETSC_OFFLOAD_UNALLOCATED = 0x0,
59fe0d65a2SJacob Faibussowitsch   PETSC_OFFLOAD_CPU         = 0x1,
60fe0d65a2SJacob Faibussowitsch   PETSC_OFFLOAD_GPU         = 0x2,
61fe0d65a2SJacob Faibussowitsch   PETSC_OFFLOAD_BOTH        = 0x3,
62d795ed5eSJunchao Zhang   PETSC_OFFLOAD_VECKOKKOS_DEPRECATED = 0x100,
63ae76731bSJunchao Zhang   PETSC_OFFLOAD_KOKKOS      = 0x100
64fe0d65a2SJacob Faibussowitsch } PetscOffloadMask;
65030f984aSJacob Faibussowitsch 
66030f984aSJacob Faibussowitsch /*E
67a4af0ceeSJacob Faibussowitsch   PetscDeviceInitType - Initialization strategy for PetscDevice
68a4af0ceeSJacob Faibussowitsch 
69a4af0ceeSJacob Faibussowitsch $ PETSC_DEVICE_INIT_NONE  - PetscDevice is never initialized
70a4af0ceeSJacob Faibussowitsch $ PETSC_DEVICE_INIT_LAZY  - PetscDevice is initialized on demand
71a4af0ceeSJacob Faibussowitsch $ PETSC_DEVICE_INIT_EAGER - PetscDevice is initialized as soon as possible
72a4af0ceeSJacob Faibussowitsch 
73a4af0ceeSJacob Faibussowitsch   Notes:
74a4af0ceeSJacob Faibussowitsch   PETSC_DEVICE_INIT_NONE implies that any initialization of PetscDevice is disallowed and
75a4af0ceeSJacob Faibussowitsch   doing so results in an error. Useful to ensure that no accelerator is used in a program.
76a4af0ceeSJacob Faibussowitsch 
77a4af0ceeSJacob Faibussowitsch   Level: beginner
78a4af0ceeSJacob Faibussowitsch 
79a4af0ceeSJacob Faibussowitsch .seealso: PetscDevice, PetscDeviceType, PetscDeviceInitialize(), PetscDeviceInitialized(), PetscDeviceCreate()
80a4af0ceeSJacob Faibussowitsch E*/
81a4af0ceeSJacob Faibussowitsch typedef enum {
82a4af0ceeSJacob Faibussowitsch   PETSC_DEVICE_INIT_NONE,
83a4af0ceeSJacob Faibussowitsch   PETSC_DEVICE_INIT_LAZY,
84a4af0ceeSJacob Faibussowitsch   PETSC_DEVICE_INIT_EAGER
85a4af0ceeSJacob Faibussowitsch } PetscDeviceInitType;
86a4af0ceeSJacob Faibussowitsch PETSC_EXTERN const char *const PetscDeviceInitTypes[];
87a4af0ceeSJacob Faibussowitsch 
88a4af0ceeSJacob Faibussowitsch /*E
89a4af0ceeSJacob Faibussowitsch   PetscDeviceType - Kind of accelerator device backend
90030f984aSJacob Faibussowitsch 
91030f984aSJacob Faibussowitsch $ PETSC_DEVICE_INVALID - Invalid type, do not use
92030f984aSJacob Faibussowitsch $ PETSC_DEVICE_CUDA    - CUDA enabled GPU
93030f984aSJacob Faibussowitsch $ PETSC_DEVICE_HIP     - ROCM/HIP enabled GPU
94a2158755SJunchao Zhang $ PETSC_DEVICE_SYCL    - SYCL enabled device
95030f984aSJacob Faibussowitsch $ PETSC_DEVICE_DEFAULT - Automatically select backend based on availability
96a4af0ceeSJacob Faibussowitsch $ PETSC_DEVICE_MAX     - Always 1 greater than the largest valid PetscDeviceType, invalid type, do not use
97030f984aSJacob Faibussowitsch 
98030f984aSJacob Faibussowitsch   Notes:
99a2158755SJunchao Zhang   PETSC_DEVICE_DEFAULT is selected in the following order: PETSC_DEVICE_HIP, PETSC_DEVICE_CUDA, PETSC_DEVICE_SYCL, PETSC_DEVICE_INVALID.
100030f984aSJacob Faibussowitsch 
101030f984aSJacob Faibussowitsch   Level: beginner
102030f984aSJacob Faibussowitsch 
103a4af0ceeSJacob Faibussowitsch .seealso: PetscDevice, PetscDeviceInitType, PetscDeviceCreate()
104030f984aSJacob Faibussowitsch E*/
105030f984aSJacob Faibussowitsch typedef enum {
106a4af0ceeSJacob Faibussowitsch   PETSC_DEVICE_INVALID,
107a4af0ceeSJacob Faibussowitsch   PETSC_DEVICE_CUDA,
108a4af0ceeSJacob Faibussowitsch   PETSC_DEVICE_HIP,
109a2158755SJunchao Zhang   PETSC_DEVICE_SYCL,
110a4af0ceeSJacob Faibussowitsch   PETSC_DEVICE_MAX
111a4af0ceeSJacob Faibussowitsch } PetscDeviceType;
112a4af0ceeSJacob Faibussowitsch PETSC_EXTERN const char *const PetscDeviceTypes[];
113*07e4ef11SJacob Faibussowitsch #if defined(PETSC_HAVE_HIP)
1145181c4f9SJacob Faibussowitsch #  define PETSC_DEVICE_DEFAULT PETSC_DEVICE_HIP
115*07e4ef11SJacob Faibussowitsch #elif defined(PETSC_HAVE_CUDA)
1165181c4f9SJacob Faibussowitsch #  define PETSC_DEVICE_DEFAULT PETSC_DEVICE_CUDA
117a2158755SJunchao Zhang #elif PetscDefined(HAVE_SYCL)
118a2158755SJunchao Zhang #  define PETSC_DEVICE_DEFAULT PETSC_DEVICE_SYCL
1195181c4f9SJacob Faibussowitsch #else
1205181c4f9SJacob Faibussowitsch #  define PETSC_DEVICE_DEFAULT PETSC_DEVICE_INVALID
1215181c4f9SJacob Faibussowitsch #endif
122030f984aSJacob Faibussowitsch 
123030f984aSJacob Faibussowitsch /*S
124030f984aSJacob Faibussowitsch   PetscDevice - Handle to an accelerator "device" (usually a GPU)
125030f984aSJacob Faibussowitsch 
126030f984aSJacob Faibussowitsch   Notes:
127030f984aSJacob Faibussowitsch   This object is used to house configuration and state of a device, but does not offer any ability to interact with or
128030f984aSJacob Faibussowitsch   drive device computation. This functionality is facilitated instead by the PetscDeviceContext object.
129030f984aSJacob Faibussowitsch 
130030f984aSJacob Faibussowitsch   Level: beginner
131030f984aSJacob Faibussowitsch 
132a4af0ceeSJacob Faibussowitsch .seealso: PetscDeviceType, PetscDeviceInitType, PetscDeviceCreate(), PetscDeviceConfigure(), PetscDeviceDestroy(), PetscDeviceContext, PetscDeviceContextSetDevice(), PetscDeviceContextGetDevice()
133030f984aSJacob Faibussowitsch S*/
134030f984aSJacob Faibussowitsch typedef struct _n_PetscDevice *PetscDevice;
135030f984aSJacob Faibussowitsch 
136030f984aSJacob Faibussowitsch /*E
137030f984aSJacob Faibussowitsch   PetscStreamType - Stream blocking mode, indicates how a stream implementation will interact with the default "NULL"
138030f984aSJacob Faibussowitsch   stream, which is usually blocking.
139030f984aSJacob Faibussowitsch 
140030f984aSJacob 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.
141030f984aSJacob Faibussowitsch $ PETSC_STREAM_DEFAULT_BLOCKING   - Stream will act independent of other streams, but will still be blocked by actions on the NULL stream.
142030f984aSJacob Faibussowitsch $ PETSC_STREAM_GLOBAL_NONBLOCKING - Stream is truly asynchronous, and is blocked by nothing, not even the NULL stream.
143030f984aSJacob Faibussowitsch $ PETSC_STREAM_MAX                - Always 1 greater than the largest PetscStreamType, do not use
144030f984aSJacob Faibussowitsch 
145030f984aSJacob Faibussowitsch   Level: intermediate
146030f984aSJacob Faibussowitsch 
147030f984aSJacob Faibussowitsch .seealso: PetscDeviceContextSetStreamType(), PetscDeviceContextGetStreamType()
148030f984aSJacob Faibussowitsch E*/
149030f984aSJacob Faibussowitsch typedef enum {
150a4af0ceeSJacob Faibussowitsch   PETSC_STREAM_GLOBAL_BLOCKING,
151a4af0ceeSJacob Faibussowitsch   PETSC_STREAM_DEFAULT_BLOCKING,
152a4af0ceeSJacob Faibussowitsch   PETSC_STREAM_GLOBAL_NONBLOCKING,
153a4af0ceeSJacob Faibussowitsch   PETSC_STREAM_MAX
154030f984aSJacob Faibussowitsch } PetscStreamType;
155030f984aSJacob Faibussowitsch PETSC_EXTERN const char *const PetscStreamTypes[];
156030f984aSJacob Faibussowitsch 
157030f984aSJacob Faibussowitsch /*E
158030f984aSJacob Faibussowitsch   PetscDeviceContextJoinMode - Describes the type of join operation to perform in PetscDeviceContextJoin()
159030f984aSJacob Faibussowitsch 
160030f984aSJacob Faibussowitsch $ PETSC_DEVICE_CONTEXT_DESTROY - Destroy all incoming sub-contexts after join.
161030f984aSJacob Faibussowitsch $ PETSC_CONTEXT_JOIN_SYNC      - Synchronize incoming sub-contexts after join.
162030f984aSJacob Faibussowitsch $ PETSC_CONTEXT_JOIN_NO_SYNC   - Do not synchronize incoming sub-contexts after join.
163030f984aSJacob Faibussowitsch 
164030f984aSJacob Faibussowitsch   Level: beginner
165030f984aSJacob Faibussowitsch 
166a4af0ceeSJacob Faibussowitsch .seealso: PetscDeviceContext, PetscDeviceContextFork(), PetscDeviceContextJoin()
167030f984aSJacob Faibussowitsch E*/
168030f984aSJacob Faibussowitsch typedef enum {
169030f984aSJacob Faibussowitsch   PETSC_DEVICE_CONTEXT_JOIN_DESTROY,
170030f984aSJacob Faibussowitsch   PETSC_DEVICE_CONTEXT_JOIN_SYNC,
171030f984aSJacob Faibussowitsch   PETSC_DEVICE_CONTEXT_JOIN_NO_SYNC
172030f984aSJacob Faibussowitsch } PetscDeviceContextJoinMode;
173030f984aSJacob Faibussowitsch PETSC_EXTERN const char *const PetscDeviceContextJoinModes[];
174030f984aSJacob Faibussowitsch 
175030f984aSJacob Faibussowitsch /*S
176030f984aSJacob Faibussowitsch   PetscDeviceContext - Container to manage stream dependencies and the various solver handles for asynchronous device compute.
177030f984aSJacob Faibussowitsch 
178030f984aSJacob Faibussowitsch   Level: beginner
179030f984aSJacob Faibussowitsch 
180030f984aSJacob Faibussowitsch .seealso: PetscDevice, PetscDeviceContextCreate(), PetscDeviceContextSetDevice(), PetscDeviceContextDestroy(),
181030f984aSJacob Faibussowitsch PetscDeviceContextFork(), PetscDeviceContextJoin()
182030f984aSJacob Faibussowitsch S*/
183030f984aSJacob Faibussowitsch typedef struct _n_PetscDeviceContext *PetscDeviceContext;
184030f984aSJacob Faibussowitsch #endif /* PETSCDEVICETYPES_H */
185