0eaee4abb1
Currently, when a new thread needs to use the RANDOM_NUMBER intrinsic, the per-thread PRNG state is initialized by copying the master state and then jumping forwards N*2**128 entries in the stream so that the PRNG streams for different threads don't alias each other, where N is the number of threads that have so far initialized the PRNG. With this patch the master state itself is jumped forwards once each time a new thread initializes the PRNG, thus obviating the need to jump through all the N-1 previous streams. Effectively turning an O(N) algorithm into an O(1) one. Regtested on x86_64-pc-linux-gnu. libgfortran/ChangeLog: 2019-09-05 Janne Blomqvist <jb@gcc.gnu.org> * intrinsics/random.c (master_init): Replace with master_state.init. (njumps): Remove variable. (master_state): Make instance of struct prng_state. (init_rand_state): When jumping, update the master_state once instead of keeping track of how many jumps need to be done. (SZU64): Modify to handle new master_state. (SZ): Likewise. (random_seed_i4): Likewise. (random_seed_i8): Likewise. From-SVN: r275397 |
||
---|---|---|
.. | ||
abort.c | ||
access.c | ||
args.c | ||
associated.c | ||
c99_functions.c | ||
chdir.c | ||
chmod.c | ||
clock.c | ||
cpu_time.c | ||
cshift0.c | ||
ctime.c | ||
date_and_time.c | ||
dprod_r8.f90 | ||
dtime.c | ||
env.c | ||
eoshift0.c | ||
eoshift2.c | ||
erfc_scaled_inc.c | ||
erfc_scaled.c | ||
etime.c | ||
execute_command_line.c | ||
exit.c | ||
extends_type_of.c | ||
f2c_specifics.F90 | ||
fnum.c | ||
gerror.c | ||
getcwd.c | ||
getlog.c | ||
getXid.c | ||
hostnm.c | ||
ierrno.c | ||
is_contiguous.c | ||
ishftc.c | ||
kill.c | ||
link.c | ||
move_alloc.c | ||
mvbits.c | ||
pack_generic.c | ||
perror.c | ||
rand.c | ||
random_init.f90 | ||
random.c | ||
rename.c | ||
reshape_generic.c | ||
reshape_packed.c | ||
selected_char_kind.c | ||
selected_int_kind.f90 | ||
selected_real_kind.f90 | ||
signal.c | ||
size.c | ||
sleep.c | ||
spread_generic.c | ||
stat.c | ||
string_intrinsics_inc.c | ||
string_intrinsics.c | ||
symlnk.c | ||
system_clock.c | ||
system.c | ||
time_1.h | ||
time.c | ||
umask.c | ||
unlink.c | ||
unpack_generic.c |