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