| 296 | } |
| 297 | |
| 298 | void FillRandomNormal (Real* p, Long N, Real mean, Real stddev) |
| 299 | { |
| 300 | if (N <= 0) { return; } |
| 301 | |
| 302 | #if defined(AMREX_USE_CUDA) || defined(AMREX_USE_HIP) |
| 303 | if (N == 1) { |
| 304 | auto r = amrex::RandomNormal(mean, stddev); |
| 305 | Gpu::htod_memcpy_async(p, &r, sizeof(Real)); |
| 306 | Gpu::streamSynchronize(); |
| 307 | return; |
| 308 | } |
| 309 | // The length passed to [cu|hip]randGenerateNormal must be even |
| 310 | Long Neven = (N%2 == 0) ? N : N-1; |
| 311 | #endif |
| 312 | |
| 313 | #if defined(AMREX_USE_CUDA) |
| 314 | |
| 315 | # ifdef BL_USE_FLOAT |
| 316 | AMREX_CURAND_SAFE_CALL(curandGenerateNormal(gpu_rand_generator, p, Neven, mean, stddev)); |
| 317 | # else |
| 318 | AMREX_CURAND_SAFE_CALL(curandGenerateNormalDouble(gpu_rand_generator, p, Neven, mean, stddev)); |
| 319 | # endif |
| 320 | |
| 321 | #elif defined(AMREX_USE_HIP) |
| 322 | |
| 323 | # ifdef BL_USE_FLOAT |
| 324 | AMREX_HIPRAND_SAFE_CALL(hiprandGenerateNormal(gpu_rand_generator, p, Neven, mean, stddev)); |
| 325 | # else |
| 326 | AMREX_HIPRAND_SAFE_CALL(hiprandGenerateNormalDouble(gpu_rand_generator, p, Neven, mean, stddev)); |
| 327 | # endif |
| 328 | |
| 329 | #elif defined(AMREX_USE_SYCL) |
| 330 | |
| 331 | oneapi::mkl::rng::gaussian<Real> distr(mean, stddev); |
| 332 | auto event = oneapi::mkl::rng::generate(distr, *gpu_rand_generator, N, p); |
| 333 | event.wait(); |
| 334 | |
| 335 | #else |
| 336 | |
| 337 | std::normal_distribution<Real> distribution(mean, stddev); |
| 338 | auto& gen = generators[OpenMP::get_thread_num()]; |
| 339 | for (Long i = 0; i < N; ++i) { |
| 340 | p[i] = distribution(gen); |
| 341 | } |
| 342 | |
| 343 | #endif |
| 344 | |
| 345 | #if defined(AMREX_USE_CUDA) || defined(AMREX_USE_HIP) |
| 346 | if (Neven < N) { |
| 347 | auto r = amrex::RandomNormal(mean, stddev); |
| 348 | Gpu::htod_memcpy_async(p+(N-1), &r, sizeof(Real)); |
| 349 | } |
| 350 | Gpu::synchronize(); |
| 351 | #endif |
| 352 | } |
| 353 | |
| 354 | } // namespace amrex |
| 355 |
nothing calls this directly
no test coverage detected