xref: /petsc/include/petscdevice.h (revision 0e6b6b5985dd9b1172860d21fb88bd3966bf7c54)
1*0e6b6b59SJacob Faibussowitsch #ifndef PETSCDEVICE_H
2030f984aSJacob Faibussowitsch #define PETSCDEVICE_H
3030f984aSJacob Faibussowitsch 
4030f984aSJacob Faibussowitsch #include <petscdevicetypes.h>
5*0e6b6b59SJacob Faibussowitsch #include <petscviewertypes.h>
6030f984aSJacob Faibussowitsch 
7*0e6b6b59SJacob Faibussowitsch /* SUBMANSEC = Sys */
8030f984aSJacob Faibussowitsch 
9*0e6b6b59SJacob Faibussowitsch // REVIEW ME: this should probably go somewhere better, configure-time?
10*0e6b6b59SJacob Faibussowitsch #define PETSC_HAVE_HOST 1
11030f984aSJacob Faibussowitsch 
12*0e6b6b59SJacob Faibussowitsch /* logging support */
13*0e6b6b59SJacob Faibussowitsch PETSC_EXTERN PetscClassId PETSC_DEVICE_CLASSID;
14*0e6b6b59SJacob Faibussowitsch PETSC_EXTERN PetscClassId PETSC_DEVICE_CONTEXT_CLASSID;
15030f984aSJacob Faibussowitsch 
16030f984aSJacob Faibussowitsch PETSC_EXTERN PetscErrorCode PetscDeviceInitializePackage(void);
17030f984aSJacob Faibussowitsch PETSC_EXTERN PetscErrorCode PetscDeviceFinalizePackage(void);
18*0e6b6b59SJacob Faibussowitsch PETSC_EXTERN PetscErrorCode PetscGetMemType(const void *, PetscMemType *);
19030f984aSJacob Faibussowitsch 
20030f984aSJacob Faibussowitsch /* PetscDevice */
21*0e6b6b59SJacob Faibussowitsch #if PetscDefined(HAVE_CXX)
22a4af0ceeSJacob Faibussowitsch PETSC_EXTERN PetscErrorCode  PetscDeviceCreate(PetscDeviceType, PetscInt, PetscDevice *);
23*0e6b6b59SJacob Faibussowitsch PETSC_EXTERN PetscErrorCode  PetscDeviceDestroy(PetscDevice *);
24030f984aSJacob Faibussowitsch PETSC_EXTERN PetscErrorCode  PetscDeviceConfigure(PetscDevice);
25a4af0ceeSJacob Faibussowitsch PETSC_EXTERN PetscErrorCode  PetscDeviceView(PetscDevice, PetscViewer);
26*0e6b6b59SJacob Faibussowitsch PETSC_EXTERN PetscErrorCode  PetscDeviceGetType(PetscDevice, PetscDeviceType *);
2791e63d38SStefano Zampini PETSC_EXTERN PetscErrorCode  PetscDeviceGetDeviceId(PetscDevice, PetscInt *);
28*0e6b6b59SJacob Faibussowitsch PETSC_EXTERN PetscDeviceType PETSC_DEVICE_DEFAULT(void);
29*0e6b6b59SJacob Faibussowitsch PETSC_EXTERN PetscErrorCode  PetscDeviceSetDefaultDeviceType(PetscDeviceType);
30*0e6b6b59SJacob Faibussowitsch PETSC_EXTERN PetscErrorCode  PetscDeviceInitialize(PetscDeviceType);
31*0e6b6b59SJacob Faibussowitsch PETSC_EXTERN PetscBool       PetscDeviceInitialized(PetscDeviceType);
32*0e6b6b59SJacob Faibussowitsch #else
33*0e6b6b59SJacob Faibussowitsch #define PetscDeviceCreate(PetscDeviceType, PetscInt, dev) (*(dev) = PETSC_NULLPTR, 0)
34*0e6b6b59SJacob Faibussowitsch #define PetscDeviceDestroy(dev)                           (*(dev) = PETSC_NULLPTR, 0)
35*0e6b6b59SJacob Faibussowitsch #define PetscDeviceConfigure(PetscDevice)                 0
36*0e6b6b59SJacob Faibussowitsch #define PetscDeviceView(PetscDevice, PetscViewer)         0
37*0e6b6b59SJacob Faibussowitsch #define PetscDeviceGetType(PetscDevice, type)             (*(type) = PETSC_DEVICE_DEFAULT(), 0)
38*0e6b6b59SJacob Faibussowitsch #define PetscDeviceGetDeviceId(PetscDevice, id)           (*(id) = 0)
39*0e6b6b59SJacob Faibussowitsch #define PETSC_DEVICE_DEFAULT()                            PETSC_DEVICE_HOST
40*0e6b6b59SJacob Faibussowitsch #define PetscDeviceSetDefaultDeviceType(PetscDeviceType)  0
41*0e6b6b59SJacob Faibussowitsch #define PetscDeviceInitialize(PetscDeviceType)            0
42*0e6b6b59SJacob Faibussowitsch #define PetscDeviceInitialized(dtype)                     ((dtype) == PETSC_DEVICE_HOST)
43*0e6b6b59SJacob Faibussowitsch #endif /* PetscDefined(HAVE_CXX) */
44030f984aSJacob Faibussowitsch 
45030f984aSJacob Faibussowitsch /* PetscDeviceContext */
46*0e6b6b59SJacob Faibussowitsch #if PetscDefined(HAVE_CXX)
47030f984aSJacob Faibussowitsch PETSC_EXTERN PetscErrorCode PetscDeviceContextCreate(PetscDeviceContext *);
48030f984aSJacob Faibussowitsch PETSC_EXTERN PetscErrorCode PetscDeviceContextDestroy(PetscDeviceContext *);
49030f984aSJacob Faibussowitsch PETSC_EXTERN PetscErrorCode PetscDeviceContextSetStreamType(PetscDeviceContext, PetscStreamType);
50030f984aSJacob Faibussowitsch PETSC_EXTERN PetscErrorCode PetscDeviceContextGetStreamType(PetscDeviceContext, PetscStreamType *);
51*0e6b6b59SJacob Faibussowitsch PETSC_EXTERN PetscErrorCode PetscDeviceContextSetDevice(PetscDeviceContext, PetscDevice);
52*0e6b6b59SJacob Faibussowitsch PETSC_EXTERN PetscErrorCode PetscDeviceContextGetDevice(PetscDeviceContext, PetscDevice *);
53*0e6b6b59SJacob Faibussowitsch PETSC_EXTERN PetscErrorCode PetscDeviceContextGetDeviceType(PetscDeviceContext, PetscDeviceType *);
54030f984aSJacob Faibussowitsch PETSC_EXTERN PetscErrorCode PetscDeviceContextSetUp(PetscDeviceContext);
55030f984aSJacob Faibussowitsch PETSC_EXTERN PetscErrorCode PetscDeviceContextDuplicate(PetscDeviceContext, PetscDeviceContext *);
56030f984aSJacob Faibussowitsch PETSC_EXTERN PetscErrorCode PetscDeviceContextQueryIdle(PetscDeviceContext, PetscBool *);
57030f984aSJacob Faibussowitsch PETSC_EXTERN PetscErrorCode PetscDeviceContextWaitForContext(PetscDeviceContext, PetscDeviceContext);
58*0e6b6b59SJacob Faibussowitsch PETSC_EXTERN PetscErrorCode PetscDeviceContextForkWithStreamType(PetscDeviceContext, PetscStreamType, PetscInt, PetscDeviceContext **);
59030f984aSJacob Faibussowitsch PETSC_EXTERN PetscErrorCode PetscDeviceContextFork(PetscDeviceContext, PetscInt, PetscDeviceContext **);
60030f984aSJacob Faibussowitsch PETSC_EXTERN PetscErrorCode PetscDeviceContextJoin(PetscDeviceContext, PetscInt, PetscDeviceContextJoinMode, PetscDeviceContext **);
61030f984aSJacob Faibussowitsch PETSC_EXTERN PetscErrorCode PetscDeviceContextSynchronize(PetscDeviceContext);
62*0e6b6b59SJacob Faibussowitsch PETSC_EXTERN PetscErrorCode PetscDeviceContextSetFromOptions(MPI_Comm, PetscDeviceContext);
63*0e6b6b59SJacob Faibussowitsch PETSC_EXTERN PetscErrorCode PetscDeviceContextView(PetscDeviceContext, PetscViewer);
64*0e6b6b59SJacob Faibussowitsch PETSC_EXTERN PetscErrorCode PetscDeviceContextViewFromOptions(PetscDeviceContext, PetscObject, PetscViewer);
65030f984aSJacob Faibussowitsch PETSC_EXTERN PetscErrorCode PetscDeviceContextGetCurrentContext(PetscDeviceContext *);
66030f984aSJacob Faibussowitsch PETSC_EXTERN PetscErrorCode PetscDeviceContextSetCurrentContext(PetscDeviceContext);
67f61c9696SKaushik Kulkarni #else
68*0e6b6b59SJacob Faibussowitsch #define PetscDeviceContextCreate(dctx)                                                                            (*(dctx) = PETSC_NULLPTR, 0)
69*0e6b6b59SJacob Faibussowitsch #define PetscDeviceContextDestroy(dctx)                                                                           (*(dctx) = PETSC_NULLPTR, 0)
70*0e6b6b59SJacob Faibussowitsch #define PetscDeviceContextSetStreamType(PetscDeviceContext, PetscStreamType)                                      0
71*0e6b6b59SJacob Faibussowitsch #define PetscDeviceContextGetStreamType(PetscDeviceContext, type)                                                 (*(type) = PETSC_STREAM_GLOBAL_BLOCKING, 0)
72*0e6b6b59SJacob Faibussowitsch #define PetscDeviceContextSetDevice(PetscDeviceContext, PetscDevice)                                              0
73*0e6b6b59SJacob Faibussowitsch #define PetscDeviceContextGetDevice(PetscDeviceContext, device)                                                   (*(device) = PETSC_NULLPTR, 0)
74*0e6b6b59SJacob Faibussowitsch #define PetscDeviceContextGetDeviceType(PetscDeviceContext, type)                                                 (*(type) = PETSC_DEVICE_DEFAULT())
75*0e6b6b59SJacob Faibussowitsch #define PetscDeviceContextSetUp(PetscDeviceContext)                                                               0
76*0e6b6b59SJacob Faibussowitsch #define PetscDeviceContextDuplicate(PetscDeviceContextl, PetscDeviceContextr)                                     (*(PetscDeviceContextr) = PETSC_NULLPTR, 0)
77*0e6b6b59SJacob Faibussowitsch #define PetscDeviceContextQueryIdle(PetscDeviceContext, idle)                                                     (*(idle) = PETSC_TRUE, 0)
78*0e6b6b59SJacob Faibussowitsch #define PetscDeviceContextWaitForContext(PetscDeviceContextl, PetscDeviceContextr)                                0
79*0e6b6b59SJacob Faibussowitsch #define PetscDeviceContextForkWithStreamType(PetscDeviceContextp, PetscStreamType, PetscInt, PetscDeviceContextc) (*(PetscDeviceContextc) = PETSC_NULLPTR, 0)
80*0e6b6b59SJacob Faibussowitsch #define PetscDeviceContextFork(PetscDeviceContextp, PetscInt, PetscDeviceContextc)                                (*(PetscDeviceContextc) = PETSC_NULLPTR, 0)
81*0e6b6b59SJacob Faibussowitsch #define PetscDeviceContextJoin(PetscDeviceContextp, PetscInt, PetscDeviceContextJoinMode, PetscDeviceContextc)    (*(PetscDeviceContextc) = PETSC_NULLPTR, 0)
82*0e6b6b59SJacob Faibussowitsch #define PetscDeviceContextSynchronize(PetscDeviceContext)                                                         0
83*0e6b6b59SJacob Faibussowitsch #define PetscDeviceContextSetFromOptions(MPI_Comm, PetscDeviceContext)                                            0
84*0e6b6b59SJacob Faibussowitsch #define PetscDeviceContextView(PetscDeviceContext, PetscViewer)                                                   0
85*0e6b6b59SJacob Faibussowitsch #define PetscDeviceContextViewFromOptions(PetscDeviceContext, PetscObject, PetscViewer)                           0
86*0e6b6b59SJacob Faibussowitsch #define PetscDeviceContextGetCurrentContext(dctx)                                                                 (*(dctx) = PETSC_NULLPTR, 0)
87*0e6b6b59SJacob Faibussowitsch #define PetscDeviceContextSetCurrentContext(PetscDeviceContext)                                                   0
88*0e6b6b59SJacob Faibussowitsch #endif /* PetscDefined(HAVE_CXX) */
89*0e6b6b59SJacob Faibussowitsch 
90*0e6b6b59SJacob Faibussowitsch /* memory */
91*0e6b6b59SJacob Faibussowitsch #if PetscDefined(HAVE_CXX)
92*0e6b6b59SJacob Faibussowitsch PETSC_EXTERN PetscErrorCode PetscDeviceAllocate(PetscDeviceContext, PetscBool, PetscMemType, size_t, void **PETSC_RESTRICT);
93*0e6b6b59SJacob Faibussowitsch PETSC_EXTERN PetscErrorCode PetscDeviceDeallocate(PetscDeviceContext, void *PETSC_RESTRICT);
94*0e6b6b59SJacob Faibussowitsch PETSC_EXTERN PetscErrorCode PetscDeviceMemcpy(PetscDeviceContext, void *PETSC_RESTRICT, const void *PETSC_RESTRICT, size_t);
95*0e6b6b59SJacob Faibussowitsch PETSC_EXTERN PetscErrorCode PetscDeviceMemset(PetscDeviceContext, void *PETSC_RESTRICT, PetscInt, size_t);
96*0e6b6b59SJacob Faibussowitsch #else
97*0e6b6b59SJacob Faibussowitsch #include <string.h> // memset()
98*0e6b6b59SJacob Faibussowitsch #define PetscDeviceAllocate(PetscDeviceContext, clear, PetscMemType, size, ptr) PetscMallocA(1, (clear), __LINE__, PETSC_FUNCTION_NAME, __FILE__, (size), (ptr))
99*0e6b6b59SJacob Faibussowitsch #define PetscDeviceDeallocate(PetscDeviceContext, ptr)                          PetscFree((ptr))
100*0e6b6b59SJacob Faibussowitsch #define PetscDeviceMemcpy(PetscDeviceContext, dest, src, size)                  PetscMemcpy((dest), (src), (size))
101*0e6b6b59SJacob Faibussowitsch #define PetscDeviceMemset(PetscDeviceContext, ptr, v, size)                     ((void)memset((ptr), (unsigned char)(v), (size)), 0)
102*0e6b6b59SJacob Faibussowitsch #endif /* PetscDefined(HAVE_CXX) */
103*0e6b6b59SJacob Faibussowitsch 
104*0e6b6b59SJacob Faibussowitsch /*MC
105*0e6b6b59SJacob Faibussowitsch   PetscDeviceMalloc - Allocate device-aware memory
106*0e6b6b59SJacob Faibussowitsch 
107*0e6b6b59SJacob Faibussowitsch   Synopsis:
108*0e6b6b59SJacob Faibussowitsch   #include <petscdevice.h>
109*0e6b6b59SJacob Faibussowitsch   PetscErrorCode PetscDeviceMalloc(PetscDeviceContext dctx, PetscMemType mtype, size_t n, Type **ptr)
110*0e6b6b59SJacob Faibussowitsch 
111*0e6b6b59SJacob Faibussowitsch   Not Collective, Asynchronous, Auto-dependency aware
112*0e6b6b59SJacob Faibussowitsch 
113*0e6b6b59SJacob Faibussowitsch   Input Parameters:
114*0e6b6b59SJacob Faibussowitsch + dctx  - The `PetscDeviceContext` used to allocate the memory
115*0e6b6b59SJacob Faibussowitsch . mtype - The type of memory to allocate
116*0e6b6b59SJacob Faibussowitsch - n     - The amount (in elements) to allocate
117*0e6b6b59SJacob Faibussowitsch 
118*0e6b6b59SJacob Faibussowitsch   Output Parameter:
119*0e6b6b59SJacob Faibussowitsch . ptr - The pointer to store the result in
120*0e6b6b59SJacob Faibussowitsch 
121*0e6b6b59SJacob Faibussowitsch   Notes:
122*0e6b6b59SJacob Faibussowitsch   See `PetscDeviceAllocate()` for more detailed discussion on usage and async semantics.
123*0e6b6b59SJacob Faibussowitsch 
124*0e6b6b59SJacob Faibussowitsch   This uses the `sizeof()` of the memory type requested to determine the total memory to be
125*0e6b6b59SJacob Faibussowitsch   allocated, therefore you should not multiply the number of elements requested by the
126*0e6b6b59SJacob Faibussowitsch   `sizeof()` the type\:
127*0e6b6b59SJacob Faibussowitsch 
128*0e6b6b59SJacob Faibussowitsch .vb
129*0e6b6b59SJacob Faibussowitsch   PetscInt *arr;
130*0e6b6b59SJacob Faibussowitsch 
131*0e6b6b59SJacob Faibussowitsch   // correct
132*0e6b6b59SJacob Faibussowitsch   PetscDeviceMalloc(dctx,PETSC_MEMTYPE_DEVICE,n,&arr);
133*0e6b6b59SJacob Faibussowitsch 
134*0e6b6b59SJacob Faibussowitsch   // incorrect
135*0e6b6b59SJacob Faibussowitsch   PetscDeviceMalloc(dctx,PETSC_MEMTYPE_DEVICE,n*sizeof(*arr),&arr);
136*0e6b6b59SJacob Faibussowitsch .ve
137*0e6b6b59SJacob Faibussowitsch 
138*0e6b6b59SJacob Faibussowitsch   This routine falls back to using `PetscMalloc1()` (which is fully synchronous) if PETSc was
139*0e6b6b59SJacob Faibussowitsch   not configured with device support. The user should note that `mtype` is ignored in this
140*0e6b6b59SJacob Faibussowitsch   case, as `PetscMalloc1()` allocates only host memory.
141*0e6b6b59SJacob Faibussowitsch 
142*0e6b6b59SJacob Faibussowitsch   Level: beginner
143*0e6b6b59SJacob Faibussowitsch 
144*0e6b6b59SJacob Faibussowitsch .N ASYNC_API
145*0e6b6b59SJacob Faibussowitsch 
146*0e6b6b59SJacob Faibussowitsch .seealso: `PetscDeviceFree()`, `PetscDeviceCalloc()`, `PetscDeviceArrayCopy()`,
147*0e6b6b59SJacob Faibussowitsch `PetscDeviceArrayZero()`, `PetscDeviceAllocate()`, `PetscDeviceDeallocate()`
148*0e6b6b59SJacob Faibussowitsch M*/
149*0e6b6b59SJacob Faibussowitsch #define PetscDeviceMalloc(dctx, mtype, n, ptr) (PetscDefined(HAVE_DEVICE) ? PetscDeviceAllocate((dctx), PETSC_FALSE, (mtype), (size_t)(n) * sizeof(**(ptr)), (void **)(ptr)) : PetscMalloc1((n), (ptr)))
150*0e6b6b59SJacob Faibussowitsch 
151*0e6b6b59SJacob Faibussowitsch /*MC
152*0e6b6b59SJacob Faibussowitsch   PetscDeviceCalloc - Allocate zeroed device-aware memory
153*0e6b6b59SJacob Faibussowitsch 
154*0e6b6b59SJacob Faibussowitsch   Synopsis:
155*0e6b6b59SJacob Faibussowitsch   #include <petscdevice.h>
156*0e6b6b59SJacob Faibussowitsch   PetscErrorCode PetscDeviceCalloc(PetscDeviceContext dctx, PetscMemType mtype, size_t n, Type **ptr)
157*0e6b6b59SJacob Faibussowitsch 
158*0e6b6b59SJacob Faibussowitsch   Not Collective, Asynchronous, Auto-dependency aware
159*0e6b6b59SJacob Faibussowitsch 
160*0e6b6b59SJacob Faibussowitsch   Input Parameters:
161*0e6b6b59SJacob Faibussowitsch + dctx  - The `PetscDeviceContext` used to allocate the memory
162*0e6b6b59SJacob Faibussowitsch . mtype - The type of memory to allocate
163*0e6b6b59SJacob Faibussowitsch - n     - The amount (in elements) to allocate
164*0e6b6b59SJacob Faibussowitsch 
165*0e6b6b59SJacob Faibussowitsch   Output Parameter:
166*0e6b6b59SJacob Faibussowitsch . ptr - The pointer to store the result in
167*0e6b6b59SJacob Faibussowitsch 
168*0e6b6b59SJacob Faibussowitsch   Notes:
169*0e6b6b59SJacob Faibussowitsch   Has identical usage to `PetscDeviceMalloc()` except that the memory is zeroed before it is
170*0e6b6b59SJacob Faibussowitsch   returned. See `PetscDeviceMalloc()` for further discussion.
171*0e6b6b59SJacob Faibussowitsch 
172*0e6b6b59SJacob Faibussowitsch   This routine falls back to using `PetscCalloc1()` if PETSc was not configured with device
173*0e6b6b59SJacob Faibussowitsch   support. The user should note that `mtype` is ignored in this case, as `PetscCalloc1()`
174*0e6b6b59SJacob Faibussowitsch   allocates only host memory.
175*0e6b6b59SJacob Faibussowitsch 
176*0e6b6b59SJacob Faibussowitsch   Level: beginner
177*0e6b6b59SJacob Faibussowitsch 
178*0e6b6b59SJacob Faibussowitsch .N ASYNC_API
179*0e6b6b59SJacob Faibussowitsch 
180*0e6b6b59SJacob Faibussowitsch .seealso: `PetscDeviceFree()`, `PetscDeviceMalloc()`, `PetscDeviceArrayCopy()`,
181*0e6b6b59SJacob Faibussowitsch `PetscDeviceArrayZero()`, `PetscDeviceAllocate()`, `PetscDeviceDeallocate()`
182*0e6b6b59SJacob Faibussowitsch M*/
183*0e6b6b59SJacob Faibussowitsch #define PetscDeviceCalloc(dctx, mtype, n, ptr) (PetscDefined(HAVE_DEVICE) ? PetscDeviceAllocate((dctx), PETSC_TRUE, (mtype), (size_t)(n) * sizeof(**(ptr)), (void **)(ptr)) : PetscCalloc1((n), (ptr)))
184*0e6b6b59SJacob Faibussowitsch 
185*0e6b6b59SJacob Faibussowitsch /*MC
186*0e6b6b59SJacob Faibussowitsch   PetscDeviceFree - Free device-aware memory
187*0e6b6b59SJacob Faibussowitsch 
188*0e6b6b59SJacob Faibussowitsch   Synopsis:
189*0e6b6b59SJacob Faibussowitsch   #include <petscdevice.h>
190*0e6b6b59SJacob Faibussowitsch   PetscErrorCode PetscDeviceFree(PetscDeviceContext dctx, void *ptr)
191*0e6b6b59SJacob Faibussowitsch 
192*0e6b6b59SJacob Faibussowitsch   Not Collective, Asynchronous, Auto-dependency aware
193*0e6b6b59SJacob Faibussowitsch 
194*0e6b6b59SJacob Faibussowitsch   Input Parameters:
195*0e6b6b59SJacob Faibussowitsch + dctx - The `PetscDeviceContext` used to free the memory
196*0e6b6b59SJacob Faibussowitsch - ptr  - The pointer to free
197*0e6b6b59SJacob Faibussowitsch 
198*0e6b6b59SJacob Faibussowitsch   Notes:
199*0e6b6b59SJacob Faibussowitsch   `ptr` must have been allocated using `PetscDeviceMalloc()`, `PetscDeviceCalloc()`, or
200*0e6b6b59SJacob Faibussowitsch   `PetscDeviceAllocate()`, or registered with the system using `PetscRegisterMemory()`.
201*0e6b6b59SJacob Faibussowitsch 
202*0e6b6b59SJacob Faibussowitsch   Automatically sets `ptr` to `PETSC_NULLPTR` on successful deallocation.
203*0e6b6b59SJacob Faibussowitsch 
204*0e6b6b59SJacob Faibussowitsch   This routine falls back to using `PetscFree()` if PETSc was not configured with device
205*0e6b6b59SJacob Faibussowitsch   support. The user should note that `PetscFree()` frees only host memory.
206*0e6b6b59SJacob Faibussowitsch 
207*0e6b6b59SJacob Faibussowitsch   See `PetscDeviceDeallocate()` for more further discussion.
208*0e6b6b59SJacob Faibussowitsch 
209*0e6b6b59SJacob Faibussowitsch   Level: beginner
210*0e6b6b59SJacob Faibussowitsch 
211*0e6b6b59SJacob Faibussowitsch .N ASYNC_API
212*0e6b6b59SJacob Faibussowitsch 
213*0e6b6b59SJacob Faibussowitsch .seealso: `PetscDeviceMalloc()`, `PetscDeviceCalloc()`, `PetscDeviceDeallocate()`
214*0e6b6b59SJacob Faibussowitsch M*/
215*0e6b6b59SJacob Faibussowitsch #define PetscDeviceFree(dctx, ptr) ((ptr) ? (PetscDefined(HAVE_DEVICE) ? (PetscDeviceDeallocate((dctx), (ptr)) || ((ptr) = PETSC_NULLPTR, 0)) : PetscFree(ptr)) : 0)
216*0e6b6b59SJacob Faibussowitsch 
217*0e6b6b59SJacob Faibussowitsch /*MC
218*0e6b6b59SJacob Faibussowitsch   PetscDeviceArrayCopy - Copy memory in a device-aware manner
219*0e6b6b59SJacob Faibussowitsch 
220*0e6b6b59SJacob Faibussowitsch   Synopsis:
221*0e6b6b59SJacob Faibussowitsch   #include <petscdevice.h>
222*0e6b6b59SJacob Faibussowitsch   PetscErrorCode PetscDeviceArrayCopy(PetscDeviceContext dctx, void *PETSC_RESTRICT dest, const void *PETSC_RESTRICT src, size_t n, PetscDeviceCopyMode mode)
223*0e6b6b59SJacob Faibussowitsch 
224*0e6b6b59SJacob Faibussowitsch   Not Collective, Asynchronous, Auto-dependency aware
225*0e6b6b59SJacob Faibussowitsch 
226*0e6b6b59SJacob Faibussowitsch   Input Parameters:
227*0e6b6b59SJacob Faibussowitsch + dctx - The `PetscDeviceContext` used to copy the memory
228*0e6b6b59SJacob Faibussowitsch . dest - The pointer to copy to
229*0e6b6b59SJacob Faibussowitsch . src  - The pointer to copy from
230*0e6b6b59SJacob Faibussowitsch - n    - The amount (in elements) to copy
231*0e6b6b59SJacob Faibussowitsch 
232*0e6b6b59SJacob Faibussowitsch   Notes:
233*0e6b6b59SJacob Faibussowitsch   Both `dest` and `src` must have been allocated using any of `PetscDeviceMalloc()`,
234*0e6b6b59SJacob Faibussowitsch   `PetscDeviceCalloc()` or `PetscDeviceAllocate()`, or registered with the system via
235*0e6b6b59SJacob Faibussowitsch   `PetscDeviceRegisterMemory()`.
236*0e6b6b59SJacob Faibussowitsch 
237*0e6b6b59SJacob Faibussowitsch   This uses the `sizeof()` of the `src` memory type requested to determine the total memory to
238*0e6b6b59SJacob Faibussowitsch   be copied, therefore you should not multiply the number of elements by the `sizeof()` the
239*0e6b6b59SJacob Faibussowitsch   type\:
240*0e6b6b59SJacob Faibussowitsch 
241*0e6b6b59SJacob Faibussowitsch .vb
242*0e6b6b59SJacob Faibussowitsch   PetscInt *to,*from;
243*0e6b6b59SJacob Faibussowitsch 
244*0e6b6b59SJacob Faibussowitsch   // correct
245*0e6b6b59SJacob Faibussowitsch   PetscDeviceArrayCopy(dctx,to,from,n,PETSC_DEVICE_COPY_AUTO);
246*0e6b6b59SJacob Faibussowitsch 
247*0e6b6b59SJacob Faibussowitsch   // incorrect
248*0e6b6b59SJacob Faibussowitsch   PetscDeviceArrayCopy(dctx,to,from,n*sizeof(*from),PETSC_DEVICE_COPY_AUTO);
249*0e6b6b59SJacob Faibussowitsch .ve
250*0e6b6b59SJacob Faibussowitsch 
251*0e6b6b59SJacob Faibussowitsch   See `PetscDeviceMemcpy()` for further discussion.
252*0e6b6b59SJacob Faibussowitsch 
253*0e6b6b59SJacob Faibussowitsch   Level: beginner
254*0e6b6b59SJacob Faibussowitsch 
255*0e6b6b59SJacob Faibussowitsch .N ASYNC_API
256*0e6b6b59SJacob Faibussowitsch 
257*0e6b6b59SJacob Faibussowitsch .seealso: `PetscDeviceMalloc()`, `PetscDeviceCalloc()`, `PetscDeviceRegisterMemory()`,
258*0e6b6b59SJacob Faibussowitsch `PetscDeviceFree()`, `PetscDeviceArrayZero()`, `PetscDeviceMemcpy()`
259*0e6b6b59SJacob Faibussowitsch M*/
260*0e6b6b59SJacob Faibussowitsch #define PetscDeviceArrayCopy(dctx, dest, src, n) ((n) ? (PetscDefined(HAVE_DEVICE) ? PetscDeviceMemcpy((dctx), (dest), (src), (size_t)(n) * sizeof(*(src))) : PetscArraycpy((dest), (src), (n))) : 0)
261*0e6b6b59SJacob Faibussowitsch 
262*0e6b6b59SJacob Faibussowitsch /*MC
263*0e6b6b59SJacob Faibussowitsch   PetscDeviceArrayZero - Zero memory in a device-aware manner
264*0e6b6b59SJacob Faibussowitsch 
265*0e6b6b59SJacob Faibussowitsch   Synopsis:
266*0e6b6b59SJacob Faibussowitsch   #include <petscdevice.h>
267*0e6b6b59SJacob Faibussowitsch   PetscErrorCode PetscDeviceArrayZero(PetscDeviceContext dctx, PetscMemType mtype, void *ptr, size_t n)
268*0e6b6b59SJacob Faibussowitsch 
269*0e6b6b59SJacob Faibussowitsch   Not Collective, Asynchronous, Auto-dependency aware
270*0e6b6b59SJacob Faibussowitsch 
271*0e6b6b59SJacob Faibussowitsch   Input Parameters:
272*0e6b6b59SJacob Faibussowitsch + dctx  - The `PetscDeviceContext` used to zero the memory
273*0e6b6b59SJacob Faibussowitsch . ptr   - The pointer to the memory
274*0e6b6b59SJacob Faibussowitsch - n     - The amount (in elements) to zero
275*0e6b6b59SJacob Faibussowitsch 
276*0e6b6b59SJacob Faibussowitsch   Notes:
277*0e6b6b59SJacob Faibussowitsch   `ptr` must have been allocated using any of `PetscDeviceMalloc()`, `PetscDeviceCalloc()` or
278*0e6b6b59SJacob Faibussowitsch   `PetscDeviceAllocate()`, or registered with the system via `PetscDeviceRegisterMemory()`.
279*0e6b6b59SJacob Faibussowitsch 
280*0e6b6b59SJacob Faibussowitsch   This uses the `sizeof()` of the memory type requested to determine the total memory to be
281*0e6b6b59SJacob Faibussowitsch   zeroed, therefore you should not multiply the number of elements by the `sizeof()` the type\:
282*0e6b6b59SJacob Faibussowitsch 
283*0e6b6b59SJacob Faibussowitsch .vb
284*0e6b6b59SJacob Faibussowitsch   PetscInt *ptr;
285*0e6b6b59SJacob Faibussowitsch 
286*0e6b6b59SJacob Faibussowitsch   // correct
287*0e6b6b59SJacob Faibussowitsch   PetscDeviceArrayZero(dctx,PETSC_MEMTYPE_DEVICE,ptr,n);
288*0e6b6b59SJacob Faibussowitsch 
289*0e6b6b59SJacob Faibussowitsch   // incorrect
290*0e6b6b59SJacob Faibussowitsch   PetscDeviceArrayZero(dctx,PETSC_MEMTYPE_DEVICE,ptr,n*sizeof(*ptr));
291*0e6b6b59SJacob Faibussowitsch .ve
292*0e6b6b59SJacob Faibussowitsch 
293*0e6b6b59SJacob Faibussowitsch   See `PetscDeviceMemset()` for futher discussion.
294*0e6b6b59SJacob Faibussowitsch 
295*0e6b6b59SJacob Faibussowitsch   Level: beginner
296*0e6b6b59SJacob Faibussowitsch 
297*0e6b6b59SJacob Faibussowitsch .N ASYNC_API
298*0e6b6b59SJacob Faibussowitsch 
299*0e6b6b59SJacob Faibussowitsch .seealso: `PetscDeviceMalloc()`, `PetscDeviceCalloc()`, `PetscDeviceRegisterMemory()`,
300*0e6b6b59SJacob Faibussowitsch `PetscDeviceFree()`, `PetscDeviceArrayCopy()`, `PetscDeviceMemset()`
301*0e6b6b59SJacob Faibussowitsch M*/
302*0e6b6b59SJacob Faibussowitsch #define PetscDeviceArrayZero(dctx, ptr, n) ((n) ? (PetscDefined(HAVE_DEVICE) ? PetscDeviceMemset((dctx), (ptr), 0, (size_t)(n) * sizeof(*(ptr))) : PetscArrayzero((ptr), (n))) : 0)
30398921bdaSJacob Faibussowitsch 
304030f984aSJacob Faibussowitsch #endif /* PETSCDEVICE_H */
305