19#define MFEM_CUDA_BLOCKS 256
21#if defined(MFEM_USE_CUDA)
22#define MFEM_USE_CUDA_OR_HIP
23#define MFEM_DEVICE_SYNC MFEM_GPU_CHECK(cudaDeviceSynchronize())
24#define MFEM_STREAM_SYNC MFEM_GPU_CHECK(cudaStreamSynchronize(0))
28#define MFEM_GPU_CHECK(x) \
30 cudaError_t mfem_err_internal_var_name = (x); \
31 if (mfem_err_internal_var_name != cudaSuccess) { \
32 ::mfem::mfem_cuda_error(mfem_err_internal_var_name, #x, _MFEM_FUNC_NAME, \
33 __FILE__, __LINE__); \
38#if defined(__CUDACC__)
39#define MFEM_USE_CUDA_OR_HIP_LANG
40#define MFEM_DEVICE __device__
41#define MFEM_HOST __host__
42#define MFEM_LAMBDA __host__
43#define MFEM_LAUNCH_BOUNDS __launch_bounds__
47#if defined(__CUDA_ARCH__)
48#define MFEM_SHARED __shared__
49#define MFEM_SYNC_THREAD __syncthreads()
50#define MFEM_BLOCK_ID(k) blockIdx.k
51#define MFEM_THREAD_ID(k) threadIdx.k
52#define MFEM_THREAD_SIZE(k) blockDim.k
53#define MFEM_FOREACH_THREAD(i,k,N) for(int i=threadIdx.k; i<N; i+=blockDim.k)
54#define MFEM_FOREACH_THREAD_DIRECT(i,k,N) if(const int i=threadIdx.k; i<N)
59#define MFEM_FOREACH_THREAD_DIRECT_3D(ix, iy, iz, k, SX, SY, SZ) \
60 if (int ix = threadIdx.k % (SX), iy = threadIdx.k / (SX), iz = iy / (SY); \
61 (iy %= (SY)), (threadIdx.k < (SX) * (SY) * (SZ)))
68#define MFEM_FOREACH_THREAD_DIRECT_3D_OFFSET(ix, iy, iz, k, SX, SY, SZ, OX, \
70 if (int ix = threadIdx.k % (OX), iy = threadIdx.k / (OX), iz = iy / (OY); \
71 (ix < (SX)) && ((iy %= (OY)) < (SY)) && (iz < (SZ)))
79#if defined(MFEM_USE_CUDA)
82 const char *file,
int line);
101void*
CuMemcpyHtoD(
void *d_dst,
const void *h_src,
size_t bytes);
107void*
CuMemcpyDtoD(
void *d_dst,
const void *d_src,
size_t bytes);
113void*
CuMemcpyDtoH(
void *h_dst,
const void *d_src,
size_t bytes);
void * CuMemAlloc(void **dptr, size_t bytes)
Allocates device memory and returns destination ptr.
void * CuMemFree(void *dptr)
Frees device memory and returns destination ptr.
void * CuMemcpyDtoHAsync(void *dst, const void *src, size_t bytes)
Copies memory from Device to Host.
void * CuMallocManaged(void **dptr, size_t bytes)
Allocates managed device memory.
void * CuMemcpyDtoH(void *dst, const void *src, size_t bytes)
Copies memory from Device to Host.
void * CuMemAllocHostPinned(void **ptr, size_t bytes)
Allocates page-locked (pinned) host memory.
void * CuMemFreeHostPinned(void *ptr)
Frees page-locked (pinned) host memory and returns destination ptr.
void mfem_cuda_error(cudaError_t err, const char *expr, const char *func, const char *file, int line)
void * CuMemcpyHtoD(void *dst, const void *src, size_t bytes)
Copies memory from Host to Device and returns destination ptr.
int CuGetDeviceCount()
Get the number of CUDA devices.
OutStream err(std::cerr)
Global stream used by the library for standard error output. Initially it uses the same std::streambu...
void * CuMemcpyHtoDAsync(void *dst, const void *src, size_t bytes)
Copies memory from Host to Device and returns destination ptr.
void CuCheckLastError()
Check the error code returned by cudaGetLastError(), aborting on error.
void * CuMemcpyDtoDAsync(void *dst, const void *src, size_t bytes)
Copies memory from Device to Device.
void * CuMemcpyDtoD(void *dst, const void *src, size_t bytes)
Copies memory from Device to Device.