From: Ulrich Drepper Date: Mon, 27 Aug 2012 12:08:16 +0000 (+0000) Subject: random.h (mersenne_twister_engine): Don't inline discard here. X-Git-Tag: releases/gcc-4.8.0~3762 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=b668e41af6d282351a28a46fa8a37c1a7b416687;p=thirdparty%2Fgcc.git random.h (mersenne_twister_engine): Don't inline discard here. * include/bits/random.h (mersenne_twister_engine): Don't inline discard here. New member function _M_gen_rand. * include/bits/random.tcc (mersenne_twister_engine<>::_M_gen_rand): New function. Extracted from operator(). (mersenne_twister_engine<>::discard): New implementation which skips in large steps. (mersenne_twister_engine<>::operator()): Use _M_gen_rand. From-SVN: r190711 --- diff --git a/libstdc++-v3/ChangeLog b/libstdc++-v3/ChangeLog index 057d4357638d..bc088e8c167a 100644 --- a/libstdc++-v3/ChangeLog +++ b/libstdc++-v3/ChangeLog @@ -1,3 +1,13 @@ +012-08-22 Ulrich Drepper + + * include/bits/random.h (mersenne_twister_engine): Don't inline + discard here. New member function _M_gen_rand. + * include/bits/random.tcc (mersenne_twister_engine<>::_M_gen_rand): + New function. Extracted from operator(). + (mersenne_twister_engine<>::discard): New implementation which + skips in large steps. + (mersenne_twister_engine<>::operator()): Use _M_gen_rand. + 2012-08-26 Marc Glisse Paolo Carlini diff --git a/libstdc++-v3/include/bits/random.h b/libstdc++-v3/include/bits/random.h index b43b5f49c4c4..35aceea85676 100644 --- a/libstdc++-v3/include/bits/random.h +++ b/libstdc++-v3/include/bits/random.h @@ -530,11 +530,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION * @brief Discard a sequence of random numbers. */ void - discard(unsigned long long __z) - { - for (; __z != 0ULL; --__z) - (*this)(); - } + discard(unsigned long long __z); result_type operator()(); @@ -610,6 +606,8 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION __l1, __f1>& __x); private: + void _M_gen_rand(); + _UIntType _M_x[state_size]; size_t _M_p; }; diff --git a/libstdc++-v3/include/bits/random.tcc b/libstdc++-v3/include/bits/random.tcc index a3924bea681a..6f501b1e9826 100644 --- a/libstdc++-v3/include/bits/random.tcc +++ b/libstdc++-v3/include/bits/random.tcc @@ -387,6 +387,60 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION _M_x[0] = __detail::_Shift<_UIntType, __w - 1>::__value; } + template + void + mersenne_twister_engine<_UIntType, __w, __n, __m, __r, __a, __u, __d, + __s, __b, __t, __c, __l, __f>:: + _M_gen_rand(void) + { + const _UIntType __upper_mask = (~_UIntType()) << __r; + const _UIntType __lower_mask = ~__upper_mask; + + for (size_t __k = 0; __k < (__n - __m); ++__k) + { + _UIntType __y = ((_M_x[__k] & __upper_mask) + | (_M_x[__k + 1] & __lower_mask)); + _M_x[__k] = (_M_x[__k + __m] ^ (__y >> 1) + ^ ((__y & 0x01) ? __a : 0)); + } + + for (size_t __k = (__n - __m); __k < (__n - 1); ++__k) + { + _UIntType __y = ((_M_x[__k] & __upper_mask) + | (_M_x[__k + 1] & __lower_mask)); + _M_x[__k] = (_M_x[__k + (__m - __n)] ^ (__y >> 1) + ^ ((__y & 0x01) ? __a : 0)); + } + + _UIntType __y = ((_M_x[__n - 1] & __upper_mask) + | (_M_x[0] & __lower_mask)); + _M_x[__n - 1] = (_M_x[__m - 1] ^ (__y >> 1) + ^ ((__y & 0x01) ? __a : 0)); + _M_p = 0; + } + + template + void + mersenne_twister_engine<_UIntType, __w, __n, __m, __r, __a, __u, __d, + __s, __b, __t, __c, __l, __f>:: + discard(unsigned long long __z) + { + while (__z > state_size - _M_p) + { + __z -= state_size - _M_p; + _M_gen_rand(); + } + _M_p += __z; + } + template= state_size) - { - const _UIntType __upper_mask = (~_UIntType()) << __r; - const _UIntType __lower_mask = ~__upper_mask; - - for (size_t __k = 0; __k < (__n - __m); ++__k) - { - _UIntType __y = ((_M_x[__k] & __upper_mask) - | (_M_x[__k + 1] & __lower_mask)); - _M_x[__k] = (_M_x[__k + __m] ^ (__y >> 1) - ^ ((__y & 0x01) ? __a : 0)); - } - - for (size_t __k = (__n - __m); __k < (__n - 1); ++__k) - { - _UIntType __y = ((_M_x[__k] & __upper_mask) - | (_M_x[__k + 1] & __lower_mask)); - _M_x[__k] = (_M_x[__k + (__m - __n)] ^ (__y >> 1) - ^ ((__y & 0x01) ? __a : 0)); - } - - _UIntType __y = ((_M_x[__n - 1] & __upper_mask) - | (_M_x[0] & __lower_mask)); - _M_x[__n - 1] = (_M_x[__m - 1] ^ (__y >> 1) - ^ ((__y & 0x01) ? __a : 0)); - _M_p = 0; - } + _M_gen_rand(); // Calculate o(x(i)). result_type __z = _M_x[_M_p++];