xref: /petsc/include/petscdevicetypes.h (revision a16fd2c93c02146fccd68469496ac02ca99b9ebe)
107e4ef11SJacob Faibussowitsch #ifndef PETSCDEVICETYPES_H
2030f984aSJacob Faibussowitsch #define PETSCDEVICETYPES_H
3030f984aSJacob Faibussowitsch 
41105d5caSJacob Faibussowitsch #include <petscmacros.h> /*I <petscdevicetypes.h> I*/
5030f984aSJacob Faibussowitsch 
6ac09b921SBarry Smith /* SUBMANSEC = Sys */
7ac09b921SBarry 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:
2987497f52SBarry Smith   `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
8087497f52SBarry Smith   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 
136*a16fd2c9SJacob Faibussowitsch /*E
137*a16fd2c9SJacob Faibussowitsch   PetscDeviceAttribute - Attribute detailing a property or feature of a `PetscDevice`
138*a16fd2c9SJacob Faibussowitsch 
139*a16fd2c9SJacob Faibussowitsch $ PETSC_DEVICE_ATTR_SIZE_T_SHARED_MEM_PER_BLOCK - The maximum amount of shared memory per block in a
140*a16fd2c9SJacob Faibussowitsch device kernel
141*a16fd2c9SJacob Faibussowitsch $ PETSC_DEVICE_ATTR_MAX                         - Invalid attribute, do not use
142*a16fd2c9SJacob Faibussowitsch 
143*a16fd2c9SJacob Faibussowitsch   Level: beginner
144*a16fd2c9SJacob Faibussowitsch 
145*a16fd2c9SJacob Faibussowitsch .seealso: `PetscDevice`, `PetscDeviceGetAttribute()`
146*a16fd2c9SJacob Faibussowitsch E*/
147*a16fd2c9SJacob Faibussowitsch typedef enum {
148*a16fd2c9SJacob Faibussowitsch   PETSC_DEVICE_ATTR_SIZE_T_SHARED_MEM_PER_BLOCK,
149*a16fd2c9SJacob Faibussowitsch   PETSC_DEVICE_ATTR_MAX
150*a16fd2c9SJacob Faibussowitsch } PetscDeviceAttribute;
151*a16fd2c9SJacob Faibussowitsch PETSC_EXTERN const char *const PetscDeviceAttributes[];
152*a16fd2c9SJacob Faibussowitsch 
153030f984aSJacob Faibussowitsch /*S
15487497f52SBarry Smith   PetscDevice - Object to manage an accelerator "device" (usually a GPU)
155030f984aSJacob Faibussowitsch 
15687497f52SBarry Smith   Note:
157030f984aSJacob Faibussowitsch   This object is used to house configuration and state of a device, but does not offer any ability to interact with or
15887497f52SBarry Smith   drive device computation. This functionality is facilitated instead by the `PetscDeviceContext` object.
159030f984aSJacob Faibussowitsch 
160030f984aSJacob Faibussowitsch   Level: beginner
161030f984aSJacob Faibussowitsch 
162*a16fd2c9SJacob Faibussowitsch .seealso: `PetscDeviceType`, `PetscDeviceInitType`, `PetscDeviceCreate()`, `PetscDeviceConfigure()`,
163*a16fd2c9SJacob Faibussowitsch `PetscDeviceDestroy()`, `PetscDeviceContext`, `PetscDeviceContextSetDevice()`, `PetscDeviceContextGetDevice()`, `PetscDeviceGetAttribute()`
164030f984aSJacob Faibussowitsch S*/
165030f984aSJacob Faibussowitsch typedef struct _n_PetscDevice *PetscDevice;
166030f984aSJacob Faibussowitsch 
167030f984aSJacob Faibussowitsch /*E
168030f984aSJacob Faibussowitsch   PetscStreamType - Stream blocking mode, indicates how a stream implementation will interact with the default "NULL"
169030f984aSJacob Faibussowitsch   stream, which is usually blocking.
170030f984aSJacob Faibussowitsch 
171030f984aSJacob 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.
172030f984aSJacob Faibussowitsch $ PETSC_STREAM_DEFAULT_BLOCKING   - Stream will act independent of other streams, but will still be blocked by actions on the NULL stream.
173030f984aSJacob Faibussowitsch $ PETSC_STREAM_GLOBAL_NONBLOCKING - Stream is truly asynchronous, and is blocked by nothing, not even the NULL stream.
174030f984aSJacob Faibussowitsch $ PETSC_STREAM_MAX                - Always 1 greater than the largest PetscStreamType, do not use
175030f984aSJacob Faibussowitsch 
176030f984aSJacob Faibussowitsch   Level: intermediate
177030f984aSJacob Faibussowitsch 
178db781477SPatrick Sanan .seealso: `PetscDeviceContextSetStreamType()`, `PetscDeviceContextGetStreamType()`
179030f984aSJacob Faibussowitsch E*/
180030f984aSJacob Faibussowitsch typedef enum {
181a4af0ceeSJacob Faibussowitsch   PETSC_STREAM_GLOBAL_BLOCKING,
182a4af0ceeSJacob Faibussowitsch   PETSC_STREAM_DEFAULT_BLOCKING,
183a4af0ceeSJacob Faibussowitsch   PETSC_STREAM_GLOBAL_NONBLOCKING,
184a4af0ceeSJacob Faibussowitsch   PETSC_STREAM_MAX
185030f984aSJacob Faibussowitsch } PetscStreamType;
186030f984aSJacob Faibussowitsch PETSC_EXTERN const char *const PetscStreamTypes[];
187030f984aSJacob Faibussowitsch 
188030f984aSJacob Faibussowitsch /*E
18987497f52SBarry Smith   PetscDeviceContextJoinMode - Describes the type of join operation to perform in `PetscDeviceContextJoin()`
190030f984aSJacob Faibussowitsch 
1915d84059aSJacob Faibussowitsch $ PETSC_DEVICE_CONTEXT_JOIN_DESTROY - Destroy all incoming sub-contexts after join.
1925d84059aSJacob Faibussowitsch $ PETSC_DEVICE_CONTEXT_JOIN_SYNC    - Synchronize incoming sub-contexts after join.
1935d84059aSJacob Faibussowitsch $ PETSC_DEVICE_CONTEXT_JOIN_NO_SYNC - Do not synchronize incoming sub-contexts after join.
194030f984aSJacob Faibussowitsch 
195030f984aSJacob Faibussowitsch   Level: beginner
196030f984aSJacob Faibussowitsch 
197db781477SPatrick Sanan .seealso: `PetscDeviceContext`, `PetscDeviceContextFork()`, `PetscDeviceContextJoin()`
198030f984aSJacob Faibussowitsch E*/
199030f984aSJacob Faibussowitsch typedef enum {
200030f984aSJacob Faibussowitsch   PETSC_DEVICE_CONTEXT_JOIN_DESTROY,
201030f984aSJacob Faibussowitsch   PETSC_DEVICE_CONTEXT_JOIN_SYNC,
202030f984aSJacob Faibussowitsch   PETSC_DEVICE_CONTEXT_JOIN_NO_SYNC
203030f984aSJacob Faibussowitsch } PetscDeviceContextJoinMode;
204030f984aSJacob Faibussowitsch PETSC_EXTERN const char *const PetscDeviceContextJoinModes[];
205030f984aSJacob Faibussowitsch 
206030f984aSJacob Faibussowitsch /*S
207030f984aSJacob Faibussowitsch   PetscDeviceContext - Container to manage stream dependencies and the various solver handles for asynchronous device compute.
208030f984aSJacob Faibussowitsch 
209030f984aSJacob Faibussowitsch   Level: beginner
210030f984aSJacob Faibussowitsch 
211db781477SPatrick Sanan .seealso: `PetscDevice`, `PetscDeviceContextCreate()`, `PetscDeviceContextSetDevice()`, `PetscDeviceContextDestroy()`,
212db781477SPatrick Sanan           `PetscDeviceContextFork()`, `PetscDeviceContextJoin()`
213030f984aSJacob Faibussowitsch S*/
214030f984aSJacob Faibussowitsch typedef struct _n_PetscDeviceContext *PetscDeviceContext;
215030f984aSJacob Faibussowitsch #endif /* PETSCDEVICETYPES_H */
216