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