MCPcopy Create free account
hub / github.com/AMReX-Codes/amrex / FillRandomNormal

Function FillRandomNormal

Src/Base/AMReX_Random.cpp:298–352  ·  view source on GitHub ↗

Source from the content-addressed store, hash-verified

296}
297
298void 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

Callers

nothing calls this directly

Calls 6

RandomNormalFunction · 0.85
htod_memcpy_asyncFunction · 0.85
streamSynchronizeFunction · 0.85
get_thread_numFunction · 0.85
synchronizeFunction · 0.85
waitMethod · 0.45

Tested by

no test coverage detected