1#ifndef AMREX_GPU_DEVICE_H_
2#define AMREX_GPU_DEVICE_H_
3#include <AMReX_Config.H>
21#define AMREX_GPU_MAX_STREAMS 8
27#elif defined(AMREX_USE_CUDA)
29#elif defined(AMREX_USE_SYCL)
33 std::size_t totalGlobalMem;
34 std::size_t sharedMemPerBlock;
35 int multiProcessorCount;
36 int maxThreadsPerMultiProcessor;
37 int maxThreadsPerBlock;
43 int concurrentManagedAccess;
83 static void Initialize (
bool minimal,
int a_device_id);
86#if defined(AMREX_USE_GPU)
88 if (!external_stream_stack.empty()) {
89 AMREX_ASSERT(external_stream_stack.back().manager !=
nullptr);
90 return external_stream_stack.back().manager->getStream();
93 return gpu_stream_pool[gpu_stream_index[tid]].getStream();
101 static sycl::queue& streamQueue () noexcept {
return *(
gpuStream().queue); }
102 static sycl::queue& streamQueue (
int i)
noexcept {
return *(gpu_stream_pool[i].getStream().queue); }
169#if defined(__CUDACC__)
171 static void startGraphRecording(
bool first_iter,
void* h_ptr,
void* d_ptr,
size_t sz);
172 static cudaGraphExec_t stopGraphRecording(
bool last_iter);
175 static cudaGraphExec_t instantiateGraph(cudaGraph_t graph);
178 static void executeGraph(
const cudaGraphExec_t &graphExec,
bool synch =
true);
189 dim3& numBlocks, dim3& numThreads)
noexcept;
190 static void c_threads_and_blocks (
const int* lo,
const int* hi, dim3& numBlocks, dim3& numThreads)
noexcept;
193 static std::size_t
totalGlobalMem () noexcept {
return device_prop.totalGlobalMem; }
200 static std::string
deviceName () noexcept {
return std::string(device_prop.name); }
202 static bool isIntegrated () noexcept {
return device_prop.integrated != 0; }
212#if defined(AMREX_USE_HIP) && defined(__HIP_PLATFORM_AMD__)
213 return std::string(
"AMD");
214#elif defined(AMREX_USE_CUDA) || (defined(AMREX_USE_HIP) && defined(__HIP_PLATFORM_NVIDIA__))
216 return std::string(
"NVIDIA");
217#elif defined(AMREX_USE_SYCL)
218 return device_prop.vendor;
220 return std::string(
"Unknown");
234#if defined(AMREX_USE_HIP)
236#elif defined(AMREX_USE_SYCL)
245 static Long maxMemAllocSize () noexcept {
return device_prop.maxMemAllocSize; }
246 static sycl::context& syclContext () {
return *sycl_context; }
247 static sycl::device& syclDevice () {
return *sycl_device; }
253 static void initialize_gpu (
bool minimal);
263 static AMREX_EXPORT dim3 numBlocksOverride, numThreadsOverride;
265 static AMREX_EXPORT Vector<StreamManager> gpu_stream_pool;
273 struct ExternalStream
275 std::unique_ptr<StreamManager> manager;
276 int saved_stream_index = 0;
278 static AMREX_EXPORT Vector<ExternalStream> external_stream_stack;
281 static AMREX_EXPORT std::unique_ptr<sycl::context> sycl_context;
282 static AMREX_EXPORT std::unique_ptr<sycl::device> sycl_device;
285 friend StreamManager;
308#if defined(AMREX_USE_GPU)
417 : m_sync_on_exit(sync_on_exit)
442 if (sz == 0) {
return; }
444 auto& q = Device::streamQueue();
445 q.submit([&] (sycl::handler& h) { h.memcpy(p_d, p_h, sz); });
448 AMREX_HIP_SAFE_CALL(hipMemcpyAsync(p_d, p_h, sz, hipMemcpyHostToDevice,
gpuStream()));,
456 if (sz == 0) {
return; }
458 auto& q = Device::streamQueue();
459 q.submit([&] (sycl::handler& h) { h.memcpy(p_h, p_d, sz); });
462 AMREX_HIP_SAFE_CALL(hipMemcpyAsync(p_h, p_d, sz, hipMemcpyDeviceToHost,
gpuStream()));,
470 if (sz == 0) {
return; }
472 auto& q = Device::streamQueue();
473 q.submit([&] (sycl::handler& h) { h.memcpy(p_d_dst, p_d_src, sz); });
476 AMREX_HIP_SAFE_CALL(hipMemcpyAsync(p_d_dst, p_d_src, sz, hipMemcpyDeviceToDevice,
gpuStream()));,
486 if (sz == 0) {
return; }
487 std::memcpy(p_d, p_h, sz);
493 if (sz == 0) {
return; }
494 std::memcpy(p_h, p_d, sz);
498dtod_memcpy_async (
void* p_d_dst,
const void* p_d_src,
const std::size_t sz)
noexcept
500 if (sz == 0) {
return; }
501 std::memcpy(p_d_dst, p_d_src, sz);
507htod_memcpy (
void* p_d,
const void* p_h,
const std::size_t sz)
noexcept
509 if (sz == 0) {
return; }
515dtoh_memcpy (
void* p_h,
const void* p_d,
const std::size_t sz)
noexcept
517 if (sz == 0) {
return; }
523dtod_memcpy (
void* p_d_dst,
const void* p_d_src,
const std::size_t sz)
noexcept
525 if (sz == 0) {
return; }
530#ifdef AMREX_USE_HYPRE
531void hypreSynchronize ();
539 std::size_t offset = 0)
541#if defined(AMREX_USE_CUDA)
543 cudaMemcpyHostToDevice,
545#elif defined(AMREX_USE_HIP)
546 AMREX_HIP_SAFE_CALL(hipMemcpyToSymbolAsync(dg, src, nbytes, offset,
547 hipMemcpyHostToDevice,
549#elif defined(AMREX_USE_SYCL)
550 Device::streamQueue().memcpy(dg, src, nbytes, offset);
552 auto*
p = (
char*)(&dg);
553 std::memcpy(
p+offset, src, nbytes);
562 std::size_t offset = 0)
564#if defined(AMREX_USE_CUDA)
566 cudaMemcpyDeviceToHost,
568#elif defined(AMREX_USE_HIP)
569 AMREX_HIP_SAFE_CALL(hipMemcpyFromSymbolAsync(dst, dg, nbytes, offset,
570 hipMemcpyDeviceToHost,
572#elif defined(AMREX_USE_SYCL)
573 Device::streamQueue().memcpy(dst, dg, nbytes, offset);
575 auto const*
p = (
char const*)(&dg);
576 std::memcpy(dst,
p+offset, nbytes);
603struct [[nodiscard]] SyncAtExitOnly {};
Runtime initialization/finalization helpers and global diagnostics.
#define AMREX_ASSERT(EX)
Definition AMReX_BLassert.H:38
Compiler- and backend-specific extension macros (e.g., restrict, SIMD, inline).
#define AMREX_EXPORT
Definition AMReX_Extension.H:223
#define AMREX_HIP_OR_CUDA(a, b)
Definition AMReX_GpuControl.H:17
#define AMREX_CUDA_SAFE_CALL(call)
Definition AMReX_GpuError.H:73
while parser_exe_t p
Definition AMReX_Parser_Exe_Body.H:33
Abstract base class for memory arenas.
Definition AMReX_Arena.H:154
Definition AMReX_GpuDevice.H:79
static gpuStream_t setStream(gpuStream_t s) noexcept
Definition AMReX_GpuDevice.cpp:886
static int streamIndex(gpuStream_t s=gpuStream()) noexcept
Definition AMReX_GpuDevice.cpp:846
static int numDevicePartners() noexcept
Definition AMReX_GpuDevice.cpp:839
static int numGpuStreams() noexcept
Definition AMReX_GpuDevice.H:106
friend struct ExternalGpuStreamRegion
Definition AMReX_GpuDevice.H:286
static void freeAsync(Arena *arena, void *mem) noexcept
Definition AMReX_GpuDevice.cpp:1072
static void mem_advise_set_readonly(void *p, std::size_t sz)
Definition AMReX_GpuDevice.cpp:1286
static bool isIntegrated() noexcept
Whether the GPU shares its memory with the host (e.g., an APU).
Definition AMReX_GpuDevice.H:202
static void c_threads_and_blocks(const int *lo, const int *hi, dim3 &numBlocks, dim3 &numThreads) noexcept
Definition AMReX_GpuDevice.cpp:1342
static int managedMemorySupported() noexcept
Definition AMReX_GpuDevice.H:230
static int memoryPoolsSupported() noexcept
Definition AMReX_GpuDevice.H:232
static void setStreamIndex(int idx) noexcept
Definition AMReX_GpuDevice.cpp:865
static gpuStream_t resetStream() noexcept
Definition AMReX_GpuDevice.cpp:878
static unsigned int maxBlocksPerLaunch() noexcept
Definition AMReX_GpuDevice.H:242
static void streamSynchronizeActive() noexcept
Definition AMReX_GpuDevice.cpp:1045
static int maxThreadsPerBlock() noexcept
Definition AMReX_GpuDevice.H:197
static int maxBlocksPerGrid(int dir) noexcept
Definition AMReX_GpuDevice.H:199
static int devicePropMinor() noexcept
Definition AMReX_GpuDevice.H:207
static void streamOrderedFreeAsync(Arena *arena, void *mem, gpuStream_t stream) noexcept
Definition AMReX_GpuDevice.cpp:1094
static int numMultiProcessors() noexcept
Definition AMReX_GpuDevice.H:195
static void Finalize()
Definition AMReX_GpuDevice.cpp:593
static void mem_advise_set_preferred(void *p, std::size_t sz, int device)
Definition AMReX_GpuDevice.cpp:1254
static std::string deviceName() noexcept
Definition AMReX_GpuDevice.H:200
static cudaStream_t cudaStream() noexcept
Definition AMReX_GpuDevice.H:98
static void setNumThreadsMin(int nx, int ny, int nz) noexcept
Definition AMReX_GpuDevice.cpp:1319
static void streamSynchronize() noexcept
Definition AMReX_GpuDevice.cpp:992
static gpuStream_t gpuStream() noexcept
Definition AMReX_GpuDevice.H:87
static std::string deviceVendor() noexcept
Definition AMReX_GpuDevice.H:210
static void profilerStop()
Definition AMReX_GpuDevice.cpp:1514
static void n_threads_and_blocks(const Long N, dim3 &numBlocks, dim3 &numThreads) noexcept
Definition AMReX_GpuDevice.cpp:1327
static constexpr int warp_size
Definition AMReX_GpuDevice.H:239
static std::size_t sharedMemPerBlock() noexcept
Definition AMReX_GpuDevice.H:194
static std::size_t freeMemAvailable()
Definition AMReX_GpuDevice.cpp:1481
static void streamSynchronizeAll() noexcept
Definition AMReX_GpuDevice.cpp:1057
static void profilerStart()
Definition AMReX_GpuDevice.cpp:1503
static int maxThreadsPerBlock(int dir) noexcept
Definition AMReX_GpuDevice.H:198
static int deviceId() noexcept
Definition AMReX_GpuDevice.cpp:828
static int maxThreadsPerMultiProcessor() noexcept
Definition AMReX_GpuDevice.H:196
static int numDevicesUsed() noexcept
Definition AMReX_GpuDevice.cpp:834
static void resetStreamIndex() noexcept
Definition AMReX_GpuDevice.H:115
static void setExternalStream(gpuStream_t s)
Definition AMReX_GpuDevice.cpp:906
static bool usingExternalStream() noexcept
Definition AMReX_GpuDevice.cpp:973
static void Initialize(bool minimal, int a_device_id)
Definition AMReX_GpuDevice.cpp:340
static bool clearFreeAsyncBuffer() noexcept
Definition AMReX_GpuDevice.cpp:1118
static void c_comps_threads_and_blocks(const int *lo, const int *hi, const int comps, dim3 &numBlocks, dim3 &numThreads) noexcept
Definition AMReX_GpuDevice.cpp:1334
static std::size_t totalGlobalMem() noexcept
Definition AMReX_GpuDevice.H:193
static void grid_stride_threads_and_blocks(dim3 &numBlocks, dim3 &numThreads) noexcept
Definition AMReX_GpuDevice.cpp:1400
static void synchronize()
Definition AMReX_GpuDevice.cpp:980
static void resetExternalStream(ExternalStreamSync sync_stream=ExternalStreamSync::Yes) noexcept
Definition AMReX_GpuDevice.cpp:950
static int devicePropMajor() noexcept
Definition AMReX_GpuDevice.H:206
Definition AMReX_GpuDevice.H:65
std::size_t wait_list_size()
Definition AMReX_GpuDevice.cpp:221
void sync()
Definition AMReX_GpuDevice.cpp:164
void free_async(Arena *arena, void *mem)
Definition AMReX_GpuDevice.cpp:201
gpuStream_t & getStream()
Definition AMReX_GpuDevice.cpp:154
This class is a thin wrapper around std::vector. Unlike vector, Vector::operator[] provides bound che...
Definition AMReX_Vector.H:29
amrex_long Long
Definition AMReX_INT.H:30
Definition AMReX_BaseFwd.H:60
void dtod_memcpy_async(void *p_d_dst, const void *p_d_src, const std::size_t sz) noexcept
Definition AMReX_GpuDevice.H:468
void synchronize() noexcept
Definition AMReX_GpuDevice.H:323
void streamSynchronizeActive() noexcept
Definition AMReX_GpuDevice.H:343
bool clearFreeAsyncBuffer() noexcept
Definition AMReX_GpuDevice.H:373
void freeAsync(Arena *arena, void *mem) noexcept
Definition AMReX_GpuDevice.H:364
void streamSynchronize() noexcept
Definition AMReX_GpuDevice.H:329
void dtoh_memcpy_async(void *p_h, const void *p_d, const std::size_t sz) noexcept
Definition AMReX_GpuDevice.H:454
ExternalStreamSync
Definition AMReX_GpuDevice.H:58
@ Yes
Definition AMReX_GpuDevice.H:59
@ No
Definition AMReX_GpuDevice.H:60
void streamSynchronizeAll() noexcept
Definition AMReX_GpuDevice.H:349
bool inSingleStreamRegion() noexcept
Definition AMReX_GpuControl.H:147
void memcpy_from_device_global_to_host_async(void *dst, T const &dg, std::size_t nbytes, std::size_t offset=0)
Definition AMReX_GpuDevice.H:560
int numGpuStreams() noexcept
Definition AMReX_GpuDevice.H:317
void dtoh_memcpy(void *p_h, const void *p_d, const std::size_t sz) noexcept
Definition AMReX_GpuDevice.H:515
void htod_memcpy(void *p_d, const void *p_h, const std::size_t sz) noexcept
Definition AMReX_GpuDevice.H:507
void htod_memcpy_async(void *p_d, const void *p_h, const std::size_t sz) noexcept
Definition AMReX_GpuDevice.H:440
void setExternalGpuStream(gpuStream_t stream)
Provide a user-supplied GPU stream.
Definition AMReX_GpuDevice.H:388
void dtod_memcpy(void *p_d_dst, const void *p_d_src, const std::size_t sz) noexcept
Definition AMReX_GpuDevice.H:523
void memcpy_from_host_to_device_global_async(T &dg, const void *src, std::size_t nbytes, std::size_t offset=0)
Definition AMReX_GpuDevice.H:537
bool isStreamActive(gpuStream_t s)
Check if the given stream is active.
Definition AMReX_GpuDevice.cpp:1539
gpuStream_t gpuStream() noexcept
Definition AMReX_GpuDevice.H:310
void resetExternalGpuStream(ExternalStreamSync sync_stream=ExternalStreamSync::Yes) noexcept
Pop the current user-supplied GPU stream.
Definition AMReX_GpuDevice.H:404
int SelectDeviceBeforeMPIInit()
Select this process's GPU before MPI is initialized.
Definition AMReX_GpuDevice.cpp:286
constexpr int get_thread_num()
Definition AMReX_OpenMP.H:37
Definition AMReX_Amr.cpp:50
cudaStream_t gpuStream_t
Definition AMReX_GpuControl.H:79
cudaDeviceProp gpuDeviceProp_t
Definition AMReX_GpuDevice.H:28
ExternalGpuStreamRegion(gpuStream_t stream, ExternalStreamSync sync_on_exit=ExternalStreamSync::Yes) noexcept
Definition AMReX_GpuDevice.H:415
ExternalGpuStreamRegion(ExternalGpuStreamRegion &&rhs) noexcept=delete
ExternalGpuStreamRegion(ExternalGpuStreamRegion const &)=delete
~ExternalGpuStreamRegion()
Definition AMReX_GpuDevice.H:427
NoSyncRegion() noexcept
Definition AMReX_GpuControl.H:181
bool inNoSyncRegionPreviously() const
Definition AMReX_GpuControl.H:187
Definition AMReX_GpuDevice.H:593
~SyncAtExitOnly()
Definition AMReX_GpuDevice.H:594