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