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