mercredi 16 novembre 2016

Thread-safe parallel RNG slower than sequential rand()

I use this version of calculation of Pi with thread-safe function

rand_r   

But it appears that it is slower (and answer is wrong) when running this program in parallel comparing to sequential program with use of

rand()

which is not thread-safe. It seems that this way of using is also not thread-safe. But I do not understand why, because I have read many questions about thread-safe PRNGs and learned that rand_r should be safe enough.

#include <iostream>
#include <random>
#include <ctime>
#include "omp.h"
#include <stdlib.h>

using namespace std;

unsigned seed;

int main()
{
double start = time(0);

int i, n, N;
double x, y;



N = 1<<30;
n = 0;

double pi;



#pragma omp threadprivate(seed)
#pragma omp parallel private(x, y) reduction(+:n) 
{

for (i = 0; i < N; i++) {
seed = 25234 + 17 * omp_get_thread_num();
    x = rand_r(&seed) / (double) RAND_MAX;
    y = rand_r(&seed) / (double) RAND_MAX;

    if (x*x + y*y <= 1)
        n++;
}
}

pi = 4. * n / (double) (N);

cout << pi << endl;

double stop = time(0);

cout << (stop - start) << endl;

return 0;
}

P.S. By the way, what are the magic numbers in

seed = 25234 + 17 * omp_get_thread_num();

? I stole them from some answer.




Aucun commentaire:

Enregistrer un commentaire