i am trying to use nvfortran to start using GPUs in my code. However, I found some issue on a piece of my code that I didn’t write (so I don’t know what it is doing). Is basically doing some bit manipulation for a random number generator.
If I compile a simple code using intel fortran (gfortran gives the exact same numbers), or nvfortran, I get different numbers.
Here a simple code:
program testrandom
implicit none
integer, parameter :: i4=selected_int_kind(9)
integer, parameter :: i8=selected_int_kind(15)
integer, parameter :: r8=selected_real_kind(15,9)
integer(kind=i8), parameter :: mask24 = ishft(1_i8,24_i8)-1_i8
integer(kind=i8), parameter :: mask48 = ishft(1_i8,48_i8)-1_i8
real(kind=r8), parameter :: twom48=2.0_r8**(-48_i8)
integer(kind=i8), parameter :: mult1 = 44485709377909_i8
integer(kind=i8), parameter :: m11 = iand(mult1,mask24)
integer(kind=i8), parameter :: m12 = iand(ishft(mult1,-24_i8),mask24)
integer(kind=i8), parameter :: iadd1 = 96309754297_i8
integer(kind=i8) :: irn
real(kind=r8) :: rn
integer(kind=i8) :: is1,is2
print*,‘mask24=’,mask24
print*,‘mask48=’,mask48
print*,‘twom48=’,twom48
print*,‘mult1=’,mult1
print*,‘m11=’,m11
print*,‘m12=’,m12
print*,‘iadd1=’,iadd1
end program
And here the output given by using intel fortran and nvfortran:
stefano@quake:~/home/tmp$ ifort -o inizio random.f90; inizio
mask24= 16777215
mask48= 281474976710655
twom48= 3.552713678800501E-015
mult1= 44485709377909
m11= 15184245
m12= 2651554
iadd1= 96309754297
stefano@quake:~/home/tmp$ nvfortran -o inizio random.f90; inizio
mask24= 16777215
mask48= 281474976710655
twom48= 3.5527136788005009E-015
mult1= 44485709377909
m11= 15184245
m12= 653
iadd1= 96309754297
FORTRAN STOP
stefano@quake:~/home/tmp$
What is the problem? How can I solve it?
Thanks,
Stefano