21 #ifndef ROCRAND_COMMON_H_
22 #define ROCRAND_COMMON_H_
24 #define ROCRAND_2POW16_INV (1.5258789e-05f)
25 #define ROCRAND_2POW16_INV_2PI (9.58738e-05f)
26 #define ROCRAND_2POW32_INV (2.3283064e-10f)
27 #define ROCRAND_2POW32_INV_DOUBLE (2.3283064365386963e-10)
28 #define ROCRAND_2POW64_INV (5.4210109e-20f)
29 #define ROCRAND_2POW64_INV_DOUBLE (5.4210108624275221700372640043497e-20)
30 #define ROCRAND_2POW32_INV_2PI (1.46291807e-09f)
31 #define ROCRAND_2POW53_INV_DOUBLE (1.1102230246251565e-16)
32 #define ROCRAND_PI (3.141592653f)
33 #define ROCRAND_PI_DOUBLE (3.1415926535897932)
34 #define ROCRAND_2PI (6.2831855f)
35 #define ROCRAND_SQRT2 (1.4142135f)
36 #define ROCRAND_SQRT2_DOUBLE (1.4142135623730951)
37 #define ROCRAND_NAN_FLOAT (0x7fc00000)
38 #define ROCRAND_NAN_DOUBLE (0x7ff8000000000000)
40 #include <hip/hip_runtime.h>
41 #if !defined(__HIPCC_RTC__)
45 #define ROCRAND_KERNEL __global__ static
47 #if __HIP_DEVICE_COMPILE__ \
48 && (defined(__HIP_PLATFORM_AMD__) \
49 || (defined(__HIP_PLATFORM_NVCC__) && (__CUDA_ARCH__ >= 530)))
50 #define ROCRAND_HALF_MATH_SUPPORTED
61 #define ROCRAND_STRINGIZE(X) ROCRAND_DO_STRINGIZE(X)
62 #define ROCRAND_DO_STRINGIZE(X) #X
73 #if defined(__INTEL_COMPILER)
74 #define ROCRAND_PRAGMA_MESSAGE(x) \
75 __pragma(message(__FILE__ "(" ROCRAND_STRINGIZE(__LINE__) "): note: " x))
76 #elif defined(__GNUC__)
77 #define ROCRAND_PRAGMA_MESSAGE(x) _Pragma(ROCRAND_STRINGIZE(message(x)))
78 #elif defined(_MSC_VER)
79 #define ROCRAND_PRAGMA_MESSAGE(x) \
80 __pragma(message(__FILE__ "(" ROCRAND_STRINGIZE(__LINE__) "): note: " x))
82 #define ROCRAND_PRAGMA_MESSAGE(x)
85 #if __cplusplus >= 201402L
86 #define ROCRAND_DEPRECATED(msg) [[deprecated(msg)]]
87 #elif defined(_MSC_VER) && !defined(__clang__)
88 #define ROCRAND_DEPRECATED(msg) __declspec(deprecated(msg))
89 #elif defined(__clang__) || defined(__GNUC__)
90 #define ROCRAND_DEPRECATED(msg) __attribute__((deprecated(msg)))
92 #define ROCRAND_DEPRECATED(msg)
113 #if defined(__HIP_PLATFORM_AMD__)
114 #if HIP_VERSION_MAJOR < 7
115 #define ROCRAND_HIPVEC_ACCESS(x) x.data
117 #define ROCRAND_HIPVEC_ACCESS(x) x
121 namespace rocrand_device
126 __forceinline__ __device__ __host__
128 mad_u64_u32(
const unsigned int x,
const unsigned int y,
const unsigned long long z)
130 return static_cast<unsigned long long>(x) *
static_cast<unsigned long long>(y) + z;
133 __forceinline__ __device__ __host__
134 unsigned long long mul_u64_u32(
const unsigned int x,
const unsigned int y)
136 return static_cast<unsigned long long>(x) *
static_cast<unsigned long long>(y);
141 template<
typename Engine>
142 struct engine_boxmuller_helper
144 static __forceinline__ __device__ __host__
145 bool has_float(
const Engine* engine)
147 return engine->m_state.boxmuller_float != ROCRAND_NAN_FLOAT;
150 static __forceinline__ __device__ __host__
151 float get_float(Engine* engine)
153 const float ret = engine->m_state.boxmuller_float;
154 engine->m_state.boxmuller_float = ROCRAND_NAN_FLOAT;
158 static __forceinline__ __device__ __host__
159 void save_float(Engine* engine,
float f)
161 engine->m_state.boxmuller_float = f;
164 static __forceinline__ __device__ __host__
165 bool has_double(
const Engine* engine)
167 return engine->m_state.boxmuller_double != ROCRAND_NAN_DOUBLE;
170 static __forceinline__ __device__ __host__
171 double get_double(Engine* engine)
173 const double ret = engine->m_state.boxmuller_double;
174 engine->m_state.boxmuller_double = ROCRAND_NAN_DOUBLE;
178 static __forceinline__ __device__ __host__
179 void save_double(Engine* engine,
double d)
181 engine->m_state.boxmuller_double = d;
186 __forceinline__ __device__ __host__
187 void split_ull(T& lo, T& hi,
unsigned long long int val);
190 __forceinline__ __device__ __host__
191 void split_ull(
unsigned int& lo,
unsigned int& hi,
unsigned long long int val)
193 lo = val & 0xFFFFFFFF;
194 hi = (val >> 32) & 0xFFFFFFFF;
198 __forceinline__ __device__ __host__
199 void split_ull(
unsigned long long int& lo,
unsigned long long int& hi,
unsigned long long int val)