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
    No fields configured for issues without a type.

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions