Skip to content

When GSL PRNG + MPI used the same seed is used on all MPI ranks #12

@willfurnass

Description

@willfurnass
$ mpirun ./main 5 its/0.xml | grep -i GSL
[GSL Random Number Generator] generator type: mt19937
[GSL Random Number Generator] seed = 1515443941
[GSL Random Number Generator] first value = 4052102787
[GSL Random Number Generator] generator type: mt19937
[GSL Random Number Generator] seed = 1515443941
[GSL Random Number Generator] first value = 4052102787
[GSL Random Number Generator] generator type: mt19937
[GSL Random Number Generator] seed = 1515443941
[GSL Random Number Generator] first value = 4052102787
[GSL Random Number Generator] generator type: mt19937
[GSL Random Number Generator] seed = 1515443941
[GSL Random Number Generator] first value = 4052102787

(using xparser commit ef57674)

Do people think it makes sense to have independent RNG streams per MPI rank?

If so, how about instead of the following (from the xparser-generated main.c):

gsl_seed = gsl_rng_default_seed;
gsl_seed = (unsigned long int) FLAME_environment_variable_GSL_RNG_SEED;
if(gsl_seed == 0) gsl_seed = gsl_rng_default_seed;
if(gsl_seed == 0) gsl_seed = (unsigned long int)time(NULL);
gsl_rng_set(FLAME_GSL_RNG, gsl_seed);

having something like

masterSeed = gsl_rng_default_seed;
masterSeed = (unsigned long int) FLAME_environment_variable_GSL_RNG_SEED;
if(gsl_seed == 0) {
    masterSeed = gsl_rng_default_seed;
if(gsl_seed == 0) {
    masterSeed = (unsigned long int)time(NULL);
}
#ifdef MPI_VERSION
/* Determine a rank-specific seed */
int rank;
unsigned int rankSeed;
err = MPI_Comm_rank(MPI_COMM_WORLD, &rank);
rankSeed = masterSeed + (unsigned int) rank
gsl_rng_set(FLAME_GSL_RNG, rankSeed);
#else 
gsl_rng_set(FLAME_GSL_RNG, masterSeed);
#endif

I would stick this the above in start_simulation() in the C source file containing my transition functions but FLAME_GSL_RNG is not in scope there.

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions