Block-Structured AMR Software Framework
Loading...
Searching...
No Matches
AMReX_RandomEngine.H
Go to the documentation of this file.
1#ifndef AMREX_RANDOM_ENGINE_H_
2#define AMREX_RANDOM_ENGINE_H_
3#include <AMReX_Config.H>
4
6#include <AMReX_Extension.H>
7#ifdef AMREX_USE_OMP
8# include <AMReX_BLassert.H>
9# include <omp.h>
10#endif
11
12#if defined(AMREX_USE_HIP)
13#pragma clang diagnostic push
14#pragma clang diagnostic ignored "-W#warnings"
15#include <hiprand/hiprand.hpp>
16#pragma clang diagnostic pop
17#elif defined(AMREX_USE_CUDA)
18#include <curand.h>
19#include <curand_kernel.h>
20#elif defined(AMREX_USE_SYCL)
21#include <sycl/sycl.hpp>
22#include <oneapi/mkl/rng.hpp>
23#include <oneapi/mkl/rng/device.hpp>
24namespace mkl = oneapi::mkl;
25#endif
26
27namespace amrex
28{
29#ifdef AMREX_USE_GPU
30
31#ifdef AMREX_USE_SYCL
32
33 using sycl_rng_engine = mkl::rng::device::philox4x32x10<>;
34 using sycl_rng_descr = mkl::rng::device::engine_descriptor<sycl_rng_engine>;
35 using sycl_rng_acc = mkl::rng::device::engine_accessor<sycl_rng_engine>;
36
37 extern sycl_rng_descr* rand_engine_descr;
38
39 inline
40 sycl_rng_descr* getRandEngineDescriptor () {
41#ifdef AMREX_USE_OMP
42 AMREX_ALWAYS_ASSERT_WITH_MESSAGE(! omp_in_parallel(), "RNG on GPU is not OpenMP thread safe");
43#endif
44 return rand_engine_descr;
45 }
46
47 struct RandomEngine {
48 sycl_rng_engine* engine;
49 AMREX_GPU_HOST_DEVICE RandomEngine (sycl_rng_engine* e) : engine(e) {}
50 };
51
52#else
53
54#ifdef AMREX_USE_HIP
55 using randState_t = hiprandState_t;
56 using randGenerator_t = hiprandGenerator_t;
57#else
58 using randState_t = curandState_t;
59 using randGenerator_t = curandGenerator_t;
60#endif
61
63
64 inline
66#ifdef AMREX_USE_OMP
67 AMREX_ALWAYS_ASSERT_WITH_MESSAGE(! omp_in_parallel(), "RNG on GPU is not OpenMP thread safe");
68#endif
69 return gpu_rand_state;
70 }
71
76
77#endif
78
79#else
80
81 struct RandomEngine {}; // CPU
82
83#endif
84
87#ifdef AMREX_USE_GPU
88 return RandomEngine{nullptr};
89#else
90 return RandomEngine{};
91#endif
92 }
93
94}
95
96#endif
#define AMREX_ALWAYS_ASSERT_WITH_MESSAGE(EX, MSG)
Definition AMReX_BLassert.H:49
#define AMREX_FORCE_INLINE
Definition AMReX_Extension.H:119
#define AMREX_GPU_HOST_DEVICE
Definition AMReX_GpuQualifiers.H:20
Definition AMReX_Amr.cpp:49
randState_t * getRandState()
Definition AMReX_RandomEngine.H:65
curandGenerator_t randGenerator_t
Definition AMReX_RandomEngine.H:59
RandomEngine getInvalidRandomEngine()
Definition AMReX_RandomEngine.H:86
curandState_t randState_t
Definition AMReX_RandomEngine.H:58
amrex::randState_t * gpu_rand_state
Definition AMReX_Random.cpp:23
Definition AMReX_RandomEngine.H:72
randState_t * rand_state
Definition AMReX_RandomEngine.H:73
__host__ __device__ RandomEngine(randState_t *rs)
Definition AMReX_RandomEngine.H:74