xref: /petsc/include/petscdevice.h (revision 017deb10d530c1b6d9744fcd772cd96c5fcd74f2)
1a4963045SJacob Faibussowitsch #pragma once
2030f984aSJacob Faibussowitsch 
3030f984aSJacob Faibussowitsch #include <petscdevicetypes.h>
40e6b6b59SJacob Faibussowitsch #include <petscviewertypes.h>
5030f984aSJacob Faibussowitsch 
66797ed33SJacob Faibussowitsch #if PETSC_CPP_VERSION >= 11 // C++11
76797ed33SJacob Faibussowitsch   #define PETSC_DEVICE_ALIGNOF(...) alignof(decltype(__VA_ARGS__))
86797ed33SJacob Faibussowitsch #elif PETSC_C_VERSION >= 11 // C11
96797ed33SJacob Faibussowitsch   #ifdef __GNUC__
106797ed33SJacob Faibussowitsch     #define PETSC_DEVICE_ALIGNOF(...) _Alignof(__typeof__(__VA_ARGS__))
116797ed33SJacob Faibussowitsch   #else
126797ed33SJacob Faibussowitsch     #include <stddef.h> // max_align_t
136797ed33SJacob Faibussowitsch     // Note we cannot just do _Alignof(expression) since clang warns that "'_Alignof' applied to an
146797ed33SJacob Faibussowitsch     // expression is a GNU extension", so we just default to max_align_t which is ultra safe
156797ed33SJacob Faibussowitsch     #define PETSC_DEVICE_ALIGNOF(...) _Alignof(max_align_t)
166797ed33SJacob Faibussowitsch   #endif // __GNUC__
176797ed33SJacob Faibussowitsch #else
186797ed33SJacob Faibussowitsch   #define PETSC_DEVICE_ALIGNOF(...) PETSC_MEMALIGN
196797ed33SJacob Faibussowitsch #endif
206797ed33SJacob Faibussowitsch 
21*ce78bad3SBarry Smith /* MANSEC = Sys */
22*ce78bad3SBarry Smith /* SUBMANSEC = Device */
23030f984aSJacob Faibussowitsch 
240e6b6b59SJacob Faibussowitsch // REVIEW ME: this should probably go somewhere better, configure-time?
250e6b6b59SJacob Faibussowitsch #define PETSC_HAVE_HOST 1
26030f984aSJacob Faibussowitsch 
270e6b6b59SJacob Faibussowitsch /* logging support */
280e6b6b59SJacob Faibussowitsch PETSC_EXTERN PetscClassId PETSC_DEVICE_CLASSID;
290e6b6b59SJacob Faibussowitsch PETSC_EXTERN PetscClassId PETSC_DEVICE_CONTEXT_CLASSID;
30030f984aSJacob Faibussowitsch 
31030f984aSJacob Faibussowitsch PETSC_EXTERN PetscErrorCode PetscDeviceInitializePackage(void);
32030f984aSJacob Faibussowitsch PETSC_EXTERN PetscErrorCode PetscDeviceFinalizePackage(void);
330e6b6b59SJacob Faibussowitsch PETSC_EXTERN PetscErrorCode PetscGetMemType(const void *, PetscMemType *);
34030f984aSJacob Faibussowitsch 
35030f984aSJacob Faibussowitsch /* PetscDevice */
36a4af0ceeSJacob Faibussowitsch PETSC_EXTERN PetscErrorCode  PetscDeviceCreate(PetscDeviceType, PetscInt, PetscDevice *);
370e6b6b59SJacob Faibussowitsch PETSC_EXTERN PetscErrorCode  PetscDeviceDestroy(PetscDevice *);
38030f984aSJacob Faibussowitsch PETSC_EXTERN PetscErrorCode  PetscDeviceConfigure(PetscDevice);
39a4af0ceeSJacob Faibussowitsch PETSC_EXTERN PetscErrorCode  PetscDeviceView(PetscDevice, PetscViewer);
400e6b6b59SJacob Faibussowitsch PETSC_EXTERN PetscErrorCode  PetscDeviceGetType(PetscDevice, PetscDeviceType *);
4191e63d38SStefano Zampini PETSC_EXTERN PetscErrorCode  PetscDeviceGetDeviceId(PetscDevice, PetscInt *);
420e6b6b59SJacob Faibussowitsch PETSC_EXTERN PetscDeviceType PETSC_DEVICE_DEFAULT(void);
430e6b6b59SJacob Faibussowitsch PETSC_EXTERN PetscErrorCode  PetscDeviceSetDefaultDeviceType(PetscDeviceType);
440e6b6b59SJacob Faibussowitsch PETSC_EXTERN PetscErrorCode  PetscDeviceInitialize(PetscDeviceType);
450e6b6b59SJacob Faibussowitsch PETSC_EXTERN PetscBool       PetscDeviceInitialized(PetscDeviceType);
46030f984aSJacob Faibussowitsch 
47030f984aSJacob Faibussowitsch /* PetscDeviceContext */
48030f984aSJacob Faibussowitsch PETSC_EXTERN PetscErrorCode PetscDeviceContextCreate(PetscDeviceContext *);
49030f984aSJacob Faibussowitsch PETSC_EXTERN PetscErrorCode PetscDeviceContextDestroy(PetscDeviceContext *);
50030f984aSJacob Faibussowitsch PETSC_EXTERN PetscErrorCode PetscDeviceContextSetStreamType(PetscDeviceContext, PetscStreamType);
51030f984aSJacob Faibussowitsch PETSC_EXTERN PetscErrorCode PetscDeviceContextGetStreamType(PetscDeviceContext, PetscStreamType *);
520e6b6b59SJacob Faibussowitsch PETSC_EXTERN PetscErrorCode PetscDeviceContextSetDevice(PetscDeviceContext, PetscDevice);
530e6b6b59SJacob Faibussowitsch PETSC_EXTERN PetscErrorCode PetscDeviceContextGetDevice(PetscDeviceContext, PetscDevice *);
540e6b6b59SJacob Faibussowitsch PETSC_EXTERN PetscErrorCode PetscDeviceContextGetDeviceType(PetscDeviceContext, PetscDeviceType *);
55030f984aSJacob Faibussowitsch PETSC_EXTERN PetscErrorCode PetscDeviceContextSetUp(PetscDeviceContext);
56030f984aSJacob Faibussowitsch PETSC_EXTERN PetscErrorCode PetscDeviceContextDuplicate(PetscDeviceContext, PetscDeviceContext *);
57030f984aSJacob Faibussowitsch PETSC_EXTERN PetscErrorCode PetscDeviceContextQueryIdle(PetscDeviceContext, PetscBool *);
58030f984aSJacob Faibussowitsch PETSC_EXTERN PetscErrorCode PetscDeviceContextWaitForContext(PetscDeviceContext, PetscDeviceContext);
590e6b6b59SJacob Faibussowitsch PETSC_EXTERN PetscErrorCode PetscDeviceContextForkWithStreamType(PetscDeviceContext, PetscStreamType, PetscInt, PetscDeviceContext **);
60030f984aSJacob Faibussowitsch PETSC_EXTERN PetscErrorCode PetscDeviceContextFork(PetscDeviceContext, PetscInt, PetscDeviceContext **);
61030f984aSJacob Faibussowitsch PETSC_EXTERN PetscErrorCode PetscDeviceContextJoin(PetscDeviceContext, PetscInt, PetscDeviceContextJoinMode, PetscDeviceContext **);
62030f984aSJacob Faibussowitsch PETSC_EXTERN PetscErrorCode PetscDeviceContextSynchronize(PetscDeviceContext);
630e6b6b59SJacob Faibussowitsch PETSC_EXTERN PetscErrorCode PetscDeviceContextSetFromOptions(MPI_Comm, PetscDeviceContext);
640e6b6b59SJacob Faibussowitsch PETSC_EXTERN PetscErrorCode PetscDeviceContextView(PetscDeviceContext, PetscViewer);
65*ce78bad3SBarry Smith PETSC_EXTERN PetscErrorCode PetscDeviceContextViewFromOptions(PetscDeviceContext, PetscObject, const char[]);
66030f984aSJacob Faibussowitsch PETSC_EXTERN PetscErrorCode PetscDeviceContextGetCurrentContext(PetscDeviceContext *);
67030f984aSJacob Faibussowitsch PETSC_EXTERN PetscErrorCode PetscDeviceContextSetCurrentContext(PetscDeviceContext);
688a4d221bSJacob Faibussowitsch PETSC_EXTERN PetscErrorCode PetscDeviceContextGetStreamHandle(PetscDeviceContext, void **);
690e6b6b59SJacob Faibussowitsch 
700e6b6b59SJacob Faibussowitsch /* memory */
716797ed33SJacob Faibussowitsch PETSC_EXTERN PetscErrorCode PetscDeviceAllocate_Private(PetscDeviceContext, PetscBool, PetscMemType, size_t, size_t, void **PETSC_RESTRICT);
726797ed33SJacob Faibussowitsch PETSC_EXTERN PetscErrorCode PetscDeviceDeallocate_Private(PetscDeviceContext, void *PETSC_RESTRICT);
730e6b6b59SJacob Faibussowitsch PETSC_EXTERN PetscErrorCode PetscDeviceMemcpy(PetscDeviceContext, void *PETSC_RESTRICT, const void *PETSC_RESTRICT, size_t);
740e6b6b59SJacob Faibussowitsch PETSC_EXTERN PetscErrorCode PetscDeviceMemset(PetscDeviceContext, void *PETSC_RESTRICT, PetscInt, size_t);
750e6b6b59SJacob Faibussowitsch 
760e6b6b59SJacob Faibussowitsch /*MC
770e6b6b59SJacob Faibussowitsch   PetscDeviceMalloc - Allocate device-aware memory
780e6b6b59SJacob Faibussowitsch 
790e6b6b59SJacob Faibussowitsch   Synopsis:
800e6b6b59SJacob Faibussowitsch   #include <petscdevice.h>
810e6b6b59SJacob Faibussowitsch   PetscErrorCode PetscDeviceMalloc(PetscDeviceContext dctx, PetscMemType mtype, size_t n, Type **ptr)
820e6b6b59SJacob Faibussowitsch 
830e6b6b59SJacob Faibussowitsch   Not Collective, Asynchronous, Auto-dependency aware
840e6b6b59SJacob Faibussowitsch 
850e6b6b59SJacob Faibussowitsch   Input Parameters:
860e6b6b59SJacob Faibussowitsch + dctx  - The `PetscDeviceContext` used to allocate the memory
870e6b6b59SJacob Faibussowitsch . mtype - The type of memory to allocate
880e6b6b59SJacob Faibussowitsch - n     - The amount (in elements) to allocate
890e6b6b59SJacob Faibussowitsch 
900e6b6b59SJacob Faibussowitsch   Output Parameter:
910e6b6b59SJacob Faibussowitsch . ptr - The pointer to store the result in
920e6b6b59SJacob Faibussowitsch 
9395bd0b28SBarry Smith   Level: beginner
9495bd0b28SBarry Smith 
950e6b6b59SJacob Faibussowitsch   Notes:
966797ed33SJacob Faibussowitsch   Memory allocated with this function must be freed with `PetscDeviceFree()`.
970e6b6b59SJacob Faibussowitsch 
986797ed33SJacob Faibussowitsch   If `n` is zero, then `ptr` is set to `PETSC_NULLPTR`.
996797ed33SJacob Faibussowitsch 
1006797ed33SJacob Faibussowitsch   This routine falls back to using `PetscMalloc1()` if PETSc was not configured with device
1016797ed33SJacob Faibussowitsch   support. The user should note that `mtype` is ignored in this case, as `PetscMalloc1()`
1026797ed33SJacob Faibussowitsch   allocates only host memory.
1036797ed33SJacob Faibussowitsch 
1046797ed33SJacob Faibussowitsch   This routine uses the `sizeof()` of the memory type requested to determine the total memory
1056797ed33SJacob Faibussowitsch   to be allocated, therefore you should not multiply the number of elements requested by the
1060e6b6b59SJacob Faibussowitsch   `sizeof()` the type\:
1070e6b6b59SJacob Faibussowitsch 
1080e6b6b59SJacob Faibussowitsch .vb
1090e6b6b59SJacob Faibussowitsch   PetscInt *arr;
1100e6b6b59SJacob Faibussowitsch 
1110e6b6b59SJacob Faibussowitsch   // correct
1120e6b6b59SJacob Faibussowitsch   PetscDeviceMalloc(dctx,PETSC_MEMTYPE_DEVICE,n,&arr);
1130e6b6b59SJacob Faibussowitsch 
1140e6b6b59SJacob Faibussowitsch   // incorrect
1150e6b6b59SJacob Faibussowitsch   PetscDeviceMalloc(dctx,PETSC_MEMTYPE_DEVICE,n*sizeof(*arr),&arr);
1160e6b6b59SJacob Faibussowitsch .ve
1170e6b6b59SJacob Faibussowitsch 
1186797ed33SJacob Faibussowitsch   Note result stored `ptr` is immediately valid and the user may freely inspect or manipulate
1196797ed33SJacob Faibussowitsch   its value on function return, i.e.\:
1206797ed33SJacob Faibussowitsch 
1216797ed33SJacob Faibussowitsch .vb
1226797ed33SJacob Faibussowitsch   PetscInt *ptr;
1236797ed33SJacob Faibussowitsch 
1246797ed33SJacob Faibussowitsch   PetscDeviceMalloc(dctx, PETSC_MEMTYPE_DEVICE, 20, &ptr);
1256797ed33SJacob Faibussowitsch 
1266797ed33SJacob Faibussowitsch   PetscInt *sub_ptr = ptr + 10; // OK, no need to synchronize
1276797ed33SJacob Faibussowitsch 
1286797ed33SJacob Faibussowitsch   ptr[0] = 10; // ERROR, directly accessing contents of ptr is undefined until synchronization
1296797ed33SJacob Faibussowitsch .ve
1306797ed33SJacob Faibussowitsch 
1316797ed33SJacob Faibussowitsch   DAG representation:
1326797ed33SJacob Faibussowitsch .vb
1336797ed33SJacob Faibussowitsch   time ->
1346797ed33SJacob Faibussowitsch 
1356797ed33SJacob Faibussowitsch   -> dctx - |= CALL =| -\- dctx -->
1366797ed33SJacob Faibussowitsch                          \- ptr ->
1376797ed33SJacob Faibussowitsch .ve
1380e6b6b59SJacob Faibussowitsch 
1390e6b6b59SJacob Faibussowitsch .N ASYNC_API
1400e6b6b59SJacob Faibussowitsch 
1410e6b6b59SJacob Faibussowitsch .seealso: `PetscDeviceFree()`, `PetscDeviceCalloc()`, `PetscDeviceArrayCopy()`,
1426797ed33SJacob Faibussowitsch `PetscDeviceArrayZero()`
1430e6b6b59SJacob Faibussowitsch M*/
1446797ed33SJacob Faibussowitsch #define PetscDeviceMalloc(dctx, mtype, n, ptr) PetscDeviceAllocate_Private((dctx), PETSC_FALSE, (mtype), (size_t)(n) * sizeof(**(ptr)), PETSC_DEVICE_ALIGNOF(**(ptr)), (void **)(ptr))
1450e6b6b59SJacob Faibussowitsch 
1460e6b6b59SJacob Faibussowitsch /*MC
1470e6b6b59SJacob Faibussowitsch   PetscDeviceCalloc - Allocate zeroed device-aware memory
1480e6b6b59SJacob Faibussowitsch 
1490e6b6b59SJacob Faibussowitsch   Synopsis:
1500e6b6b59SJacob Faibussowitsch   #include <petscdevice.h>
1510e6b6b59SJacob Faibussowitsch   PetscErrorCode PetscDeviceCalloc(PetscDeviceContext dctx, PetscMemType mtype, size_t n, Type **ptr)
1520e6b6b59SJacob Faibussowitsch 
1530e6b6b59SJacob Faibussowitsch   Not Collective, Asynchronous, Auto-dependency aware
1540e6b6b59SJacob Faibussowitsch 
1550e6b6b59SJacob Faibussowitsch   Input Parameters:
1560e6b6b59SJacob Faibussowitsch + dctx  - The `PetscDeviceContext` used to allocate the memory
1570e6b6b59SJacob Faibussowitsch . mtype - The type of memory to allocate
1580e6b6b59SJacob Faibussowitsch - n     - The amount (in elements) to allocate
1590e6b6b59SJacob Faibussowitsch 
1600e6b6b59SJacob Faibussowitsch   Output Parameter:
1610e6b6b59SJacob Faibussowitsch . ptr - The pointer to store the result in
1620e6b6b59SJacob Faibussowitsch 
16395bd0b28SBarry Smith   Level: beginner
16495bd0b28SBarry Smith 
1650e6b6b59SJacob Faibussowitsch   Notes:
1660e6b6b59SJacob Faibussowitsch   Has identical usage to `PetscDeviceMalloc()` except that the memory is zeroed before it is
1670e6b6b59SJacob Faibussowitsch   returned. See `PetscDeviceMalloc()` for further discussion.
1680e6b6b59SJacob Faibussowitsch 
1690e6b6b59SJacob Faibussowitsch   This routine falls back to using `PetscCalloc1()` if PETSc was not configured with device
1700e6b6b59SJacob Faibussowitsch   support. The user should note that `mtype` is ignored in this case, as `PetscCalloc1()`
1710e6b6b59SJacob Faibussowitsch   allocates only host memory.
1720e6b6b59SJacob Faibussowitsch 
1730e6b6b59SJacob Faibussowitsch .N ASYNC_API
1740e6b6b59SJacob Faibussowitsch 
1750e6b6b59SJacob Faibussowitsch .seealso: `PetscDeviceFree()`, `PetscDeviceMalloc()`, `PetscDeviceArrayCopy()`,
1766797ed33SJacob Faibussowitsch `PetscDeviceArrayZero()`
1770e6b6b59SJacob Faibussowitsch M*/
1786797ed33SJacob Faibussowitsch #define PetscDeviceCalloc(dctx, mtype, n, ptr) PetscDeviceAllocate_Private((dctx), PETSC_TRUE, (mtype), (size_t)(n) * sizeof(**(ptr)), PETSC_DEVICE_ALIGNOF(**(ptr)), (void **)(ptr))
1790e6b6b59SJacob Faibussowitsch 
1800e6b6b59SJacob Faibussowitsch /*MC
181af27ebaaSBarry Smith   PetscDeviceFree - Free device-aware memory obtained with  `PetscDeviceMalloc()` or `PetscDeviceCalloc()`
1820e6b6b59SJacob Faibussowitsch 
1830e6b6b59SJacob Faibussowitsch   Synopsis:
1840e6b6b59SJacob Faibussowitsch   #include <petscdevice.h>
1850e6b6b59SJacob Faibussowitsch   PetscErrorCode PetscDeviceFree(PetscDeviceContext dctx, void *ptr)
1860e6b6b59SJacob Faibussowitsch 
1870e6b6b59SJacob Faibussowitsch   Not Collective, Asynchronous, Auto-dependency aware
1880e6b6b59SJacob Faibussowitsch 
1890e6b6b59SJacob Faibussowitsch   Input Parameters:
1900e6b6b59SJacob Faibussowitsch + dctx - The `PetscDeviceContext` used to free the memory
191af27ebaaSBarry Smith - ptr  - The pointer to free, may be `NULL`
1920e6b6b59SJacob Faibussowitsch 
19395bd0b28SBarry Smith   Level: beginner
19495bd0b28SBarry Smith 
1950e6b6b59SJacob Faibussowitsch   Notes:
196af27ebaaSBarry Smith   `ptr` is set to `PETSC_NULLPTR` on successful deallocation.
1970e6b6b59SJacob Faibussowitsch 
198af27ebaaSBarry Smith   `ptr` must have been allocated using `PetscDeviceMalloc()`, `PetscDeviceCalloc()` not `PetscMalloc()` or related routines
1990e6b6b59SJacob Faibussowitsch 
2000e6b6b59SJacob Faibussowitsch   This routine falls back to using `PetscFree()` if PETSc was not configured with device
2010e6b6b59SJacob Faibussowitsch   support. The user should note that `PetscFree()` frees only host memory.
2020e6b6b59SJacob Faibussowitsch 
2036797ed33SJacob Faibussowitsch   DAG representation:
2046797ed33SJacob Faibussowitsch .vb
2056797ed33SJacob Faibussowitsch   time ->
2066797ed33SJacob Faibussowitsch 
2076797ed33SJacob Faibussowitsch   -> dctx -/- |= CALL =| - dctx ->
2086797ed33SJacob Faibussowitsch   -> ptr -/
2096797ed33SJacob Faibussowitsch .ve
2100e6b6b59SJacob Faibussowitsch 
2110e6b6b59SJacob Faibussowitsch .N ASYNC_API
2120e6b6b59SJacob Faibussowitsch 
2136797ed33SJacob Faibussowitsch .seealso: `PetscDeviceMalloc()`, `PetscDeviceCalloc()`
2140e6b6b59SJacob Faibussowitsch M*/
2153ba16761SJacob Faibussowitsch #define PetscDeviceFree(dctx, ptr) ((PetscErrorCode)(PetscDeviceDeallocate_Private((dctx), (ptr)) || ((ptr) = PETSC_NULLPTR, PETSC_SUCCESS)))
2160e6b6b59SJacob Faibussowitsch 
2170e6b6b59SJacob Faibussowitsch /*MC
2180e6b6b59SJacob Faibussowitsch   PetscDeviceArrayCopy - Copy memory in a device-aware manner
2190e6b6b59SJacob Faibussowitsch 
2200e6b6b59SJacob Faibussowitsch   Synopsis:
2210e6b6b59SJacob Faibussowitsch   #include <petscdevice.h>
2226bc29738SJacob Faibussowitsch   PetscErrorCode PetscDeviceArrayCopy(PetscDeviceContext dctx, void *dest, const void *src, size_t n)
2230e6b6b59SJacob Faibussowitsch 
2240e6b6b59SJacob Faibussowitsch   Not Collective, Asynchronous, Auto-dependency aware
2250e6b6b59SJacob Faibussowitsch 
2260e6b6b59SJacob Faibussowitsch   Input Parameters:
2270e6b6b59SJacob Faibussowitsch + dctx - The `PetscDeviceContext` used to copy the memory
2280e6b6b59SJacob Faibussowitsch . dest - The pointer to copy to
2290e6b6b59SJacob Faibussowitsch . src  - The pointer to copy from
2300e6b6b59SJacob Faibussowitsch - n    - The amount (in elements) to copy
2310e6b6b59SJacob Faibussowitsch 
2320e6b6b59SJacob Faibussowitsch   Notes:
233af27ebaaSBarry Smith   Both `dest` and `src` must have been allocated using `PetscDeviceMalloc()` or
2346797ed33SJacob Faibussowitsch   `PetscDeviceCalloc()`.
2350e6b6b59SJacob Faibussowitsch 
2360e6b6b59SJacob Faibussowitsch   This uses the `sizeof()` of the `src` memory type requested to determine the total memory to
2370e6b6b59SJacob Faibussowitsch   be copied, therefore you should not multiply the number of elements by the `sizeof()` the
2380e6b6b59SJacob Faibussowitsch   type\:
2390e6b6b59SJacob Faibussowitsch 
2400e6b6b59SJacob Faibussowitsch .vb
2410e6b6b59SJacob Faibussowitsch   PetscInt *to,*from;
2420e6b6b59SJacob Faibussowitsch 
2430e6b6b59SJacob Faibussowitsch   // correct
2446bc29738SJacob Faibussowitsch   PetscDeviceArrayCopy(dctx,to,from,n);
2450e6b6b59SJacob Faibussowitsch 
2460e6b6b59SJacob Faibussowitsch   // incorrect
2476bc29738SJacob Faibussowitsch   PetscDeviceArrayCopy(dctx,to,from,n*sizeof(*from));
2480e6b6b59SJacob Faibussowitsch .ve
2490e6b6b59SJacob Faibussowitsch 
2500e6b6b59SJacob Faibussowitsch   See `PetscDeviceMemcpy()` for further discussion.
2510e6b6b59SJacob Faibussowitsch 
2520e6b6b59SJacob Faibussowitsch   Level: beginner
2530e6b6b59SJacob Faibussowitsch 
2540e6b6b59SJacob Faibussowitsch .N ASYNC_API
2550e6b6b59SJacob Faibussowitsch 
2566797ed33SJacob Faibussowitsch .seealso: `PetscDeviceMalloc()`, `PetscDeviceCalloc()`, `PetscDeviceFree()`,
2576797ed33SJacob Faibussowitsch `PetscDeviceArrayZero()`, `PetscDeviceMemcpy()`
2580e6b6b59SJacob Faibussowitsch M*/
2596797ed33SJacob Faibussowitsch #define PetscDeviceArrayCopy(dctx, dest, src, n) PetscDeviceMemcpy((dctx), (dest), (src), (size_t)(n) * sizeof(*(src)))
2600e6b6b59SJacob Faibussowitsch 
2610e6b6b59SJacob Faibussowitsch /*MC
2620e6b6b59SJacob Faibussowitsch   PetscDeviceArrayZero - Zero memory in a device-aware manner
2630e6b6b59SJacob Faibussowitsch 
2640e6b6b59SJacob Faibussowitsch   Synopsis:
2650e6b6b59SJacob Faibussowitsch   #include <petscdevice.h>
2666bc29738SJacob Faibussowitsch   PetscErrorCode PetscDeviceArrayZero(PetscDeviceContext dctx, void *ptr, size_t n)
2670e6b6b59SJacob Faibussowitsch 
2680e6b6b59SJacob Faibussowitsch   Not Collective, Asynchronous, Auto-dependency aware
2690e6b6b59SJacob Faibussowitsch 
2700e6b6b59SJacob Faibussowitsch   Input Parameters:
2710e6b6b59SJacob Faibussowitsch + dctx  - The `PetscDeviceContext` used to zero the memory
2720e6b6b59SJacob Faibussowitsch . ptr   - The pointer to the memory
2730e6b6b59SJacob Faibussowitsch - n     - The amount (in elements) to zero
2740e6b6b59SJacob Faibussowitsch 
27595bd0b28SBarry Smith   Level: beginner
27695bd0b28SBarry Smith 
2770e6b6b59SJacob Faibussowitsch   Notes:
2786797ed33SJacob Faibussowitsch   `ptr` must have been allocated using `PetscDeviceMalloc()` or `PetscDeviceCalloc()`.
2790e6b6b59SJacob Faibussowitsch 
2800e6b6b59SJacob Faibussowitsch   This uses the `sizeof()` of the memory type requested to determine the total memory to be
2810e6b6b59SJacob Faibussowitsch   zeroed, therefore you should not multiply the number of elements by the `sizeof()` the type\:
2820e6b6b59SJacob Faibussowitsch 
2830e6b6b59SJacob Faibussowitsch .vb
2840e6b6b59SJacob Faibussowitsch   PetscInt *ptr;
2850e6b6b59SJacob Faibussowitsch 
2860e6b6b59SJacob Faibussowitsch   // correct
2876bc29738SJacob Faibussowitsch   PetscDeviceArrayZero(dctx,ptr,n);
2880e6b6b59SJacob Faibussowitsch 
2890e6b6b59SJacob Faibussowitsch   // incorrect
2906bc29738SJacob Faibussowitsch   PetscDeviceArrayZero(dctx,ptr,n*sizeof(*ptr));
2910e6b6b59SJacob Faibussowitsch .ve
2920e6b6b59SJacob Faibussowitsch 
293d5b43468SJose E. Roman   See `PetscDeviceMemset()` for further discussion.
2940e6b6b59SJacob Faibussowitsch 
2950e6b6b59SJacob Faibussowitsch .N ASYNC_API
2960e6b6b59SJacob Faibussowitsch 
2976797ed33SJacob Faibussowitsch .seealso: `PetscDeviceMalloc()`, `PetscDeviceCalloc()`, `PetscDeviceFree()`,
2986797ed33SJacob Faibussowitsch `PetscDeviceArrayCopy()`, `PetscDeviceMemset()`
2990e6b6b59SJacob Faibussowitsch M*/
3006797ed33SJacob Faibussowitsch #define PetscDeviceArrayZero(dctx, ptr, n) PetscDeviceMemset((dctx), (ptr), 0, (size_t)(n) * sizeof(*(ptr)))
301