Skip to content

Commit

Permalink
fix: ensure that LAPACK RNG state is propagated
Browse files Browse the repository at this point in the history
 - fixes opencollab#401, opencollab#410, opencollab#411
 - restores 'inits' variable removed in ce2e69a, ensuring that the RNG state is propagated
 - reverts e0d6705 to ensure that seed is different on each parallel thread
 - updates seed initialization of parallel pdgetv0/psgetv0 so that they match that of pzgetv0/pcgetv0
  • Loading branch information
szhorvat committed Apr 9, 2023
1 parent 396b90a commit b3fe4ad
Show file tree
Hide file tree
Showing 8 changed files with 183 additions and 80 deletions.
48 changes: 29 additions & 19 deletions PARPACK/SRC/MPI/pcgetv0.f
Original file line number Diff line number Diff line change
Expand Up @@ -176,13 +176,13 @@ subroutine pcgetv0
c | Local Scalars & Arrays |
c %------------------------%
c
logical first, orth
logical first, inits, orth
integer idist, iseed(4), iter, msglvl, jj, myid, igen
Real
& rnorm0
Complex
& cnorm, cnorm2
save first, iseed, iter, msglvl, orth, rnorm0
save first, iseed, inits, iter, msglvl, orth, rnorm0
c
Complex
& cnorm_buf, buf2(1)
Expand All @@ -203,6 +203,12 @@ subroutine pcgetv0
& ccdotc
external ccdotc, pscnorm2, slapy2
c
c %-----------------%
c | Data Statements |
c %-----------------%
c
data inits /.true./
c
c %-----------------------%
c | Executable Statements |
c %-----------------------%
Expand All @@ -213,26 +219,30 @@ subroutine pcgetv0
c | random number generator |
c %-----------------------------------%
c
if (inits) then
c
c %-----------------------------------%
c | Generate a seed on each processor |
c | using process id (myid). |
c | Note: the seed must be between 1 |
c | and 4095. iseed(4) must be odd. |
c %-----------------------------------%
c %-----------------------------------%
c | Generate a seed on each processor |
c | using process id (myid). |
c | Note: the seed must be between 1 |
c | and 4095. iseed(4) must be odd. |
c %-----------------------------------%
c
call MPI_COMM_RANK(comm, myid, ierr)
igen = 1000 + 2*myid + 1
if (igen .gt. 4095) then
write(0,*) 'Error in p_getv0: seed exceeds 4095!'
end if
call MPI_COMM_RANK(comm, myid, ierr)
igen = 1000 + 2*myid + 1
if (igen .gt. 4095) then
write(0,*) 'Error in p_getv0: seed exceeds 4095!'
end if
c
iseed(1) = igen/1000
igen = mod(igen,1000)
iseed(2) = igen/100
igen = mod(igen,100)
iseed(3) = igen/10
iseed(4) = mod(igen,10)
c
iseed(1) = igen/1000
igen = mod(igen,1000)
iseed(2) = igen/100
igen = mod(igen,100)
iseed(3) = igen/10
iseed(4) = 7
inits = .false.
end if
c
if (ido .eq. 0) then
c
Expand Down
40 changes: 33 additions & 7 deletions PARPACK/SRC/MPI/pdgetv0.f
Original file line number Diff line number Diff line change
Expand Up @@ -177,11 +177,11 @@ subroutine pdgetv0
c | Local Scalars & Arrays |
c %------------------------%
c
logical first, orth
integer idist, iseed(4), iter, msglvl, jj
logical first, inits, orth
integer idist, iseed(4), iter, msglvl, jj, myid, igen
Double precision
& rnorm0, buf2(1)
save first, iseed, iter, msglvl, orth, rnorm0
save first, iseed, inits, iter, msglvl, orth, rnorm0
c
Double precision
& rnorm_buf
Expand All @@ -206,6 +206,12 @@ subroutine pdgetv0
c
intrinsic abs, sqrt
c
c %-----------------%
c | Data Statements |
c %-----------------%
c
data inits /.true./
c
c %-----------------------%
c | Executable Statements |
c %-----------------------%
Expand All @@ -216,10 +222,30 @@ subroutine pdgetv0
c | random number generator |
c %-----------------------------------%
c
iseed(1) = 1
iseed(2) = 3
iseed(3) = 5
iseed(4) = 7
if (inits) then
c
c %-----------------------------------%
c | Generate a seed on each processor |
c | using process id (myid). |
c | Note: the seed must be between 1 |
c | and 4095. iseed(4) must be odd. |
c %-----------------------------------%
c
call MPI_COMM_RANK(comm, myid, ierr)
igen = 1000 + 2*myid + 1
if (igen .gt. 4095) then
write(0,*) 'Error in p_getv0: seed exceeds 4095!'
end if
c
iseed(1) = igen/1000
igen = mod(igen,1000)
iseed(2) = igen/100
igen = mod(igen,100)
iseed(3) = igen/10
iseed(4) = mod(igen,10)
c
inits = .false.
end if
c
if (ido .eq. 0) then
c
Expand Down
43 changes: 32 additions & 11 deletions PARPACK/SRC/MPI/psgetv0.f
Original file line number Diff line number Diff line change
Expand Up @@ -177,11 +177,11 @@ subroutine psgetv0
c | Local Scalars & Arrays |
c %------------------------%
c
logical first, orth
integer idist, iseed(4), iter, msglvl, jj
logical first, inits, orth
integer idist, iseed(4), iter, msglvl, jj, myid, igen
Real
& rnorm0
save first, iseed, iter, msglvl, orth, rnorm0
save first, iseed, inits, iter, msglvl, orth, rnorm0
c
Real
& rnorm_buf
Expand All @@ -206,20 +206,41 @@ subroutine psgetv0
c
intrinsic abs, sqrt
c
c %-----------------%
c | Data Statements |
c %-----------------%
c
data inits /.true./
c
c %-----------------------%
c | Executable Statements |
c %-----------------------%
c
c
c %-----------------------------------%
c | Initialize the seed of the LAPACK |
c | random number generator |
c %-----------------------------------%
if (inits) then
c
iseed(1) = 1
iseed(2) = 3
iseed(3) = 5
iseed(4) = 7
c %-----------------------------------%
c | Generate a seed on each processor |
c | using process id (myid). |
c | Note: the seed must be between 1 |
c | and 4095. iseed(4) must be odd. |
c %-----------------------------------%
c
call MPI_COMM_RANK(comm, myid, ierr)
igen = 1000 + 2*myid + 1
if (igen .gt. 4095) then
write(0,*) 'Error in p_getv0: seed exceeds 4095!'
end if
c
iseed(1) = igen/1000
igen = mod(igen,1000)
iseed(2) = igen/100
igen = mod(igen,100)
iseed(3) = igen/10
iseed(4) = mod(igen,10)
c
inits = .false.
end if
c
if (ido .eq. 0) then
c
Expand Down
48 changes: 29 additions & 19 deletions PARPACK/SRC/MPI/pzgetv0.f
Original file line number Diff line number Diff line change
Expand Up @@ -176,13 +176,13 @@ subroutine pzgetv0
c | Local Scalars & Arrays |
c %------------------------%
c
logical first, orth
logical first, inits, orth
integer idist, iseed(4), iter, msglvl, jj, myid, igen
Double precision
& rnorm0
Complex*16
& cnorm, cnorm2
save first, iseed, iter, msglvl, orth, rnorm0
save first, iseed, inits, iter, msglvl, orth, rnorm0
c
Complex*16
& cnorm_buf, buf2(1)
Expand All @@ -203,6 +203,12 @@ subroutine pzgetv0
& zzdotc
external zzdotc , pdznorm2 , dlapy2
c
c %-----------------%
c | Data Statements |
c %-----------------%
c
data inits /.true./
c
c %-----------------------%
c | Executable Statements |
c %-----------------------%
Expand All @@ -213,26 +219,30 @@ subroutine pzgetv0
c | random number generator |
c %-----------------------------------%
c
if (inits) then
c
c %-----------------------------------%
c | Generate a seed on each processor |
c | using process id (myid). |
c | Note: the seed must be between 1 |
c | and 4095. iseed(4) must be odd. |
c %-----------------------------------%
c %-----------------------------------%
c | Generate a seed on each processor |
c | using process id (myid). |
c | Note: the seed must be between 1 |
c | and 4095. iseed(4) must be odd. |
c %-----------------------------------%
c
call MPI_COMM_RANK(comm, myid, ierr)
igen = 1000 + 2*myid + 1
if (igen .gt. 4095) then
write(0,*) 'Error in p_getv0: seed exceeds 4095!'
end if
call MPI_COMM_RANK(comm, myid, ierr)
igen = 1000 + 2*myid + 1
if (igen .gt. 4095) then
write(0,*) 'Error in p_getv0: seed exceeds 4095!'
end if
c
iseed(1) = igen/1000
igen = mod(igen,1000)
iseed(2) = igen/100
igen = mod(igen,100)
iseed(3) = igen/10
iseed(4) = mod(igen,10)
c
iseed(1) = igen/1000
igen = mod(igen,1000)
iseed(2) = igen/100
igen = mod(igen,100)
iseed(3) = igen/10
iseed(4) = 7
inits = .false.
end if
c
if (ido .eq. 0) then
c
Expand Down
21 changes: 15 additions & 6 deletions SRC/cgetv0.f
Original file line number Diff line number Diff line change
Expand Up @@ -156,13 +156,13 @@ subroutine cgetv0
c | Local Scalars & Arrays |
c %------------------------%
c
logical first, orth
logical first, inits, orth
integer idist, iseed(4), iter, msglvl, jj
Real
& rnorm0
Complex
& cnorm
save first, iseed, iter, msglvl, orth, rnorm0
save first, iseed, inits, iter, msglvl, orth, rnorm0
c
c %----------------------%
c | External Subroutines |
Expand All @@ -180,6 +180,12 @@ subroutine cgetv0
& ccdotc
external ccdotc, scnrm2, slapy2
c
c %-----------------%
c | Data Statements |
c %-----------------%
c
data inits /.true./
c
c %-----------------------%
c | Executable Statements |
c %-----------------------%
Expand All @@ -190,10 +196,13 @@ subroutine cgetv0
c | random number generator |
c %-----------------------------------%
c
iseed(1) = 1
iseed(2) = 3
iseed(3) = 5
iseed(4) = 7
if (inits) then
iseed(1) = 1
iseed(2) = 3
iseed(3) = 5
iseed(4) = 7
inits = .false.
end if
c
if (ido .eq. 0) then
c
Expand Down
21 changes: 15 additions & 6 deletions SRC/dgetv0.f
Original file line number Diff line number Diff line change
Expand Up @@ -157,11 +157,11 @@ subroutine dgetv0
c | Local Scalars & Arrays |
c %------------------------%
c
logical first, orth
logical first, inits, orth
integer idist, iseed(4), iter, msglvl, jj
Double precision
& rnorm0
save first, iseed, iter, msglvl, orth, rnorm0
save first, iseed, inits, iter, msglvl, orth, rnorm0
c
c %----------------------%
c | External Subroutines |
Expand All @@ -183,6 +183,12 @@ subroutine dgetv0
c
intrinsic abs, sqrt
c
c %-----------------%
c | Data Statements |
c %-----------------%
c
data inits /.true./
c
c %-----------------------%
c | Executable Statements |
c %-----------------------%
Expand All @@ -193,10 +199,13 @@ subroutine dgetv0
c | random number generator |
c %-----------------------------------%
c
iseed(1) = 1
iseed(2) = 3
iseed(3) = 5
iseed(4) = 7
if (inits) then
iseed(1) = 1
iseed(2) = 3
iseed(3) = 5
iseed(4) = 7
inits = .false.
end if
c
if (ido .eq. 0) then
c
Expand Down

0 comments on commit b3fe4ad

Please sign in to comment.