xref: /petsc/include/petscdevicetypes.h (revision ae76731bb9c8d5347b13edfe469d82f1c4f88f6a)
1030f984aSJacob Faibussowitsch #if !defined(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
17fe0d65a2SJacob Faibussowitsch $ xxxxyyy1 = 0000,0001 - CUDA memory
18fe0d65a2SJacob Faibussowitsch $ xxxxyyy1 = 0001,0001 - CUDA NVSHMEM memory
19fe0d65a2SJacob Faibussowitsch $ xxxxyyy1 = 0000,0011 - HIP memory
20030f984aSJacob Faibussowitsch 
21030f984aSJacob Faibussowitsch   Other types of memory, e.g., CUDA managed memory, can be added when needed.
22030f984aSJacob Faibussowitsch 
23fe0d65a2SJacob Faibussowitsch   Level: beginner
24fe0d65a2SJacob Faibussowitsch 
25030f984aSJacob Faibussowitsch .seealso: VecGetArrayAndMemType(), PetscSFBcastWithMemTypeBegin(), PetscSFReduceWithMemTypeBegin()
26030f984aSJacob Faibussowitsch E*/
27fe0d65a2SJacob Faibussowitsch typedef enum {
28fe0d65a2SJacob Faibussowitsch   PETSC_MEMTYPE_HOST    = 0,
29fe0d65a2SJacob Faibussowitsch   PETSC_MEMTYPE_DEVICE  = 0x01,
30fe0d65a2SJacob Faibussowitsch   PETSC_MEMTYPE_CUDA    = 0x01,
31fe0d65a2SJacob Faibussowitsch   PETSC_MEMTYPE_NVSHMEM = 0x11,
32fe0d65a2SJacob Faibussowitsch   PETSC_MEMTYPE_HIP     = 0x03
33fe0d65a2SJacob Faibussowitsch } PetscMemType;
34030f984aSJacob Faibussowitsch 
35030f984aSJacob Faibussowitsch #define PetscMemTypeHost(m)    (((m) & 0x1) == PETSC_MEMTYPE_HOST)
36030f984aSJacob Faibussowitsch #define PetscMemTypeDevice(m)  (((m) & 0x1) == PETSC_MEMTYPE_DEVICE)
37030f984aSJacob Faibussowitsch #define PetscMemTypeCUDA(m)    (((m) & 0xF) == PETSC_MEMTYPE_CUDA)
38030f984aSJacob Faibussowitsch #define PetscMemTypeHIP(m)     (((m) & 0xF) == PETSC_MEMTYPE_HIP)
39030f984aSJacob Faibussowitsch #define PetscMemTypeNVSHMEM(m) ((m) == PETSC_MEMTYPE_NVSHMEM)
40030f984aSJacob Faibussowitsch 
41030f984aSJacob Faibussowitsch /*E
42030f984aSJacob Faibussowitsch   PetscOffloadMask - indicates which memory (CPU, GPU, or none) contains valid data
43030f984aSJacob Faibussowitsch 
44fe0d65a2SJacob Faibussowitsch $ PETSC_OFFLOAD_UNALLOCATED - no memory contains valid matrix entries; NEVER used for vectors
45fe0d65a2SJacob Faibussowitsch $ PETSC_OFFLOAD_GPU         - GPU has valid vector/matrix entries
46fe0d65a2SJacob Faibussowitsch $ PETSC_OFFLOAD_CPU         - CPU has valid vector/matrix entries
47fe0d65a2SJacob Faibussowitsch $ PETSC_OFFLOAD_BOTH        - Both GPU and CPU have valid vector/matrix entries and they match
48*ae76731bSJunchao 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.
49030f984aSJacob Faibussowitsch 
50030f984aSJacob Faibussowitsch   Level: developer
51030f984aSJacob Faibussowitsch E*/
52*ae76731bSJunchao Zhang #define PETSC_OFFLOAD_VECKOKKOS_DPRECATED PETSC_OFFLOAD_VECKOKKOS PETSC_DEPRECATED_ENUM("Use PETSC_OFFLOAD_KOKKOS (since version 3.17.0)")
53fe0d65a2SJacob Faibussowitsch typedef enum {
54fe0d65a2SJacob Faibussowitsch   PETSC_OFFLOAD_UNALLOCATED = 0x0,
55fe0d65a2SJacob Faibussowitsch   PETSC_OFFLOAD_CPU         = 0x1,
56fe0d65a2SJacob Faibussowitsch   PETSC_OFFLOAD_GPU         = 0x2,
57fe0d65a2SJacob Faibussowitsch   PETSC_OFFLOAD_BOTH        = 0x3,
58*ae76731bSJunchao Zhang   PETSC_OFFLOAD_VECKOKKOS_DPRECATED = 0x100,
59*ae76731bSJunchao Zhang   PETSC_OFFLOAD_KOKKOS      = 0x100
60fe0d65a2SJacob Faibussowitsch } PetscOffloadMask;
61030f984aSJacob Faibussowitsch 
62030f984aSJacob Faibussowitsch /*E
63a4af0ceeSJacob Faibussowitsch   PetscDeviceInitType - Initialization strategy for PetscDevice
64a4af0ceeSJacob Faibussowitsch 
65a4af0ceeSJacob Faibussowitsch $ PETSC_DEVICE_INIT_NONE  - PetscDevice is never initialized
66a4af0ceeSJacob Faibussowitsch $ PETSC_DEVICE_INIT_LAZY  - PetscDevice is initialized on demand
67a4af0ceeSJacob Faibussowitsch $ PETSC_DEVICE_INIT_EAGER - PetscDevice is initialized as soon as possible
68a4af0ceeSJacob Faibussowitsch 
69a4af0ceeSJacob Faibussowitsch   Notes:
70a4af0ceeSJacob Faibussowitsch   PETSC_DEVICE_INIT_NONE implies that any initialization of PetscDevice is disallowed and
71a4af0ceeSJacob Faibussowitsch   doing so results in an error. Useful to ensure that no accelerator is used in a program.
72a4af0ceeSJacob Faibussowitsch 
73a4af0ceeSJacob Faibussowitsch   Level: beginner
74a4af0ceeSJacob Faibussowitsch 
75a4af0ceeSJacob Faibussowitsch .seealso: PetscDevice, PetscDeviceType, PetscDeviceInitialize(), PetscDeviceInitialized(), PetscDeviceCreate()
76a4af0ceeSJacob Faibussowitsch E*/
77a4af0ceeSJacob Faibussowitsch typedef enum {
78a4af0ceeSJacob Faibussowitsch   PETSC_DEVICE_INIT_NONE,
79a4af0ceeSJacob Faibussowitsch   PETSC_DEVICE_INIT_LAZY,
80a4af0ceeSJacob Faibussowitsch   PETSC_DEVICE_INIT_EAGER
81a4af0ceeSJacob Faibussowitsch } PetscDeviceInitType;
82a4af0ceeSJacob Faibussowitsch PETSC_EXTERN const char *const PetscDeviceInitTypes[];
83a4af0ceeSJacob Faibussowitsch 
84a4af0ceeSJacob Faibussowitsch /*E
85a4af0ceeSJacob Faibussowitsch   PetscDeviceType - Kind of accelerator device backend
86030f984aSJacob Faibussowitsch 
87030f984aSJacob Faibussowitsch $ PETSC_DEVICE_INVALID - Invalid type, do not use
88030f984aSJacob Faibussowitsch $ PETSC_DEVICE_CUDA    - CUDA enabled GPU
89030f984aSJacob Faibussowitsch $ PETSC_DEVICE_HIP     - ROCM/HIP enabled GPU
90030f984aSJacob Faibussowitsch $ PETSC_DEVICE_DEFAULT - Automatically select backend based on availability
91a4af0ceeSJacob Faibussowitsch $ PETSC_DEVICE_MAX     - Always 1 greater than the largest valid PetscDeviceType, invalid type, do not use
92030f984aSJacob Faibussowitsch 
93030f984aSJacob Faibussowitsch   Notes:
94030f984aSJacob Faibussowitsch   PETSC_DEVICE_DEFAULT is selected in the following order: PETSC_DEVICE_HIP, PETSC_DEVICE_CUDA, PETSC_DEVICE_INVALID.
95030f984aSJacob Faibussowitsch 
96030f984aSJacob Faibussowitsch   Level: beginner
97030f984aSJacob Faibussowitsch 
98a4af0ceeSJacob Faibussowitsch .seealso: PetscDevice, PetscDeviceInitType, PetscDeviceCreate()
99030f984aSJacob Faibussowitsch E*/
100030f984aSJacob Faibussowitsch typedef enum {
101a4af0ceeSJacob Faibussowitsch   PETSC_DEVICE_INVALID,
102a4af0ceeSJacob Faibussowitsch   PETSC_DEVICE_CUDA,
103a4af0ceeSJacob Faibussowitsch   PETSC_DEVICE_HIP,
104a4af0ceeSJacob Faibussowitsch   PETSC_DEVICE_MAX
105a4af0ceeSJacob Faibussowitsch } PetscDeviceType;
106a4af0ceeSJacob Faibussowitsch PETSC_EXTERN const char *const PetscDeviceTypes[];
1075181c4f9SJacob Faibussowitsch #if PetscDefined(HAVE_HIP)
1085181c4f9SJacob Faibussowitsch #  define PETSC_DEVICE_DEFAULT PETSC_DEVICE_HIP
1095181c4f9SJacob Faibussowitsch #elif PetscDefined(HAVE_CUDA)
1105181c4f9SJacob Faibussowitsch #  define PETSC_DEVICE_DEFAULT PETSC_DEVICE_CUDA
1115181c4f9SJacob Faibussowitsch #else
1125181c4f9SJacob Faibussowitsch #  define PETSC_DEVICE_DEFAULT PETSC_DEVICE_INVALID
1135181c4f9SJacob Faibussowitsch #endif
114030f984aSJacob Faibussowitsch 
115030f984aSJacob Faibussowitsch /*S
116030f984aSJacob Faibussowitsch   PetscDevice - Handle to an accelerator "device" (usually a GPU)
117030f984aSJacob Faibussowitsch 
118030f984aSJacob Faibussowitsch   Notes:
119030f984aSJacob Faibussowitsch   This object is used to house configuration and state of a device, but does not offer any ability to interact with or
120030f984aSJacob Faibussowitsch   drive device computation. This functionality is facilitated instead by the PetscDeviceContext object.
121030f984aSJacob Faibussowitsch 
122030f984aSJacob Faibussowitsch   Level: beginner
123030f984aSJacob Faibussowitsch 
124a4af0ceeSJacob Faibussowitsch .seealso: PetscDeviceType, PetscDeviceInitType, PetscDeviceCreate(), PetscDeviceConfigure(), PetscDeviceDestroy(), PetscDeviceContext, PetscDeviceContextSetDevice(), PetscDeviceContextGetDevice()
125030f984aSJacob Faibussowitsch S*/
126030f984aSJacob Faibussowitsch typedef struct _n_PetscDevice *PetscDevice;
127030f984aSJacob Faibussowitsch 
128030f984aSJacob Faibussowitsch /*E
129030f984aSJacob Faibussowitsch   PetscStreamType - Stream blocking mode, indicates how a stream implementation will interact with the default "NULL"
130030f984aSJacob Faibussowitsch   stream, which is usually blocking.
131030f984aSJacob Faibussowitsch 
132030f984aSJacob 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.
133030f984aSJacob Faibussowitsch $ PETSC_STREAM_DEFAULT_BLOCKING   - Stream will act independent of other streams, but will still be blocked by actions on the NULL stream.
134030f984aSJacob Faibussowitsch $ PETSC_STREAM_GLOBAL_NONBLOCKING - Stream is truly asynchronous, and is blocked by nothing, not even the NULL stream.
135030f984aSJacob Faibussowitsch $ PETSC_STREAM_MAX                - Always 1 greater than the largest PetscStreamType, do not use
136030f984aSJacob Faibussowitsch 
137030f984aSJacob Faibussowitsch   Level: intermediate
138030f984aSJacob Faibussowitsch 
139030f984aSJacob Faibussowitsch .seealso: PetscDeviceContextSetStreamType(), PetscDeviceContextGetStreamType()
140030f984aSJacob Faibussowitsch E*/
141030f984aSJacob Faibussowitsch typedef enum {
142a4af0ceeSJacob Faibussowitsch   PETSC_STREAM_GLOBAL_BLOCKING,
143a4af0ceeSJacob Faibussowitsch   PETSC_STREAM_DEFAULT_BLOCKING,
144a4af0ceeSJacob Faibussowitsch   PETSC_STREAM_GLOBAL_NONBLOCKING,
145a4af0ceeSJacob Faibussowitsch   PETSC_STREAM_MAX
146030f984aSJacob Faibussowitsch } PetscStreamType;
147030f984aSJacob Faibussowitsch PETSC_EXTERN const char *const PetscStreamTypes[];
148030f984aSJacob Faibussowitsch 
149030f984aSJacob Faibussowitsch /*E
150030f984aSJacob Faibussowitsch   PetscDeviceContextJoinMode - Describes the type of join operation to perform in PetscDeviceContextJoin()
151030f984aSJacob Faibussowitsch 
152030f984aSJacob Faibussowitsch $ PETSC_DEVICE_CONTEXT_DESTROY - Destroy all incoming sub-contexts after join.
153030f984aSJacob Faibussowitsch $ PETSC_CONTEXT_JOIN_SYNC      - Synchronize incoming sub-contexts after join.
154030f984aSJacob Faibussowitsch $ PETSC_CONTEXT_JOIN_NO_SYNC   - Do not synchronize incoming sub-contexts after join.
155030f984aSJacob Faibussowitsch 
156030f984aSJacob Faibussowitsch   Level: beginner
157030f984aSJacob Faibussowitsch 
158a4af0ceeSJacob Faibussowitsch .seealso: PetscDeviceContext, PetscDeviceContextFork(), PetscDeviceContextJoin()
159030f984aSJacob Faibussowitsch E*/
160030f984aSJacob Faibussowitsch typedef enum {
161030f984aSJacob Faibussowitsch   PETSC_DEVICE_CONTEXT_JOIN_DESTROY,
162030f984aSJacob Faibussowitsch   PETSC_DEVICE_CONTEXT_JOIN_SYNC,
163030f984aSJacob Faibussowitsch   PETSC_DEVICE_CONTEXT_JOIN_NO_SYNC
164030f984aSJacob Faibussowitsch } PetscDeviceContextJoinMode;
165030f984aSJacob Faibussowitsch PETSC_EXTERN const char *const PetscDeviceContextJoinModes[];
166030f984aSJacob Faibussowitsch 
167030f984aSJacob Faibussowitsch /*S
168030f984aSJacob Faibussowitsch   PetscDeviceContext - Container to manage stream dependencies and the various solver handles for asynchronous device compute.
169030f984aSJacob Faibussowitsch 
170030f984aSJacob Faibussowitsch   Level: beginner
171030f984aSJacob Faibussowitsch 
172030f984aSJacob Faibussowitsch .seealso: PetscDevice, PetscDeviceContextCreate(), PetscDeviceContextSetDevice(), PetscDeviceContextDestroy(),
173030f984aSJacob Faibussowitsch PetscDeviceContextFork(), PetscDeviceContextJoin()
174030f984aSJacob Faibussowitsch S*/
175030f984aSJacob Faibussowitsch typedef struct _n_PetscDeviceContext *PetscDeviceContext;
176030f984aSJacob Faibussowitsch #endif /* PETSCDEVICETYPES_H */
177