42 #include "Tpetra_Details_Random.hpp"
43 #include "Teuchos_TestForException.hpp"
50 unsigned int getSeedFromRank(
int mpi_rank) {
56 uint64_t myRank =
static_cast<uint64_t
>(mpi_rank);
57 uint64_t seed64 =
static_cast<uint64_t
> (std::rand ()) + myRank + 17311uLL;
58 unsigned int seed =
static_cast<unsigned int> (seed64&0xffffffff);
62 #ifdef KOKKOS_ENABLE_CUDA
63 Kokkos::Random_XorShift64_Pool<typename Kokkos::CudaSpace::execution_space> * cuda_pool_=
nullptr;
65 void finalize_cuda_pool() {
66 if(cuda_pool_ !=
nullptr) {
71 #endif // KOKKOS_ENABLE_CUDA
74 #ifdef KOKKOS_ENABLE_HIP
75 Kokkos::Random_XorShift64_Pool<typename Kokkos::HIPSpace::execution_space> * hip_pool_=
nullptr;
77 void finalize_hip_pool() {
78 if(hip_pool_ !=
nullptr) {
83 #endif // KOKKOS_ENABLE_HIP
85 #ifdef KOKKOS_ENABLE_SYCL
86 Kokkos::Random_XorShift64_Pool<typename Kokkos::Experimental::SYCLDeviceUSMSpace::execution_space> * sycl_pool_=
nullptr;
88 void finalize_sycl_pool() {
89 if(sycl_pool_ !=
nullptr) {
94 #endif // KOKKOS_ENABLE_SYCL
97 #ifdef KOKKOS_ENABLE_OPENMP
98 Kokkos::Random_XorShift64_Pool<Kokkos::OpenMP> * openmp_pool_=
nullptr;
100 void finalize_openmp_pool() {
101 if(openmp_pool_ !=
nullptr) {
103 openmp_pool_ =
nullptr;
106 #endif // KOKKOS_ENABLE_OPENMP
109 #ifdef KOKKOS_ENABLE_SERIAL
110 Kokkos::Random_XorShift64_Pool<Kokkos::Serial> * serial_pool_=
nullptr;
112 void finalize_serial_pool() {
113 if(serial_pool_ !=
nullptr) {
115 serial_pool_ =
nullptr;
118 #endif // KOKKOS_ENABLE_SERIAL
124 #ifdef KOKKOS_ENABLE_CUDA
126 Static_Random_XorShift64_Pool<typename Kokkos::CudaSpace::execution_space>::
127 resetPool(
int mpi_rank) {
128 using pool_type = Kokkos::Random_XorShift64_Pool<typename Kokkos::CudaSpace::execution_space>;
133 Kokkos::push_finalize_hook(finalize_cuda_pool);
135 cuda_pool_ =
new pool_type(getSeedFromRank(mpi_rank));
139 Static_Random_XorShift64_Pool<typename Kokkos::CudaSpace::execution_space>::
141 return cuda_pool_!=
nullptr;
144 Kokkos::Random_XorShift64_Pool<typename Kokkos::CudaSpace::execution_space> &
145 Static_Random_XorShift64_Pool<typename Kokkos::CudaSpace::execution_space>::
147 TEUCHOS_TEST_FOR_EXCEPTION(!isSet(),std::runtime_error,
"Tpetra::Details::Static_Random_XorShift64_Pool: resetPool() must be called before getPool");
150 #endif // KOKKOS_ENABLE_CUDA
154 #ifdef KOKKOS_ENABLE_HIP
156 Static_Random_XorShift64_Pool<typename Kokkos::HIPSpace::execution_space>::
157 resetPool(
int mpi_rank) {
158 using pool_type = Kokkos::Random_XorShift64_Pool<typename Kokkos::HIPSpace::execution_space>;
163 Kokkos::push_finalize_hook(finalize_hip_pool);
165 hip_pool_ =
new pool_type(getSeedFromRank(mpi_rank));
169 Static_Random_XorShift64_Pool<typename Kokkos::HIPSpace::execution_space>::
171 return hip_pool_!=
nullptr;
174 Kokkos::Random_XorShift64_Pool<typename Kokkos::HIPSpace::execution_space> &
175 Static_Random_XorShift64_Pool<typename Kokkos::HIPSpace::execution_space>::
177 TEUCHOS_TEST_FOR_EXCEPTION(!isSet(),std::runtime_error,
"Tpetra::Details::Static_Random_XorShift64_Pool: resetPool() must be called before getPool");
180 #endif // KOKKOS_ENABLE_HIP
184 #ifdef KOKKOS_ENABLE_SYCL
186 Static_Random_XorShift64_Pool<typename Kokkos::Experimental::SYCLDeviceUSMSpace::execution_space>::
187 resetPool(
int mpi_rank) {
188 using pool_type = Kokkos::Random_XorShift64_Pool<typename Kokkos::Experimental::SYCLDeviceUSMSpace::execution_space>;
193 Kokkos::push_finalize_hook(finalize_sycl_pool);
195 sycl_pool_ =
new pool_type(getSeedFromRank(mpi_rank));
199 Static_Random_XorShift64_Pool<typename Kokkos::Experimental::SYCLDeviceUSMSpace::execution_space>::
201 return sycl_pool_!=
nullptr;
204 Kokkos::Random_XorShift64_Pool<typename Kokkos::Experimental::SYCLDeviceUSMSpace::execution_space> &
205 Static_Random_XorShift64_Pool<typename Kokkos::Experimental::SYCLDeviceUSMSpace::execution_space>::
207 TEUCHOS_TEST_FOR_EXCEPTION(!isSet(),std::runtime_error,
"Tpetra::Details::Static_Random_XorShift64_Pool: resetPool() must be called before getPool");
210 #endif // KOKKOS_ENABLE_SYCL
214 #ifdef KOKKOS_ENABLE_OPENMP
216 Static_Random_XorShift64_Pool<Kokkos::OpenMP>::
217 resetPool(
int mpi_rank) {
218 using pool_type = Kokkos::Random_XorShift64_Pool<Kokkos::OpenMP>;
223 Kokkos::push_finalize_hook(finalize_openmp_pool);
225 openmp_pool_ =
new pool_type(getSeedFromRank(mpi_rank));
229 Static_Random_XorShift64_Pool<Kokkos::OpenMP>::
231 return openmp_pool_!=
nullptr;
234 Kokkos::Random_XorShift64_Pool<Kokkos::OpenMP> &
235 Static_Random_XorShift64_Pool<Kokkos::OpenMP>::
237 TEUCHOS_TEST_FOR_EXCEPTION(!isSet(),std::runtime_error,
"Tpetra::Details::Static_Random_XorShift64_Pool: resetPool() must be called before getPool");
238 return *openmp_pool_;
240 #endif // KOKKOS_ENABLE_OPENMP
244 #ifdef KOKKOS_ENABLE_SERIAL
246 Static_Random_XorShift64_Pool<Kokkos::Serial>::
247 resetPool(
int mpi_rank) {
248 using pool_type = Kokkos::Random_XorShift64_Pool<Kokkos::Serial>;
253 Kokkos::push_finalize_hook(finalize_serial_pool);
255 serial_pool_ =
new pool_type(getSeedFromRank(mpi_rank));
259 Static_Random_XorShift64_Pool<Kokkos::Serial>::
261 return serial_pool_!=
nullptr;
264 Kokkos::Random_XorShift64_Pool<Kokkos::Serial> &
265 Static_Random_XorShift64_Pool<Kokkos::Serial>::
267 TEUCHOS_TEST_FOR_EXCEPTION(!isSet(),std::runtime_error,
"Tpetra::Details::Static_Random_XorShift64_Pool: resetPool() must be called before getPool");
268 return *serial_pool_;
270 #endif // KOKKOS_ENABLE_SERIAL