xref: /petsc/include/petscdevicetypes.h (revision 1105d5cab390dbcae516326765bf8aa17e798370)
107e4ef11SJacob Faibussowitsch #ifndef PETSCDEVICETYPES_H
2030f984aSJacob Faibussowitsch #define PETSCDEVICETYPES_H
3030f984aSJacob Faibussowitsch 
4*1105d5caSJacob Faibussowitsch #include <petscmacros.h> /*I <petscdevicetypes.h> I*/
5030f984aSJacob Faibussowitsch 
6030f984aSJacob Faibussowitsch /*E
7030f984aSJacob Faibussowitsch   PetscMemType - Memory type of a pointer
8030f984aSJacob Faibussowitsch 
9030f984aSJacob Faibussowitsch   Developer Note:
10030f984aSJacob Faibussowitsch   Encoding of the bitmask in binary: xxxxyyyz
11fe0d65a2SJacob Faibussowitsch 
12fe0d65a2SJacob Faibussowitsch $ z = 0                - Host memory
13fe0d65a2SJacob Faibussowitsch $ z = 1                - Device memory
14fe0d65a2SJacob Faibussowitsch $ yyy = 000            - CUDA-related memory
15fe0d65a2SJacob Faibussowitsch $ yyy = 001            - HIP-related memory
16a2158755SJunchao Zhang $ yyy = 010            - SYCL-related memory
17fe0d65a2SJacob Faibussowitsch $ xxxxyyy1 = 0000,0001 - CUDA memory
18fe0d65a2SJacob Faibussowitsch $ xxxxyyy1 = 0001,0001 - CUDA NVSHMEM memory
19fe0d65a2SJacob Faibussowitsch $ xxxxyyy1 = 0000,0011 - HIP memory
20a2158755SJunchao Zhang $ xxxxyyy1 = 0000,0101 - SYCL memory
21030f984aSJacob Faibussowitsch 
22030f984aSJacob Faibussowitsch   Other types of memory, e.g., CUDA managed memory, can be added when needed.
23030f984aSJacob Faibussowitsch 
24fe0d65a2SJacob Faibussowitsch   Level: beginner
25fe0d65a2SJacob Faibussowitsch 
263214990dSStefano Zampini   Notes:
273214990dSStefano Zampini   PETSC_MEMTYPE_KOKKOS depends on the KOKKOS backend configuration
283214990dSStefano Zampini 
29030f984aSJacob Faibussowitsch .seealso: VecGetArrayAndMemType(), PetscSFBcastWithMemTypeBegin(), PetscSFReduceWithMemTypeBegin()
30030f984aSJacob Faibussowitsch E*/
31fe0d65a2SJacob Faibussowitsch typedef enum {
32fe0d65a2SJacob Faibussowitsch   PETSC_MEMTYPE_HOST    = 0,
33fe0d65a2SJacob Faibussowitsch   PETSC_MEMTYPE_DEVICE  = 0x01,
34fe0d65a2SJacob Faibussowitsch   PETSC_MEMTYPE_CUDA    = 0x01,
35fe0d65a2SJacob Faibussowitsch   PETSC_MEMTYPE_NVSHMEM = 0x11,
36a2158755SJunchao Zhang   PETSC_MEMTYPE_HIP     = 0x03,
373214990dSStefano Zampini   PETSC_MEMTYPE_SYCL    = 0x05,
38fe0d65a2SJacob Faibussowitsch } PetscMemType;
39c0288c05SSatish Balay #if PetscDefined(HAVE_CUDA)
40c0288c05SSatish Balay # define PETSC_MEMTYPE_KOKKOS PETSC_MEMTYPE_CUDA
41c0288c05SSatish Balay #elif PetscDefined(HAVE_HIP)
42c0288c05SSatish Balay # define PETSC_MEMTYPE_KOKKOS PETSC_MEMTYPE_HIP
43c0288c05SSatish Balay #elif PetscDefined(HAVE_SYCL)
44c0288c05SSatish Balay # define PETSC_MEMTYPE_KOKKOS PETSC_MEMTYPE_SYCL
45c0288c05SSatish Balay #else
46c0288c05SSatish Balay # define PETSC_MEMTYPE_KOKKOS PETSC_MEMTYPE_HOST
47c0288c05SSatish Balay #endif
48030f984aSJacob Faibussowitsch 
49030f984aSJacob Faibussowitsch #define PetscMemTypeHost(m)    (((m) & 0x1) == PETSC_MEMTYPE_HOST)
50030f984aSJacob Faibussowitsch #define PetscMemTypeDevice(m)  (((m) & 0x1) == PETSC_MEMTYPE_DEVICE)
51030f984aSJacob Faibussowitsch #define PetscMemTypeCUDA(m)    (((m) & 0xF) == PETSC_MEMTYPE_CUDA)
52030f984aSJacob Faibussowitsch #define PetscMemTypeHIP(m)     (((m) & 0xF) == PETSC_MEMTYPE_HIP)
53a2158755SJunchao Zhang #define PetscMemTypeSYCL(m)    (((m) & 0xF) == PETSC_MEMTYPE_SYCL)
54030f984aSJacob Faibussowitsch #define PetscMemTypeNVSHMEM(m) ((m) == PETSC_MEMTYPE_NVSHMEM)
55030f984aSJacob Faibussowitsch 
565b5f62f7SJacob Faibussowitsch #define PETSC_OFFLOAD_VECKOKKOS_DEPRECATED PETSC_OFFLOAD_VECKOKKOS PETSC_DEPRECATED_ENUM("Use PETSC_OFFLOAD_KOKKOS (since version 3.17.0)")
57030f984aSJacob Faibussowitsch /*E
58030f984aSJacob Faibussowitsch   PetscOffloadMask - indicates which memory (CPU, GPU, or none) contains valid data
59030f984aSJacob Faibussowitsch 
60fe0d65a2SJacob Faibussowitsch $ PETSC_OFFLOAD_UNALLOCATED - no memory contains valid matrix entries; NEVER used for vectors
61fe0d65a2SJacob Faibussowitsch $ PETSC_OFFLOAD_GPU         - GPU has valid vector/matrix entries
62fe0d65a2SJacob Faibussowitsch $ PETSC_OFFLOAD_CPU         - CPU has valid vector/matrix entries
63fe0d65a2SJacob Faibussowitsch $ PETSC_OFFLOAD_BOTH        - Both GPU and CPU have valid vector/matrix entries and they match
64ae76731bSJunchao 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.
65030f984aSJacob Faibussowitsch 
66030f984aSJacob Faibussowitsch   Level: developer
67030f984aSJacob Faibussowitsch E*/
68fe0d65a2SJacob Faibussowitsch typedef enum {
69fe0d65a2SJacob Faibussowitsch   PETSC_OFFLOAD_UNALLOCATED = 0x0,
70fe0d65a2SJacob Faibussowitsch   PETSC_OFFLOAD_CPU         = 0x1,
71fe0d65a2SJacob Faibussowitsch   PETSC_OFFLOAD_GPU         = 0x2,
72fe0d65a2SJacob Faibussowitsch   PETSC_OFFLOAD_BOTH        = 0x3,
73d795ed5eSJunchao Zhang   PETSC_OFFLOAD_VECKOKKOS_DEPRECATED = 0x100,
74ae76731bSJunchao Zhang   PETSC_OFFLOAD_KOKKOS      = 0x100
75fe0d65a2SJacob Faibussowitsch } PetscOffloadMask;
76030f984aSJacob Faibussowitsch 
77030f984aSJacob Faibussowitsch /*E
78a4af0ceeSJacob Faibussowitsch   PetscDeviceInitType - Initialization strategy for PetscDevice
79a4af0ceeSJacob Faibussowitsch 
80a4af0ceeSJacob Faibussowitsch $ PETSC_DEVICE_INIT_NONE  - PetscDevice is never initialized
81a4af0ceeSJacob Faibussowitsch $ PETSC_DEVICE_INIT_LAZY  - PetscDevice is initialized on demand
82a4af0ceeSJacob Faibussowitsch $ PETSC_DEVICE_INIT_EAGER - PetscDevice is initialized as soon as possible
83a4af0ceeSJacob Faibussowitsch 
84a4af0ceeSJacob Faibussowitsch   Notes:
85a4af0ceeSJacob Faibussowitsch   PETSC_DEVICE_INIT_NONE implies that any initialization of PetscDevice is disallowed and
86a4af0ceeSJacob Faibussowitsch   doing so results in an error. Useful to ensure that no accelerator is used in a program.
87a4af0ceeSJacob Faibussowitsch 
88a4af0ceeSJacob Faibussowitsch   Level: beginner
89a4af0ceeSJacob Faibussowitsch 
90a4af0ceeSJacob Faibussowitsch .seealso: PetscDevice, PetscDeviceType, PetscDeviceInitialize(), PetscDeviceInitialized(), PetscDeviceCreate()
91a4af0ceeSJacob Faibussowitsch E*/
92a4af0ceeSJacob Faibussowitsch typedef enum {
93a4af0ceeSJacob Faibussowitsch   PETSC_DEVICE_INIT_NONE,
94a4af0ceeSJacob Faibussowitsch   PETSC_DEVICE_INIT_LAZY,
95a4af0ceeSJacob Faibussowitsch   PETSC_DEVICE_INIT_EAGER
96a4af0ceeSJacob Faibussowitsch } PetscDeviceInitType;
97a4af0ceeSJacob Faibussowitsch PETSC_EXTERN const char *const PetscDeviceInitTypes[];
98a4af0ceeSJacob Faibussowitsch 
99a4af0ceeSJacob Faibussowitsch /*E
100a4af0ceeSJacob Faibussowitsch   PetscDeviceType - Kind of accelerator device backend
101030f984aSJacob Faibussowitsch 
102030f984aSJacob Faibussowitsch $ PETSC_DEVICE_INVALID - Invalid type, do not use
103030f984aSJacob Faibussowitsch $ PETSC_DEVICE_CUDA    - CUDA enabled GPU
104030f984aSJacob Faibussowitsch $ PETSC_DEVICE_HIP     - ROCM/HIP enabled GPU
105a2158755SJunchao Zhang $ PETSC_DEVICE_SYCL    - SYCL enabled device
106030f984aSJacob Faibussowitsch $ PETSC_DEVICE_DEFAULT - Automatically select backend based on availability
107a4af0ceeSJacob Faibussowitsch $ PETSC_DEVICE_MAX     - Always 1 greater than the largest valid PetscDeviceType, invalid type, do not use
108030f984aSJacob Faibussowitsch 
109030f984aSJacob Faibussowitsch   Notes:
110a2158755SJunchao Zhang   PETSC_DEVICE_DEFAULT is selected in the following order: PETSC_DEVICE_HIP, PETSC_DEVICE_CUDA, PETSC_DEVICE_SYCL, PETSC_DEVICE_INVALID.
111030f984aSJacob Faibussowitsch 
112030f984aSJacob Faibussowitsch   Level: beginner
113030f984aSJacob Faibussowitsch 
114a4af0ceeSJacob Faibussowitsch .seealso: PetscDevice, PetscDeviceInitType, PetscDeviceCreate()
115030f984aSJacob Faibussowitsch E*/
116030f984aSJacob Faibussowitsch typedef enum {
117a4af0ceeSJacob Faibussowitsch   PETSC_DEVICE_INVALID,
118a4af0ceeSJacob Faibussowitsch   PETSC_DEVICE_CUDA,
119a4af0ceeSJacob Faibussowitsch   PETSC_DEVICE_HIP,
120a2158755SJunchao Zhang   PETSC_DEVICE_SYCL,
121a4af0ceeSJacob Faibussowitsch   PETSC_DEVICE_MAX
122a4af0ceeSJacob Faibussowitsch } PetscDeviceType;
123a4af0ceeSJacob Faibussowitsch PETSC_EXTERN const char *const PetscDeviceTypes[];
12407e4ef11SJacob Faibussowitsch #if defined(PETSC_HAVE_HIP)
1255181c4f9SJacob Faibussowitsch #  define PETSC_DEVICE_DEFAULT PETSC_DEVICE_HIP
12607e4ef11SJacob Faibussowitsch #elif defined(PETSC_HAVE_CUDA)
1275181c4f9SJacob Faibussowitsch #  define PETSC_DEVICE_DEFAULT PETSC_DEVICE_CUDA
128a2158755SJunchao Zhang #elif PetscDefined(HAVE_SYCL)
129a2158755SJunchao Zhang #  define PETSC_DEVICE_DEFAULT PETSC_DEVICE_SYCL
1305181c4f9SJacob Faibussowitsch #else
1315181c4f9SJacob Faibussowitsch #  define PETSC_DEVICE_DEFAULT PETSC_DEVICE_INVALID
1325181c4f9SJacob Faibussowitsch #endif
133030f984aSJacob Faibussowitsch 
134030f984aSJacob Faibussowitsch /*S
135030f984aSJacob Faibussowitsch   PetscDevice - Handle to an accelerator "device" (usually a GPU)
136030f984aSJacob Faibussowitsch 
137030f984aSJacob Faibussowitsch   Notes:
138030f984aSJacob Faibussowitsch   This object is used to house configuration and state of a device, but does not offer any ability to interact with or
139030f984aSJacob Faibussowitsch   drive device computation. This functionality is facilitated instead by the PetscDeviceContext object.
140030f984aSJacob Faibussowitsch 
141030f984aSJacob Faibussowitsch   Level: beginner
142030f984aSJacob Faibussowitsch 
143a4af0ceeSJacob Faibussowitsch .seealso: PetscDeviceType, PetscDeviceInitType, PetscDeviceCreate(), PetscDeviceConfigure(), PetscDeviceDestroy(), PetscDeviceContext, PetscDeviceContextSetDevice(), PetscDeviceContextGetDevice()
144030f984aSJacob Faibussowitsch S*/
145030f984aSJacob Faibussowitsch typedef struct _n_PetscDevice *PetscDevice;
146030f984aSJacob Faibussowitsch 
147030f984aSJacob Faibussowitsch /*E
148030f984aSJacob Faibussowitsch   PetscStreamType - Stream blocking mode, indicates how a stream implementation will interact with the default "NULL"
149030f984aSJacob Faibussowitsch   stream, which is usually blocking.
150030f984aSJacob Faibussowitsch 
151030f984aSJacob 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.
152030f984aSJacob Faibussowitsch $ PETSC_STREAM_DEFAULT_BLOCKING   - Stream will act independent of other streams, but will still be blocked by actions on the NULL stream.
153030f984aSJacob Faibussowitsch $ PETSC_STREAM_GLOBAL_NONBLOCKING - Stream is truly asynchronous, and is blocked by nothing, not even the NULL stream.
154030f984aSJacob Faibussowitsch $ PETSC_STREAM_MAX                - Always 1 greater than the largest PetscStreamType, do not use
155030f984aSJacob Faibussowitsch 
156030f984aSJacob Faibussowitsch   Level: intermediate
157030f984aSJacob Faibussowitsch 
158030f984aSJacob Faibussowitsch .seealso: PetscDeviceContextSetStreamType(), PetscDeviceContextGetStreamType()
159030f984aSJacob Faibussowitsch E*/
160030f984aSJacob Faibussowitsch typedef enum {
161a4af0ceeSJacob Faibussowitsch   PETSC_STREAM_GLOBAL_BLOCKING,
162a4af0ceeSJacob Faibussowitsch   PETSC_STREAM_DEFAULT_BLOCKING,
163a4af0ceeSJacob Faibussowitsch   PETSC_STREAM_GLOBAL_NONBLOCKING,
164a4af0ceeSJacob Faibussowitsch   PETSC_STREAM_MAX
165030f984aSJacob Faibussowitsch } PetscStreamType;
166030f984aSJacob Faibussowitsch PETSC_EXTERN const char *const PetscStreamTypes[];
167030f984aSJacob Faibussowitsch 
168030f984aSJacob Faibussowitsch /*E
169030f984aSJacob Faibussowitsch   PetscDeviceContextJoinMode - Describes the type of join operation to perform in PetscDeviceContextJoin()
170030f984aSJacob Faibussowitsch 
171030f984aSJacob Faibussowitsch $ PETSC_DEVICE_CONTEXT_DESTROY - Destroy all incoming sub-contexts after join.
172030f984aSJacob Faibussowitsch $ PETSC_CONTEXT_JOIN_SYNC      - Synchronize incoming sub-contexts after join.
173030f984aSJacob Faibussowitsch $ PETSC_CONTEXT_JOIN_NO_SYNC   - Do not synchronize incoming sub-contexts after join.
174030f984aSJacob Faibussowitsch 
175030f984aSJacob Faibussowitsch   Level: beginner
176030f984aSJacob Faibussowitsch 
177a4af0ceeSJacob Faibussowitsch .seealso: PetscDeviceContext, PetscDeviceContextFork(), PetscDeviceContextJoin()
178030f984aSJacob Faibussowitsch E*/
179030f984aSJacob Faibussowitsch typedef enum {
180030f984aSJacob Faibussowitsch   PETSC_DEVICE_CONTEXT_JOIN_DESTROY,
181030f984aSJacob Faibussowitsch   PETSC_DEVICE_CONTEXT_JOIN_SYNC,
182030f984aSJacob Faibussowitsch   PETSC_DEVICE_CONTEXT_JOIN_NO_SYNC
183030f984aSJacob Faibussowitsch } PetscDeviceContextJoinMode;
184030f984aSJacob Faibussowitsch PETSC_EXTERN const char *const PetscDeviceContextJoinModes[];
185030f984aSJacob Faibussowitsch 
186030f984aSJacob Faibussowitsch /*S
187030f984aSJacob Faibussowitsch   PetscDeviceContext - Container to manage stream dependencies and the various solver handles for asynchronous device compute.
188030f984aSJacob Faibussowitsch 
189030f984aSJacob Faibussowitsch   Level: beginner
190030f984aSJacob Faibussowitsch 
191030f984aSJacob Faibussowitsch .seealso: PetscDevice, PetscDeviceContextCreate(), PetscDeviceContextSetDevice(), PetscDeviceContextDestroy(),
192030f984aSJacob Faibussowitsch PetscDeviceContextFork(), PetscDeviceContextJoin()
193030f984aSJacob Faibussowitsch S*/
194030f984aSJacob Faibussowitsch typedef struct _n_PetscDeviceContext *PetscDeviceContext;
195030f984aSJacob Faibussowitsch #endif /* PETSCDEVICETYPES_H */
196