27 #ifndef LBANN_UTILS_RANDOM_HPP 28 #define LBANN_UTILS_RANDOM_HPP 55 template <
typename Generator,
typename T>
63 typename Generator::result_type x;
66 }
while (x >= (Generator::max() - Generator::max() % max));
74 template <
typename Generator,
typename T>
77 typename Generator::result_type x;
79 const typename Generator::result_type upper =
81 (Generator::max() & (
typename Generator::result_type)max);
85 return x & ((
typename Generator::result_type)max);
95 template <
typename Generator,
typename T>
98 static T generate(Generator&);
100 template <
typename Generator>
108 constexpr uint64_t mask32 = 0xFFFFFFFFull;
109 const uint64_t r = uint64_t(g()) & mask32;
110 return (r >> 8) * (1.0f / 16777216.0f);
113 template <
typename Generator>
121 constexpr uint64_t mask32 = 0xFFFFFFFFull;
122 const uint64_t r = (uint64_t(g()) << 32) | (uint64_t(g()) & mask32);
123 return (r >> 11) * (1.0 / 9007199254740992.0);
130 template <
typename T,
typename Generator>
143 template <
typename TensorDataType>
144 void gaussian_fill(El::AbstractDistMatrix<TensorDataType>& mat,
147 TensorDataType mean = 0.0,
148 TensorDataType stddev = 1.0);
154 template <
typename TensorDataType>
164 template <
typename TensorDataType>
165 void uniform_fill(El::AbstractDistMatrix<TensorDataType>& mat,
168 TensorDataType center = 0.0,
169 TensorDataType radius = 1.0);
177 template <
typename TensorDataType>
181 TensorDataType mean = 0.0,
182 TensorDataType stddev = 1.0);
188 template <
typename TensorDataType>
198 template <
typename TensorDataType>
202 TensorDataType center = 0.0,
203 TensorDataType radius = 1.0);
211 template <
typename TensorDataType>
215 TensorDataType mean = 0.0,
216 TensorDataType stddev = 1.0);
222 template <
typename DistType,
typename DType = DataType>
233 rng(DType p) : m_dist(p) {}
235 rng(DType a, DType b) : m_dist(a, b) {}
241 template <
typename DType = DataType>
247 float scale = 1. / (1. - p);
252 for (
int row = 0; row < m->LocalHeight(); ++row) {
253 for (
int col = 0; col < m->LocalWidth(); ++col) {
254 m->Set(row, col, myrn.
gen() * scale);
259 #ifndef LBANN_RANDOM_INSTANTIATE 261 extern template void gaussian_fill<T>(El::AbstractDistMatrix<T> & mat, \ 266 extern template void bernoulli_fill<T>(El::AbstractDistMatrix<T> & mat, \ 270 extern template void uniform_fill<T>(El::AbstractDistMatrix<T> & mat, \ 275 extern template void gaussian_fill_procdet<T>(El::AbstractDistMatrix<T> & \ 281 extern template void bernoulli_fill_procdet<T>(El::AbstractDistMatrix<T> & \ 286 extern template void uniform_fill_procdet<T>(El::AbstractDistMatrix<T> & \ 292 extern template void gaussian_fill_parallel<T>(El::AbstractDistMatrix<T> & \ 299 #define LBANN_INSTANTIATE_CPU_HALF 300 #define LBANN_INSTANTIATE_GPU_HALF 303 #undef LBANN_INSTANTIATE_CPU_HALF 304 #undef LBANN_INSTANTIATE_GPU_HALF 305 #endif // LBANN_RANDOM_INSTANTIATE 308 #endif // LBANN_UTILS_RANDOM_HPP
T fast_rand_int(Generator &g, T max)
bool load_rng_from_checkpoint(persist &p, const lbann_comm *comm)
void rng_bernoulli(const float p, DistMat *m)
DistType::result_type gen()
MCMRMat< El::Device::CPU > DistMat
void uniform_fill_procdet(El::AbstractDistMatrix< TensorDataType > &mat, El::Int m, El::Int n, TensorDataType center=0.0, TensorDataType radius=1.0)
bool save_rng_to_checkpoint_distributed(persist &p, lbann_comm *comm)
void bernoulli_fill(El::AbstractDistMatrix< TensorDataType > &mat, El::Int m, El::Int n, double p=0.5)
T random_uniform(Generator &g)
Generate uniform random value in the range [0, 1).
void gaussian_fill_procdet(El::AbstractDistMatrix< TensorDataType > &mat, El::Int m, El::Int n, TensorDataType mean=0.0, TensorDataType stddev=1.0)
bool save_rng_to_checkpoint_shared(persist &p, lbann_comm *comm)
void bernoulli_fill_procdet(El::AbstractDistMatrix< TensorDataType > &mat, El::Int m, El::Int n, double p=0.5)
void gaussian_fill(El::AbstractDistMatrix< TensorDataType > &mat, El::Int m, El::Int n, TensorDataType mean=0.0, TensorDataType stddev=1.0)
void gaussian_fill_parallel(El::AbstractDistMatrix< TensorDataType > &mat, El::Int m, El::Int n, TensorDataType mean=0.0, TensorDataType stddev=1.0)
rng_gen & get_generator()
T fast_rand_int_pow2(Generator &g, T max)
void uniform_fill(El::AbstractDistMatrix< TensorDataType > &mat, El::Int m, El::Int n, TensorDataType center=0.0, TensorDataType radius=1.0)