xref: /petsc/include/petscdevicetypes.h (revision ac09b9214d23ea9ad238aa607de9fa447fd4e91b)
107e4ef11SJacob Faibussowitsch #ifndef PETSCDEVICETYPES_H
2030f984aSJacob Faibussowitsch #define PETSCDEVICETYPES_H
3030f984aSJacob Faibussowitsch 
41105d5caSJacob Faibussowitsch #include <petscmacros.h> /*I <petscdevicetypes.h> I*/
5030f984aSJacob Faibussowitsch 
6*ac09b921SBarry Smith /* SUBMANSEC = Sys */
7*ac09b921SBarry Smith 
8030f984aSJacob Faibussowitsch /*E
9030f984aSJacob Faibussowitsch   PetscMemType - Memory type of a pointer
10030f984aSJacob Faibussowitsch 
11030f984aSJacob Faibussowitsch   Developer Note:
12030f984aSJacob Faibussowitsch   Encoding of the bitmask in binary: xxxxyyyz
13fe0d65a2SJacob Faibussowitsch 
14fe0d65a2SJacob Faibussowitsch $ z = 0                - Host memory
15fe0d65a2SJacob Faibussowitsch $ z = 1                - Device memory
16fe0d65a2SJacob Faibussowitsch $ yyy = 000            - CUDA-related memory
17fe0d65a2SJacob Faibussowitsch $ yyy = 001            - HIP-related memory
18a2158755SJunchao Zhang $ yyy = 010            - SYCL-related memory
19fe0d65a2SJacob Faibussowitsch $ xxxxyyy1 = 0000,0001 - CUDA memory
20fe0d65a2SJacob Faibussowitsch $ xxxxyyy1 = 0001,0001 - CUDA NVSHMEM memory
21fe0d65a2SJacob Faibussowitsch $ xxxxyyy1 = 0000,0011 - HIP memory
22a2158755SJunchao Zhang $ xxxxyyy1 = 0000,0101 - SYCL memory
23030f984aSJacob Faibussowitsch 
24030f984aSJacob Faibussowitsch   Other types of memory, e.g., CUDA managed memory, can be added when needed.
25030f984aSJacob Faibussowitsch 
26fe0d65a2SJacob Faibussowitsch   Level: beginner
27fe0d65a2SJacob Faibussowitsch 
283214990dSStefano Zampini   Notes:
293214990dSStefano Zampini   PETSC_MEMTYPE_KOKKOS depends on the KOKKOS backend configuration
303214990dSStefano Zampini 
31db781477SPatrick Sanan .seealso: `VecGetArrayAndMemType()`, `PetscSFBcastWithMemTypeBegin()`, `PetscSFReduceWithMemTypeBegin()`
32030f984aSJacob Faibussowitsch E*/
33fe0d65a2SJacob Faibussowitsch typedef enum {
34fe0d65a2SJacob Faibussowitsch   PETSC_MEMTYPE_HOST    = 0,
35fe0d65a2SJacob Faibussowitsch   PETSC_MEMTYPE_DEVICE  = 0x01,
36fe0d65a2SJacob Faibussowitsch   PETSC_MEMTYPE_CUDA    = 0x01,
37fe0d65a2SJacob Faibussowitsch   PETSC_MEMTYPE_NVSHMEM = 0x11,
38a2158755SJunchao Zhang   PETSC_MEMTYPE_HIP     = 0x03,
393214990dSStefano Zampini   PETSC_MEMTYPE_SYCL    = 0x05,
40fe0d65a2SJacob Faibussowitsch } PetscMemType;
41c0288c05SSatish Balay #if PetscDefined(HAVE_CUDA)
42c0288c05SSatish Balay # define PETSC_MEMTYPE_KOKKOS PETSC_MEMTYPE_CUDA
43c0288c05SSatish Balay #elif PetscDefined(HAVE_HIP)
44c0288c05SSatish Balay # define PETSC_MEMTYPE_KOKKOS PETSC_MEMTYPE_HIP
45c0288c05SSatish Balay #elif PetscDefined(HAVE_SYCL)
46c0288c05SSatish Balay # define PETSC_MEMTYPE_KOKKOS PETSC_MEMTYPE_SYCL
47c0288c05SSatish Balay #else
48c0288c05SSatish Balay # define PETSC_MEMTYPE_KOKKOS PETSC_MEMTYPE_HOST
49c0288c05SSatish Balay #endif
50030f984aSJacob Faibussowitsch 
51030f984aSJacob Faibussowitsch #define PetscMemTypeHost(m)    (((m) & 0x1) == PETSC_MEMTYPE_HOST)
52030f984aSJacob Faibussowitsch #define PetscMemTypeDevice(m)  (((m) & 0x1) == PETSC_MEMTYPE_DEVICE)
53030f984aSJacob Faibussowitsch #define PetscMemTypeCUDA(m)    (((m) & 0xF) == PETSC_MEMTYPE_CUDA)
54030f984aSJacob Faibussowitsch #define PetscMemTypeHIP(m)     (((m) & 0xF) == PETSC_MEMTYPE_HIP)
55a2158755SJunchao Zhang #define PetscMemTypeSYCL(m)    (((m) & 0xF) == PETSC_MEMTYPE_SYCL)
56030f984aSJacob Faibussowitsch #define PetscMemTypeNVSHMEM(m) ((m) == PETSC_MEMTYPE_NVSHMEM)
57030f984aSJacob Faibussowitsch 
585b5f62f7SJacob Faibussowitsch #define PETSC_OFFLOAD_VECKOKKOS_DEPRECATED PETSC_OFFLOAD_VECKOKKOS PETSC_DEPRECATED_ENUM("Use PETSC_OFFLOAD_KOKKOS (since version 3.17.0)")
59030f984aSJacob Faibussowitsch /*E
60030f984aSJacob Faibussowitsch   PetscOffloadMask - indicates which memory (CPU, GPU, or none) contains valid data
61030f984aSJacob Faibussowitsch 
62fe0d65a2SJacob Faibussowitsch $ PETSC_OFFLOAD_UNALLOCATED - no memory contains valid matrix entries; NEVER used for vectors
63fe0d65a2SJacob Faibussowitsch $ PETSC_OFFLOAD_GPU         - GPU has valid vector/matrix entries
64fe0d65a2SJacob Faibussowitsch $ PETSC_OFFLOAD_CPU         - CPU has valid vector/matrix entries
65fe0d65a2SJacob Faibussowitsch $ PETSC_OFFLOAD_BOTH        - Both GPU and CPU have valid vector/matrix entries and they match
66ae76731bSJunchao 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.
67030f984aSJacob Faibussowitsch 
68030f984aSJacob Faibussowitsch   Level: developer
69030f984aSJacob Faibussowitsch E*/
70fe0d65a2SJacob Faibussowitsch typedef enum {
71fe0d65a2SJacob Faibussowitsch   PETSC_OFFLOAD_UNALLOCATED = 0x0,
72fe0d65a2SJacob Faibussowitsch   PETSC_OFFLOAD_CPU         = 0x1,
73fe0d65a2SJacob Faibussowitsch   PETSC_OFFLOAD_GPU         = 0x2,
74fe0d65a2SJacob Faibussowitsch   PETSC_OFFLOAD_BOTH        = 0x3,
75d795ed5eSJunchao Zhang   PETSC_OFFLOAD_VECKOKKOS_DEPRECATED = 0x100,
76ae76731bSJunchao Zhang   PETSC_OFFLOAD_KOKKOS      = 0x100
77fe0d65a2SJacob Faibussowitsch } PetscOffloadMask;
78030f984aSJacob Faibussowitsch 
79030f984aSJacob Faibussowitsch /*E
80a4af0ceeSJacob Faibussowitsch   PetscDeviceInitType - Initialization strategy for PetscDevice
81a4af0ceeSJacob Faibussowitsch 
82a4af0ceeSJacob Faibussowitsch $ PETSC_DEVICE_INIT_NONE  - PetscDevice is never initialized
83a4af0ceeSJacob Faibussowitsch $ PETSC_DEVICE_INIT_LAZY  - PetscDevice is initialized on demand
84a4af0ceeSJacob Faibussowitsch $ PETSC_DEVICE_INIT_EAGER - PetscDevice is initialized as soon as possible
85a4af0ceeSJacob Faibussowitsch 
86a4af0ceeSJacob Faibussowitsch   Notes:
87a4af0ceeSJacob Faibussowitsch   PETSC_DEVICE_INIT_NONE implies that any initialization of PetscDevice is disallowed and
88a4af0ceeSJacob Faibussowitsch   doing so results in an error. Useful to ensure that no accelerator is used in a program.
89a4af0ceeSJacob Faibussowitsch 
90a4af0ceeSJacob Faibussowitsch   Level: beginner
91a4af0ceeSJacob Faibussowitsch 
92db781477SPatrick Sanan .seealso: `PetscDevice`, `PetscDeviceType`, `PetscDeviceInitialize()`, `PetscDeviceInitialized()`, `PetscDeviceCreate()`
93a4af0ceeSJacob Faibussowitsch E*/
94a4af0ceeSJacob Faibussowitsch typedef enum {
95a4af0ceeSJacob Faibussowitsch   PETSC_DEVICE_INIT_NONE,
96a4af0ceeSJacob Faibussowitsch   PETSC_DEVICE_INIT_LAZY,
97a4af0ceeSJacob Faibussowitsch   PETSC_DEVICE_INIT_EAGER
98a4af0ceeSJacob Faibussowitsch } PetscDeviceInitType;
99a4af0ceeSJacob Faibussowitsch PETSC_EXTERN const char *const PetscDeviceInitTypes[];
100a4af0ceeSJacob Faibussowitsch 
101a4af0ceeSJacob Faibussowitsch /*E
102a4af0ceeSJacob Faibussowitsch   PetscDeviceType - Kind of accelerator device backend
103030f984aSJacob Faibussowitsch 
104030f984aSJacob Faibussowitsch $ PETSC_DEVICE_INVALID - Invalid type, do not use
105030f984aSJacob Faibussowitsch $ PETSC_DEVICE_CUDA    - CUDA enabled GPU
106030f984aSJacob Faibussowitsch $ PETSC_DEVICE_HIP     - ROCM/HIP enabled GPU
107a2158755SJunchao Zhang $ PETSC_DEVICE_SYCL    - SYCL enabled device
108030f984aSJacob Faibussowitsch $ PETSC_DEVICE_DEFAULT - Automatically select backend based on availability
109a4af0ceeSJacob Faibussowitsch $ PETSC_DEVICE_MAX     - Always 1 greater than the largest valid PetscDeviceType, invalid type, do not use
110030f984aSJacob Faibussowitsch 
111030f984aSJacob Faibussowitsch   Notes:
112a2158755SJunchao Zhang   PETSC_DEVICE_DEFAULT is selected in the following order: PETSC_DEVICE_HIP, PETSC_DEVICE_CUDA, PETSC_DEVICE_SYCL, PETSC_DEVICE_INVALID.
113030f984aSJacob Faibussowitsch 
114030f984aSJacob Faibussowitsch   Level: beginner
115030f984aSJacob Faibussowitsch 
116db781477SPatrick Sanan .seealso: `PetscDevice`, `PetscDeviceInitType`, `PetscDeviceCreate()`
117030f984aSJacob Faibussowitsch E*/
118030f984aSJacob Faibussowitsch typedef enum {
119a4af0ceeSJacob Faibussowitsch   PETSC_DEVICE_INVALID,
120a4af0ceeSJacob Faibussowitsch   PETSC_DEVICE_CUDA,
121a4af0ceeSJacob Faibussowitsch   PETSC_DEVICE_HIP,
122a2158755SJunchao Zhang   PETSC_DEVICE_SYCL,
123a4af0ceeSJacob Faibussowitsch   PETSC_DEVICE_MAX
124a4af0ceeSJacob Faibussowitsch } PetscDeviceType;
125a4af0ceeSJacob Faibussowitsch PETSC_EXTERN const char *const PetscDeviceTypes[];
12607e4ef11SJacob Faibussowitsch #if defined(PETSC_HAVE_HIP)
1275181c4f9SJacob Faibussowitsch #  define PETSC_DEVICE_DEFAULT PETSC_DEVICE_HIP
12807e4ef11SJacob Faibussowitsch #elif defined(PETSC_HAVE_CUDA)
1295181c4f9SJacob Faibussowitsch #  define PETSC_DEVICE_DEFAULT PETSC_DEVICE_CUDA
130a2158755SJunchao Zhang #elif PetscDefined(HAVE_SYCL)
131a2158755SJunchao Zhang #  define PETSC_DEVICE_DEFAULT PETSC_DEVICE_SYCL
1325181c4f9SJacob Faibussowitsch #else
1335181c4f9SJacob Faibussowitsch #  define PETSC_DEVICE_DEFAULT PETSC_DEVICE_INVALID
1345181c4f9SJacob Faibussowitsch #endif
135030f984aSJacob Faibussowitsch 
136030f984aSJacob Faibussowitsch /*S
137030f984aSJacob Faibussowitsch   PetscDevice - Handle to an accelerator "device" (usually a GPU)
138030f984aSJacob Faibussowitsch 
139030f984aSJacob Faibussowitsch   Notes:
140030f984aSJacob Faibussowitsch   This object is used to house configuration and state of a device, but does not offer any ability to interact with or
141030f984aSJacob Faibussowitsch   drive device computation. This functionality is facilitated instead by the PetscDeviceContext object.
142030f984aSJacob Faibussowitsch 
143030f984aSJacob Faibussowitsch   Level: beginner
144030f984aSJacob Faibussowitsch 
145db781477SPatrick Sanan .seealso: `PetscDeviceType`, `PetscDeviceInitType`, `PetscDeviceCreate()`, `PetscDeviceConfigure()`, `PetscDeviceDestroy()`, `PetscDeviceContext`, `PetscDeviceContextSetDevice()`, `PetscDeviceContextGetDevice()`
146030f984aSJacob Faibussowitsch S*/
147030f984aSJacob Faibussowitsch typedef struct _n_PetscDevice *PetscDevice;
148030f984aSJacob Faibussowitsch 
149030f984aSJacob Faibussowitsch /*E
150030f984aSJacob Faibussowitsch   PetscStreamType - Stream blocking mode, indicates how a stream implementation will interact with the default "NULL"
151030f984aSJacob Faibussowitsch   stream, which is usually blocking.
152030f984aSJacob Faibussowitsch 
153030f984aSJacob 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.
154030f984aSJacob Faibussowitsch $ PETSC_STREAM_DEFAULT_BLOCKING   - Stream will act independent of other streams, but will still be blocked by actions on the NULL stream.
155030f984aSJacob Faibussowitsch $ PETSC_STREAM_GLOBAL_NONBLOCKING - Stream is truly asynchronous, and is blocked by nothing, not even the NULL stream.
156030f984aSJacob Faibussowitsch $ PETSC_STREAM_MAX                - Always 1 greater than the largest PetscStreamType, do not use
157030f984aSJacob Faibussowitsch 
158030f984aSJacob Faibussowitsch   Level: intermediate
159030f984aSJacob Faibussowitsch 
160db781477SPatrick Sanan .seealso: `PetscDeviceContextSetStreamType()`, `PetscDeviceContextGetStreamType()`
161030f984aSJacob Faibussowitsch E*/
162030f984aSJacob Faibussowitsch typedef enum {
163a4af0ceeSJacob Faibussowitsch   PETSC_STREAM_GLOBAL_BLOCKING,
164a4af0ceeSJacob Faibussowitsch   PETSC_STREAM_DEFAULT_BLOCKING,
165a4af0ceeSJacob Faibussowitsch   PETSC_STREAM_GLOBAL_NONBLOCKING,
166a4af0ceeSJacob Faibussowitsch   PETSC_STREAM_MAX
167030f984aSJacob Faibussowitsch } PetscStreamType;
168030f984aSJacob Faibussowitsch PETSC_EXTERN const char *const PetscStreamTypes[];
169030f984aSJacob Faibussowitsch 
170030f984aSJacob Faibussowitsch /*E
171030f984aSJacob Faibussowitsch   PetscDeviceContextJoinMode - Describes the type of join operation to perform in PetscDeviceContextJoin()
172030f984aSJacob Faibussowitsch 
1735d84059aSJacob Faibussowitsch $ PETSC_DEVICE_CONTEXT_JOIN_DESTROY - Destroy all incoming sub-contexts after join.
1745d84059aSJacob Faibussowitsch $ PETSC_DEVICE_CONTEXT_JOIN_SYNC    - Synchronize incoming sub-contexts after join.
1755d84059aSJacob Faibussowitsch $ PETSC_DEVICE_CONTEXT_JOIN_NO_SYNC - Do not synchronize incoming sub-contexts after join.
176030f984aSJacob Faibussowitsch 
177030f984aSJacob Faibussowitsch   Level: beginner
178030f984aSJacob Faibussowitsch 
179db781477SPatrick Sanan .seealso: `PetscDeviceContext`, `PetscDeviceContextFork()`, `PetscDeviceContextJoin()`
180030f984aSJacob Faibussowitsch E*/
181030f984aSJacob Faibussowitsch typedef enum {
182030f984aSJacob Faibussowitsch   PETSC_DEVICE_CONTEXT_JOIN_DESTROY,
183030f984aSJacob Faibussowitsch   PETSC_DEVICE_CONTEXT_JOIN_SYNC,
184030f984aSJacob Faibussowitsch   PETSC_DEVICE_CONTEXT_JOIN_NO_SYNC
185030f984aSJacob Faibussowitsch } PetscDeviceContextJoinMode;
186030f984aSJacob Faibussowitsch PETSC_EXTERN const char *const PetscDeviceContextJoinModes[];
187030f984aSJacob Faibussowitsch 
188030f984aSJacob Faibussowitsch /*S
189030f984aSJacob Faibussowitsch   PetscDeviceContext - Container to manage stream dependencies and the various solver handles for asynchronous device compute.
190030f984aSJacob Faibussowitsch 
191030f984aSJacob Faibussowitsch   Level: beginner
192030f984aSJacob Faibussowitsch 
193db781477SPatrick Sanan .seealso: `PetscDevice`, `PetscDeviceContextCreate()`, `PetscDeviceContextSetDevice()`, `PetscDeviceContextDestroy()`,
194db781477SPatrick Sanan           `PetscDeviceContextFork()`, `PetscDeviceContextJoin()`
195030f984aSJacob Faibussowitsch S*/
196030f984aSJacob Faibussowitsch typedef struct _n_PetscDeviceContext *PetscDeviceContext;
197030f984aSJacob Faibussowitsch #endif /* PETSCDEVICETYPES_H */
198