help-gsl
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[Help-gsl] (no subject)


From: M A
Subject: [Help-gsl] (no subject)
Date: Sat, 3 May 2014 21:58:45 +0100 (BST)

Dear All I wish to use effectively use the gsl random number generator jointly 
with OpenMP on a HPC cluster. The simulation I have to do are quite simple: 
just let evolve an
"ensemble" of system with the same dynamics. Parallelize such a code 
with OpenMP "seems" straightforward.
As the GSL does not support parallel processing, I suppose that we must 
use a different random number generator for each element of the ensemble;
Indeed I don't know if this is a good procedure. The ensemble could be very big 
and it would be simply impossible to 
allocate memory for all generators associated with the Systems of the 
ensemble.
Then my question is:
Is this still a correct way to use the GSL random generator on OpenMP? An idea 
of how the allocation could be done is given in the code below.
Does it make any sense? If not, which is the correct way? Best wishes, Al. 
#include <stdlib.h>
#include <stdio.h>
#include <gsl/gsl_rng.h>
#include <gsl/gsl_randist.h>
#include <omp.h> int main (){ int i; int DIM_ENSEMBLE = 10000000000; double *d; 
gsl_rng **r ; d = malloc(DIM_ENSEMBLE*sizeof(double)); r = 
malloc(DIM_ENSEMBLE*sizeof(gsl_rng*)) 
;                                            ; for (i=0;i<DIM_ENSEMBLE;i++){ 
r[i] = gsl_rng_alloc (gsl_rng_mt19937);
//        r[i] = gsl_rng_alloc (gsl_rng_taus); gsl_rng_set(r[i],i); } size_t n 
= gsl_rng_size (r[0]);  //size in byte (the size of 
tausworthe is 24 ; the size of mersenne twister is 5000) #pragma omp  parallel 
for default(none) shared(r,d) shared(DIM_ENSEMBLE) for  (i =0; i< DIM_ENSEMBLE; 
i++) { d[i] = gsl_rng_uniform(r[i]); } #pragma omp  parallel for default(none) 
shared(d) shared(DIM_ENSEMBLE) for (i=0;i<DIM_ENSEMBLE;i++){ printf("%d 
%f\n",i,d[i]); } printf("The size in Mb of the vector r is %lu 
Mb\n",n*DIM_ENSEMBLE/1000000); free(d); for (i=0;i<DIM_ENSEMBLE;i++){ 
gsl_rng_free (r[i]); } free(r); return 0;
}


reply via email to

[Prev in Thread] Current Thread [Next in Thread]