https://gcc.gnu.org/bugzilla/show_bug.cgi?id=98253

--- Comment #6 from kargl at gcc dot gnu.org ---
(In reply to Dominique d'Humieres from comment #4)
> Invalid expectation?

Not sure.  This long response was composed before I saw Damian's reply.

At the risk of starting an existential argument, I'll provide
my understanding of the situtation.

Prior to random_init(), Fortran had random_seed().  When J3
added random_number() and random_seed() to Fortran standard,
the individual who wrote the specification forgot to include
a statement about the state of the PRNG if random_seed() was 
not called.  So, this simple program

program foo
   real r
   call random_number(r)
   print *, r
end program foo

when compiled with ifort would give a different PRN on each
invocation.  A long time ago, when compiled with gfortran,
the program always gave the same PRN.  (Janne changed gfortran's
behavior when he replaced replaced the KISS PRNG with xshiro++.)
The problem was that ifort used a different processor-dependent
set of seeds on each invocation whereas gfortran used the same
processor-dependent set of seeds on each invocation.  Both
behaviors are standard conforming.  To resolve the problem, J3
could not select one behavior over the other without causing
problems with a conforming program that relied on the old behavior.

Steve Lionel wrote the specification for random_init() in
hopes of fixing shortcomings of random_seed().  Unfortunately,
he (and/or J3) decided to conflated behavior for coarray
programs into the specification.  Consider the simply non-coarray
program:

% cat u.f90
program foo
   call random_init(repeatable=.false., image_distinct=.false.)
   do i = 1, 3
      call random_number(r)
      print '(F8.5), r
   end do
   print *
   call random_init(repeatable=.false., image_distinct=.false.)
   do i = 1, 3
      call random_number(r)
      print '(F8.5), r
   end do
end program foo

% gfcx -o z u.f90 && ./z
 0.78330
 0.40072
 0.22728

 0.44823
 0.12879
 0.50003

Exactly, the behavior one would expect.  Reseeding the PRNG
uses a new set of processor-dependent seeds.  If 'z' is run
again, a different set of processor-dependent seeds are used.

Now change the code to have 'repeatable=.true.'

% gfcx -o z u.f90 && ./z
 0.67367
 0.06375
 0.69694

 0.67367
 0.06375
 0.69694

Exactly, what one expects.  When the second random_init() is
called, the PRNG is re-initialized with the original set of
processor-dependent seeds.  What happens if the executable is
run again?  Well,
% ./z
 0.34318
 0.90421
 0.38122

 0.34318
 0.90421
 0.38122
A different set of processor-dependent seeds are used to initially
seed the PRNG, and when random_init() is called a second time, it
uses that "different set of processor-dependent seeds" to re-initialize
the PRNG.

So, where does existentialism enter into the issue?  When executable
'./z' is run the following occurs:
  1) 'image0' is instantiated
  2) random_init() is called
  3) the do-loop executes
  3) 'image0' is terminated.
a year later when './z' is run again, the following occurs:
  a) 'image0' is instantiated
  b) random_init() is called
  c) the do-loop executes
  d) 'image0' is terminated.

When 'image0' in a) is instantiated, 'image0' in 1) no longer exists.
There is no way to determined what set of processor-dependent seeds
were used for random_init() in 2) when random_init() is called in b).
It does not matter what value is assigned to image_distinct in the
above code.  Is 'image0' in a) the same as 'image0' in 1) or are these
images distinct?

IMO, image_distinct only applies when more than one image is
instantiate during the execution of a co-array program.  image_distinct
should have been an optional argument.  Suppose you have a
program that has num_images() return a value of 2.  You execute that
program and the following occurs:
  I) 'image0' is instantiated
 II) 'image1' is instantiated
III) one or more images call random_init()
 IV) work is done
  V) one or more images call random_init(), again.
 VI) image1 terminates
VII) image0 terminates
It is here that image_distinct can affect the seeding of PRNG.
When I developed random_init(), I spent a few days getting
opencoarray installed on my system.  I then spent some time
trying to getting a reasonable approach of dealing with 
images (don't remember any consideration about teams).  The
comment in libgfortran/intrinsics/random_init.f90 details 
what happens with combinations of 'repeatable' and 'image_distinct'

Reply via email to