Hello,
I am currently learning about how to use random functions, and am using the mkl version VSL_RNG.
I have made this simple code which compares the efficiency with generating all random numbers at once or doing so on the fly. The code runs in parallel where I am using VSL_BRNG_WH+rank to generate a different generator for each MPI process.
For generating nmax=1e8 numbers I get the following:
time = 0.35 seconds for generating all numbers at once (n=1 setting in the code)
time = 16 seconds for generating on the fly (n=2 setting in the code)
Is this an expected behaviour. Is it generally expected that the speed is much faster for doing all generating numbers at once before entering a loop?
include 'mkl_vsl.f90'
program rnd_test
use MKL_VSL
use MKL_VSL_TYPE
use mpi
implicit none
real(kind=8) t1,t2 ! buffer for random numbers
real(kind=8) s ! average
real(kind=8) a, sigma ! parameters of normal distribution
real(kind=8), allocatable :: r(:) ! buffer for random numbers
TYPE (VSL_STREAM_STATE)::stream
integer errcode
integer i,j, n11, nloop, nn
integer brng,method,seed,n, ierr, size, rank
integer(kind=8) :: nskip, nmax
call mpi_init(ierr)
call MPI_COMM_SIZE(MPI_COMM_WORLD, size, ierr)
call MPI_COMM_RANK(MPI_COMM_WORLD, rank, ierr)
n = 1
s = 0.0
a = 5.0
sigma = 2.0
nmax = 1e8
!-----------------------------------------------------------------------
nn = 2 ! (1): all at once. >1: on the fly
!----------------------------------------------------------------------
nloop = 0
if(nn>1)then
nloop=nmax
nn = 1
else
nloop=1
nn = nmax
endif
allocate(r(nn))
method=VSL_RNG_METHOD_GAUSSIAN_ICDF
seed=777
brng = VSL_BRNG_WH+rank
! ***** Initializing *****
errcode=vslnewstream( stream, brng, seed )
t1 = 0.
t2 = 0.
t1 = mpi_wtime()
! ***** Generating *****
do i = 1, nloop
errcode=vdrnggaussian( method, stream, nn, r, a, sigma )
! s = s + sum(r)
end do
t2= mpi_wtime()
! s = s / 10000.0
print*, "time: ", t2-t1
call mpi_barrier(MPI_COMM_WORLD,ierr)
! ***** Deinitialize *****
errcode=vsldeletestream( stream )
end program
best
Ali