[Top][All Lists]

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

[Help-gsl] Usage of GSL random in parallel code [OpenMP]

From: Altro
Subject: [Help-gsl] Usage of GSL random in parallel code [OpenMP]
Date: Sat, 03 May 2014 21:32:49 +0100
User-agent: Mozilla/5.0 (X11; Linux x86_64; rv:24.0) Gecko/20100101 Thunderbird/24.4.0

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,


#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);

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);


   for (i=0;i<DIM_ENSEMBLE;i++){
        gsl_rng_free (r[i]);

return 0;

reply via email to

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