26 #ifndef ROCRAND_UNIFORM_H_
27 #define ROCRAND_UNIFORM_H_
29 #include "rocrand/rocrand_lfsr113.h"
30 #include "rocrand/rocrand_mrg31k3p.h"
31 #include "rocrand/rocrand_mrg32k3a.h"
32 #include "rocrand/rocrand_mtgp32.h"
33 #include "rocrand/rocrand_philox4x32_10.h"
34 #include "rocrand/rocrand_scrambled_sobol32.h"
35 #include "rocrand/rocrand_scrambled_sobol64.h"
36 #include "rocrand/rocrand_sobol32.h"
37 #include "rocrand/rocrand_sobol64.h"
38 #include "rocrand/rocrand_threefry2x32_20.h"
39 #include "rocrand/rocrand_threefry2x64_20.h"
40 #include "rocrand/rocrand_threefry4x32_20.h"
41 #include "rocrand/rocrand_threefry4x64_20.h"
42 #include "rocrand/rocrand_xorwow.h"
44 #include "rocrand/rocrand_common.h"
46 #include <hip/hip_runtime.h>
48 namespace rocrand_device {
57 union two_uints_to_ulong
59 two_uints uint2_value;
60 unsigned long long int ulong_value;
65 __forceinline__ __device__ __host__
float uniform_distribution(
unsigned int v)
67 return ROCRAND_2POW32_INV + (v * ROCRAND_2POW32_INV);
72 __forceinline__ __device__ __host__
float uniform_distribution(
unsigned long long int v)
74 return ROCRAND_2POW32_INV + (v >> 32) * ROCRAND_2POW32_INV;
77 __forceinline__ __device__ __host__ float4 uniform_distribution4(uint4 v)
80 ROCRAND_2POW32_INV + (v.x * ROCRAND_2POW32_INV),
81 ROCRAND_2POW32_INV + (v.y * ROCRAND_2POW32_INV),
82 ROCRAND_2POW32_INV + (v.z * ROCRAND_2POW32_INV),
83 ROCRAND_2POW32_INV + (v.w * ROCRAND_2POW32_INV)
87 __forceinline__ __device__ __host__ float4 uniform_distribution4(ulonglong4 v)
89 return float4{ROCRAND_2POW64_INV + (v.x * ROCRAND_2POW64_INV),
90 ROCRAND_2POW64_INV + (v.y * ROCRAND_2POW64_INV),
91 ROCRAND_2POW64_INV + (v.z * ROCRAND_2POW64_INV),
92 ROCRAND_2POW64_INV + (v.w * ROCRAND_2POW64_INV)};
97 __forceinline__ __device__ __host__
double uniform_distribution_double(
unsigned int v)
99 return ROCRAND_2POW32_INV_DOUBLE + (v * ROCRAND_2POW32_INV_DOUBLE);
102 __forceinline__ __device__ __host__
double uniform_distribution_double(
unsigned int v1,
105 two_uints_to_ulong v;
106 v.uint2_value.x = v1;
107 v.uint2_value.y = (v2 >> 11);
108 return ROCRAND_2POW53_INV_DOUBLE + (v.ulong_value * ROCRAND_2POW53_INV_DOUBLE);
111 __forceinline__ __device__ __host__
double uniform_distribution_double(
unsigned long long int v)
113 return ROCRAND_2POW53_INV_DOUBLE + (
116 (v >> 11) * ROCRAND_2POW53_INV_DOUBLE
120 __forceinline__ __device__ __host__ double2 uniform_distribution_double2(uint4 v)
123 uniform_distribution_double(v.x, v.y),
124 uniform_distribution_double(v.z, v.w)
128 __forceinline__ __device__ __host__ double4 uniform_distribution_double4(uint4 v1, uint4 v2)
131 uniform_distribution_double(v1.x, v1.y),
132 uniform_distribution_double(v1.z, v1.w),
133 uniform_distribution_double(v2.x, v2.y),
134 uniform_distribution_double(v2.z, v2.w)
138 __forceinline__ __device__ __host__ double2 uniform_distribution_double2(ulonglong2 v)
140 return double2{uniform_distribution_double(v.x), uniform_distribution_double(v.y)};
143 __forceinline__ __device__ __host__ double2 uniform_distribution_double2(ulonglong4 v)
145 return double2{uniform_distribution_double(v.x), uniform_distribution_double(v.y)};
148 __forceinline__ __device__ __host__ double4 uniform_distribution_double4(ulonglong4 v)
150 return double4{uniform_distribution_double(v.x),
151 uniform_distribution_double(v.z),
152 uniform_distribution_double(v.x),
153 uniform_distribution_double(v.z)};
156 __forceinline__ __device__ __host__ __half uniform_distribution_half(
unsigned short v)
158 return __float2half(ROCRAND_2POW16_INV + (v * ROCRAND_2POW16_INV));
163 template<
typename state_type>
164 __forceinline__ __device__ __host__
unsigned int mrg_uniform_distribution_uint(
unsigned int v)
168 __forceinline__ __device__ __host__
unsigned int
169 mrg_uniform_distribution_uint<rocrand_state_mrg31k3p>(
unsigned int v)
171 return static_cast<unsigned int>((v - 1) * ROCRAND_MRG31K3P_UINT32_NORM);
175 __forceinline__ __device__ __host__
unsigned int
176 mrg_uniform_distribution_uint<rocrand_state_mrg32k3a>(
unsigned int v)
178 return static_cast<unsigned int>((v - 1) * ROCRAND_MRG32K3A_UINT_NORM);
183 template<
typename state_type>
184 __forceinline__ __device__ __host__
float mrg_uniform_distribution(
unsigned int v) =
delete;
187 __forceinline__ __device__ __host__
float
188 mrg_uniform_distribution<rocrand_state_mrg31k3p>(
unsigned int v)
190 double ret =
static_cast<double>(v) * ROCRAND_MRG31K3P_NORM_DOUBLE;
191 return static_cast<float>(ret);
195 __forceinline__ __device__ __host__
float
196 mrg_uniform_distribution<rocrand_state_mrg32k3a>(
unsigned int v)
198 double ret =
static_cast<double>(v) * ROCRAND_MRG32K3A_NORM_DOUBLE;
199 return static_cast<float>(ret);
204 template<
typename state_type>
205 __forceinline__ __device__ __host__
double mrg_uniform_distribution_double(
unsigned int v) =
delete;
208 __forceinline__ __device__ __host__
double
209 mrg_uniform_distribution_double<rocrand_state_mrg31k3p>(
unsigned int v)
211 double ret =
static_cast<double>(v) * ROCRAND_MRG31K3P_NORM_DOUBLE;
216 __forceinline__ __device__ __host__
double
217 mrg_uniform_distribution_double<rocrand_state_mrg32k3a>(
unsigned int v)
219 double ret =
static_cast<double>(v) * ROCRAND_MRG32K3A_NORM_DOUBLE;
238 __forceinline__ __device__ __host__
241 return rocrand_device::detail::uniform_distribution(
rocrand(state));
256 __forceinline__ __device__ __host__
263 rocrand_device::detail::uniform_distribution(state1),
264 rocrand_device::detail::uniform_distribution(state2)
280 __forceinline__ __device__ __host__
283 return rocrand_device::detail::uniform_distribution4(
rocrand4(state));
298 __forceinline__ __device__ __host__
304 return rocrand_device::detail::uniform_distribution_double(state1, state2);
319 __forceinline__ __device__ __host__
322 return rocrand_device::detail::uniform_distribution_double2(
rocrand4(state));
337 __forceinline__ __device__ __host__
340 return rocrand_device::detail::uniform_distribution_double4(
rocrand4(state),
rocrand4(state));
355 __forceinline__ __device__ __host__
358 return rocrand_device::detail::mrg_uniform_distribution<rocrand_state_mrg31k3p>(state->next());
376 __forceinline__ __device__ __host__
379 return rocrand_device::detail::mrg_uniform_distribution_double<rocrand_state_mrg31k3p>(
395 __forceinline__ __device__ __host__
398 return rocrand_device::detail::mrg_uniform_distribution<rocrand_state_mrg32k3a>(state->next());
416 __forceinline__ __device__ __host__
419 return rocrand_device::detail::mrg_uniform_distribution_double<rocrand_state_mrg32k3a>(
435 __forceinline__ __device__ __host__
438 return rocrand_device::detail::uniform_distribution(
rocrand(state));
453 __forceinline__ __device__ __host__
459 return rocrand_device::detail::uniform_distribution_double(state1, state2);
474 __forceinline__ __device__
477 return rocrand_device::detail::uniform_distribution(
rocrand(state));
495 __forceinline__ __device__
498 return rocrand_device::detail::uniform_distribution_double(
rocrand(state));
513 __forceinline__ __device__ __host__
516 return rocrand_device::detail::uniform_distribution(
rocrand(state));
534 __forceinline__ __device__ __host__
537 return rocrand_device::detail::uniform_distribution_double(
rocrand(state));
552 __forceinline__ __device__ __host__
555 return rocrand_device::detail::uniform_distribution(
rocrand(state));
573 __forceinline__ __device__ __host__
576 return rocrand_device::detail::uniform_distribution_double(
rocrand(state));
591 __forceinline__ __device__ __host__
594 return rocrand_device::detail::uniform_distribution(
rocrand(state));
609 __forceinline__ __device__ __host__
612 return rocrand_device::detail::uniform_distribution_double(
rocrand(state));
627 __forceinline__ __device__ __host__
630 return rocrand_device::detail::uniform_distribution(
rocrand(state));
645 __forceinline__ __device__ __host__
648 return rocrand_device::detail::uniform_distribution_double(
rocrand(state));
663 __forceinline__ __device__ __host__
666 return rocrand_device::detail::uniform_distribution(
rocrand(state));
684 __forceinline__ __device__ __host__
687 return rocrand_device::detail::uniform_distribution_double(
rocrand(state));
702 __forceinline__ __device__ __host__
705 return rocrand_device::detail::uniform_distribution(
rocrand(state));
723 __forceinline__ __device__ __host__
726 return rocrand_device::detail::uniform_distribution_double(
rocrand(state));
741 __forceinline__ __device__ __host__
744 return rocrand_device::detail::uniform_distribution(
rocrand(state));
762 __forceinline__ __device__ __host__
765 return rocrand_device::detail::uniform_distribution_double(
rocrand(state));
780 __forceinline__ __device__ __host__
783 return rocrand_device::detail::uniform_distribution(
rocrand(state));
801 __forceinline__ __device__ __host__
804 return rocrand_device::detail::uniform_distribution_double(
rocrand(state));
819 __forceinline__ __device__ __host__
822 return rocrand_device::detail::uniform_distribution(
rocrand(state));
840 __forceinline__ __device__ __host__
843 return rocrand_device::detail::uniform_distribution_double(
rocrand(state));
__forceinline__ __device__ __host__ float4 rocrand_uniform4(rocrand_state_philox4x32_10 *state)
Returns four uniformly distributed random float values from (0; 1] range.
Definition: rocrand_uniform.h:281
__forceinline__ __device__ __host__ double4 rocrand_uniform_double4(rocrand_state_philox4x32_10 *state)
Returns four uniformly distributed random double values from (0; 1] range.
Definition: rocrand_uniform.h:338
__forceinline__ __device__ __host__ uint4 rocrand4(rocrand_state_philox4x32_10 *state)
Returns four uniformly distributed random unsigned int values from [0; 2^32 - 1] range.
Definition: rocrand_philox4x32_10.h:379
__forceinline__ __device__ __host__ double rocrand_uniform_double(rocrand_state_philox4x32_10 *state)
Returns a uniformly distributed random double value from (0; 1] range.
Definition: rocrand_uniform.h:299
__forceinline__ __device__ __host__ float rocrand_uniform(rocrand_state_philox4x32_10 *state)
Returns a uniformly distributed random float value from (0; 1] range.
Definition: rocrand_uniform.h:239
__forceinline__ __device__ __host__ float2 rocrand_uniform2(rocrand_state_philox4x32_10 *state)
Returns two uniformly distributed random float values from (0; 1] range.
Definition: rocrand_uniform.h:257
__forceinline__ __device__ __host__ unsigned int rocrand(rocrand_state_lfsr113 *state)
Returns uniformly distributed random unsigned int value from [0; 2^32 - 1] range.
Definition: rocrand_lfsr113.h:277
__forceinline__ __device__ __host__ double2 rocrand_uniform_double2(rocrand_state_philox4x32_10 *state)
Returns two uniformly distributed random double values from (0; 1] range.
Definition: rocrand_uniform.h:320