Block-Structured AMR Software Framework
Loading...
Searching...
No Matches
AMReX_GpuDevice.H
Go to the documentation of this file.
1#ifndef AMREX_GPU_DEVICE_H_
2#define AMREX_GPU_DEVICE_H_
3#include <AMReX_Config.H>
4
5#include <AMReX.H>
6#include <AMReX_Extension.H>
7#include <AMReX_Utility.H>
8#include <AMReX_GpuTypes.H>
9#include <AMReX_GpuError.H>
10#include <AMReX_GpuControl.H>
11#include <AMReX_OpenMP.H>
12#include <AMReX_Vector.H>
13
14#include <algorithm>
15#include <array>
16#include <cstdlib>
17#include <cstring>
18#include <memory>
19#include <mutex>
20
21#define AMREX_GPU_MAX_STREAMS 8
22
23#ifdef AMREX_USE_GPU
24namespace amrex {
25#ifdef AMREX_USE_HIP
26using gpuDeviceProp_t = hipDeviceProp_t;
27#elif defined(AMREX_USE_CUDA)
28using gpuDeviceProp_t = cudaDeviceProp;
29#elif defined(AMREX_USE_SYCL)
30 struct gpuDeviceProp_t {
31 std::string name;
32 std::string vendor; // SYCL only (inferred for CUDA and HIP)
33 std::size_t totalGlobalMem;
34 std::size_t sharedMemPerBlock;
35 int multiProcessorCount;
36 int maxThreadsPerMultiProcessor;
37 int maxThreadsPerBlock;
38 int maxThreadsDim[3];
39 int maxGridSize[3];
40 int warpSize;
41 Long maxMemAllocSize; // SYCL only
42 int managedMemory;
43 int concurrentManagedAccess;
44 int maxParameterSize;
45 int integrated;
46 };
47#endif
48}
49#endif
50
51namespace amrex {
52 class Arena;
53}
54
55namespace amrex::Gpu {
56
57#ifdef AMREX_USE_GPU
61};
62#endif
63
64#ifdef AMREX_USE_GPU
66 gpuStream_t m_stream;
67 std::mutex m_mutex;
68 Vector<std::pair<Arena*, void*>> m_free_wait_list;
69public:
70 [[nodiscard]] gpuStream_t& getStream ();
71 [[nodiscard]] gpuStream_t const& getStream () const;
72 void sync ();
73 void free_async (Arena* arena, void* mem);
74 std::size_t wait_list_size ();
75};
76#endif
77
78class Device
79{
80
81public:
82
83 static void Initialize (bool minimal, int a_device_id);
84 static void Finalize ();
85
86#if defined(AMREX_USE_GPU)
87 static gpuStream_t gpuStream () noexcept {
88 if (!external_stream_stack.empty()) {
89 AMREX_ASSERT(external_stream_stack.back().manager != nullptr);
90 return external_stream_stack.back().manager->getStream();
91 } else {
92 int tid = OpenMP::get_thread_num();
93 return gpu_stream_pool[gpu_stream_index[tid]].getStream();
94 }
95 }
96#ifdef AMREX_USE_CUDA
98 static cudaStream_t cudaStream () noexcept { return gpuStream(); }
99#endif
100#ifdef AMREX_USE_SYCL
101 static sycl::queue& streamQueue () noexcept { return *(gpuStream().queue); }
102 static sycl::queue& streamQueue (int i) noexcept { return *(gpu_stream_pool[i].getStream().queue); }
103#endif
104#endif
105
106 static int numGpuStreams () noexcept {
107#ifdef AMREX_USE_GPU
108 return (inSingleStreamRegion() || usingExternalStream()) ? 1 : max_gpu_streams;
109#else
110 return 1;
111#endif
112 }
113
114 static void setStreamIndex (int idx) noexcept;
115 static void resetStreamIndex () noexcept { setStreamIndex(0); }
116
117#ifdef AMREX_USE_GPU
118 static int streamIndex (gpuStream_t s = gpuStream()) noexcept;
119
120 static gpuStream_t setStream (gpuStream_t s) noexcept;
121 static gpuStream_t resetStream () noexcept;
122
124 static void setExternalStream (gpuStream_t s);
126 static void resetExternalStream (ExternalStreamSync sync_stream = ExternalStreamSync::Yes) noexcept;
127 static bool usingExternalStream () noexcept;
128#endif
129
130 static int deviceId () noexcept;
131 static int numDevicesUsed () noexcept; // Total number of device used
132 static int numDevicePartners () noexcept; // Number of partners sharing my device
133
138 static void synchronize ();
139
144 static void streamSynchronize () noexcept;
145#ifdef AMREX_USE_GPU
146 static void streamSynchronize (gpuStream_t s) noexcept;
147#endif
148
154 static void streamSynchronizeActive () noexcept;
155
160 static void streamSynchronizeAll () noexcept;
161
162 static void freeAsync (Arena* arena, void* mem) noexcept;
163#ifdef AMREX_USE_GPU
164 static void streamOrderedFreeAsync (Arena* arena, void* mem, gpuStream_t stream) noexcept;
165#endif
166
167 static bool clearFreeAsyncBuffer () noexcept;
168
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);
173
175 static cudaGraphExec_t instantiateGraph(cudaGraph_t graph);
176
178 static void executeGraph(const cudaGraphExec_t &graphExec, bool synch = true);
179
180#endif
181
182 static void mem_advise_set_preferred (void* p, std::size_t sz, int device);
183 static void mem_advise_set_readonly (void* p, std::size_t sz);
184
185#ifdef AMREX_USE_GPU
186 static void setNumThreadsMin (int nx, int ny, int nz) noexcept;
187 static void n_threads_and_blocks (const Long N, dim3& numBlocks, dim3& numThreads) noexcept;
188 static void c_comps_threads_and_blocks (const int* lo, const int* hi, const int comps,
189 dim3& numBlocks, dim3& numThreads) noexcept;
190 static void c_threads_and_blocks (const int* lo, const int* hi, dim3& numBlocks, dim3& numThreads) noexcept;
191 static void grid_stride_threads_and_blocks (dim3& numBlocks, dim3& numThreads) noexcept;
192
193 static std::size_t totalGlobalMem () noexcept { return device_prop.totalGlobalMem; }
194 static std::size_t sharedMemPerBlock () noexcept { return device_prop.sharedMemPerBlock; }
195 static int numMultiProcessors () noexcept { return device_prop.multiProcessorCount; }
196 static int maxThreadsPerMultiProcessor () noexcept { return device_prop.maxThreadsPerMultiProcessor; }
197 static int maxThreadsPerBlock () noexcept { return device_prop.maxThreadsPerBlock; }
198 static int maxThreadsPerBlock (int dir) noexcept { return device_prop.maxThreadsDim[dir]; }
199 static int maxBlocksPerGrid (int dir) noexcept { return device_prop.maxGridSize[dir]; }
200 static std::string deviceName () noexcept { return std::string(device_prop.name); }
202 static bool isIntegrated () noexcept { return device_prop.integrated != 0; }
203#endif
204
205#ifdef AMREX_USE_CUDA
206 static int devicePropMajor () noexcept { return device_prop.major; }
207 static int devicePropMinor () noexcept { return device_prop.minor; }
208#endif
209
210 static std::string deviceVendor() noexcept
211 {
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__))
215 // Using HIP on NVIDIA GPUs isn't currently supported by AMReX
216 return std::string("NVIDIA");
217#elif defined(AMREX_USE_SYCL)
218 return device_prop.vendor;
219#else
220 return std::string("Unknown");
221#endif
222 }
223
224 static std::size_t freeMemAvailable ();
225 static void profilerStart ();
226 static void profilerStop ();
227
228#ifdef AMREX_USE_GPU
229
230 static int managedMemorySupported () noexcept { return device_prop.managedMemory; }
231
232 static int memoryPoolsSupported () noexcept { return memory_pools_supported; }
233
234#if defined(AMREX_USE_HIP)
235 static AMREX_EXPORT constexpr int warp_size = AMREX_AMDGCN_WAVEFRONT_SIZE;
236#elif defined(AMREX_USE_SYCL)
237 static AMREX_EXPORT constexpr int warp_size = AMREX_SYCL_SUB_GROUP_SIZE;
238#else
239 static AMREX_EXPORT constexpr int warp_size = AMREX_HIP_OR_CUDA(64,32);
240#endif
241
242 static unsigned int maxBlocksPerLaunch () noexcept { return max_blocks_per_launch; }
243
244#ifdef 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; }
248#endif
249#endif
250
251private:
252
253 static void initialize_gpu (bool minimal);
254
255 static AMREX_EXPORT int device_id;
256 static AMREX_EXPORT int num_devices_used;
257 static AMREX_EXPORT int num_device_partners;
258 static AMREX_EXPORT int verbose;
259 static AMREX_EXPORT int max_gpu_streams;
260
261#ifdef AMREX_USE_GPU
262 static AMREX_EXPORT dim3 numThreadsMin;
263 static AMREX_EXPORT dim3 numBlocksOverride, numThreadsOverride;
264
265 static AMREX_EXPORT Vector<StreamManager> gpu_stream_pool; // The size of this is max_gpu_stream
266 // The non-owning gpu_stream_index is used to store the current stream index that will be used.
267 // gpu_stream_index is a vector so that it's thread safe to write to it.
268 static AMREX_EXPORT Vector<int> gpu_stream_index; // The size of this is omp_max_threads
269 static AMREX_EXPORT gpuDeviceProp_t device_prop;
270 static AMREX_EXPORT int memory_pools_supported;
271 static AMREX_EXPORT unsigned int max_blocks_per_launch;
272
273 struct ExternalStream
274 {
275 std::unique_ptr<StreamManager> manager;
276 int saved_stream_index = 0;
277 };
278 static AMREX_EXPORT Vector<ExternalStream> external_stream_stack;
279
280#ifdef AMREX_USE_SYCL
281 static AMREX_EXPORT std::unique_ptr<sycl::context> sycl_context;
282 static AMREX_EXPORT std::unique_ptr<sycl::device> sycl_device;
283#endif
284
285 friend StreamManager;
287#endif
288};
289
305
306// Put these in amrex::Gpu
307
308#if defined(AMREX_USE_GPU)
309inline gpuStream_t
310gpuStream () noexcept
311{
312 return Device::gpuStream();
313}
314#endif
315
316inline int
317numGpuStreams () noexcept
318{
319 return Device::numGpuStreams();
320}
321
322inline void
323synchronize () noexcept
324{
326}
327
328inline void
330{
332}
333
334#ifdef AMREX_USE_GPU
335inline void
340#endif
341
342inline void
347
348inline void
353
363inline void
364freeAsync (Arena* arena, void* mem) noexcept
365{
366 Device::freeAsync(arena, mem);
367}
368
372inline bool
374{
376}
377
378#ifdef AMREX_USE_GPU
379
387inline void
392
403inline void
408
413struct [[nodiscard]] ExternalGpuStreamRegion
414{
416 ExternalStreamSync sync_on_exit = ExternalStreamSync::Yes) noexcept
417 : m_sync_on_exit(sync_on_exit)
418 {
420 }
421
423 ExternalGpuStreamRegion& operator= (ExternalGpuStreamRegion&& rhs) noexcept = delete;
426
428 {
429 Device::resetExternalStream(m_sync_on_exit);
430 }
431
432private:
434};
435#endif
436
437#ifdef AMREX_USE_GPU
438
439inline void
440htod_memcpy_async (void* p_d, const void* p_h, const std::size_t sz) noexcept
441{
442 if (sz == 0) { return; }
443#ifdef AMREX_USE_SYCL
444 auto& q = Device::streamQueue();
445 q.submit([&] (sycl::handler& h) { h.memcpy(p_d, p_h, sz); });
446#else
448 AMREX_HIP_SAFE_CALL(hipMemcpyAsync(p_d, p_h, sz, hipMemcpyHostToDevice, gpuStream()));,
449 AMREX_CUDA_SAFE_CALL(cudaMemcpyAsync(p_d, p_h, sz, cudaMemcpyHostToDevice, gpuStream())); )
450#endif
451}
452
453inline void
454dtoh_memcpy_async (void* p_h, const void* p_d, const std::size_t sz) noexcept
455{
456 if (sz == 0) { return; }
457#ifdef AMREX_USE_SYCL
458 auto& q = Device::streamQueue();
459 q.submit([&] (sycl::handler& h) { h.memcpy(p_h, p_d, sz); });
460#else
462 AMREX_HIP_SAFE_CALL(hipMemcpyAsync(p_h, p_d, sz, hipMemcpyDeviceToHost, gpuStream()));,
463 AMREX_CUDA_SAFE_CALL(cudaMemcpyAsync(p_h, p_d, sz, cudaMemcpyDeviceToHost, gpuStream())); )
464#endif
465}
466
467inline void
468dtod_memcpy_async (void* p_d_dst, const void* p_d_src, const std::size_t sz) noexcept
469{
470 if (sz == 0) { return; }
471#ifdef AMREX_USE_SYCL
472 auto& q = Device::streamQueue();
473 q.submit([&] (sycl::handler& h) { h.memcpy(p_d_dst, p_d_src, sz); });
474#else
476 AMREX_HIP_SAFE_CALL(hipMemcpyAsync(p_d_dst, p_d_src, sz, hipMemcpyDeviceToDevice, gpuStream()));,
477 AMREX_CUDA_SAFE_CALL(cudaMemcpyAsync(p_d_dst, p_d_src, sz, cudaMemcpyDeviceToDevice, gpuStream())); )
478#endif
479}
480
481#else // AMREX_USE_GPU
482
483inline void
484htod_memcpy_async (void* p_d, const void* p_h, const std::size_t sz) noexcept
485{
486 if (sz == 0) { return; }
487 std::memcpy(p_d, p_h, sz);
488}
489
490inline void
491dtoh_memcpy_async (void* p_h, const void* p_d, const std::size_t sz) noexcept
492{
493 if (sz == 0) { return; }
494 std::memcpy(p_h, p_d, sz);
495}
496
497inline void
498dtod_memcpy_async (void* p_d_dst, const void* p_d_src, const std::size_t sz) noexcept
499{
500 if (sz == 0) { return; }
501 std::memcpy(p_d_dst, p_d_src, sz);
502}
503
504#endif // AMREX_USE_GPU
505
506inline void
507htod_memcpy (void* p_d, const void* p_h, const std::size_t sz) noexcept
508{
509 if (sz == 0) { return; }
510 htod_memcpy_async(p_d, p_h, sz);
512}
513
514inline void
515dtoh_memcpy (void* p_h, const void* p_d, const std::size_t sz) noexcept
516{
517 if (sz == 0) { return; }
518 dtoh_memcpy_async(p_h, p_d, sz);
520}
521
522inline void
523dtod_memcpy (void* p_d_dst, const void* p_d_src, const std::size_t sz) noexcept
524{
525 if (sz == 0) { return; }
526 dtod_memcpy_async(p_d_dst, p_d_src, sz);
528}
529
530#ifdef AMREX_USE_HYPRE
531void hypreSynchronize ();
532#endif
533
536template <typename T>
537void memcpy_from_host_to_device_global_async (T& dg, const void* src,
538 std::size_t nbytes,
539 std::size_t offset = 0)
540{
541#if defined(AMREX_USE_CUDA)
542 AMREX_CUDA_SAFE_CALL(cudaMemcpyToSymbolAsync(dg, src, nbytes, offset,
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);
551#else
552 auto* p = (char*)(&dg);
553 std::memcpy(p+offset, src, nbytes);
554#endif
555}
556
559template <typename T>
560void memcpy_from_device_global_to_host_async (void* dst, T const& dg,
561 std::size_t nbytes,
562 std::size_t offset = 0)
563{
564#if defined(AMREX_USE_CUDA)
565 AMREX_CUDA_SAFE_CALL(cudaMemcpyFromSymbolAsync(dst, dg, nbytes, offset,
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);
574#else
575 auto const* p = (char const*)(&dg);
576 std::memcpy(dst, p+offset, nbytes);
577#endif
578}
579
580#ifdef AMREX_USE_GPU
581
584
591struct [[nodiscard]] SyncAtExitOnly
592 : public NoSyncRegion
593{
599};
600
601#else
602
603struct [[nodiscard]] SyncAtExitOnly {};
604
605#endif
606
607}
608
609#endif
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