gcc/libgfortran/intrinsics
Janne Blomqvist 0eaee4abb1 Improve PRNG jumping when using threads
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
2019-09-05 09:59:55 +03:00
..
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