I would like to use the vsl random number generators in a parallel monte carlo simulation, ie the possibility to distribute the simulation on all processor cores. Regarding this I have 2 different cases: - In the first case I would like to accelerate a simulation by distributing it on multiple processor cores. For example, let s say I need to simulate 10000 runs with each run containing 5000 timesteps. That means that I need to generate 10000*5000 random variates. My simulation would look something like this:
#define SEED 1
#define BRNG VSL_BRNG_MCG31
#define METHOD VSL_RNG_METHOD_GAUSSIAN_ICDF
// initialize vsl random generator streamVSLStreamStatePtr stream;
double a=0.0,sigma=0.3;
errcode = vslNewStream( &stream, BRNG, SEED );
for(int i=0; i<9999; i++){// simulate one path by generating 5000 variates.
double r[5000];
vdRngGaussian( METHOD, stream, N, r, a, sigma );
for (int j=0;j<4999;j++){
// simulate random walk using the variates
}
}
I would like to parallelize the outer loop. My question is: is it safe to call vdRngGaussian from multiple threads? And am I guaranteed to have independant variates?
The second scenario would be to parallelize multiple simulations. In this case I would like to do one full simulation per thread and I need to to generate independant variates for all simulations. In this case my question would be what is the approach to generating the random variates? Should I use one rng per thread and initialize them with different seeds? I have been told that this is not the best way of getting independant variates. Another method would be to use the leapfrog method. What is best?
anwar



