|
Boost : |
Subject: Re: [boost] problems with the Random library in Boost v1.47
From: tcb (thecolourblue_at_[hidden])
Date: 2011-07-15 17:54:22
Hongyu Miao <jackymiao <at> gmail.com> writes:
>
> Hi, Steven
>
> Thanks for your reply. I'm using MSVC 2010, too. I met such problems when I
> generated a million random numbers with the mersenne_twister generator and
> OpenMP. I'm not sure whether v1.47 is thread safe, though. Here is the code
> triggered the memory access violation:
>
> int num_point = 1000;
>
> int n_para = 1000;
>
> boost::numeric::ublas::matrix<double> ui(num_point,
> n_para);
>
> #pragma omp parallel for shared(ui, num_point, n_para)
> private(i, j)
>
> for (i=0; i<num_point; i++)
>
> {
>
> for (j=0; j<n_para; j++)
>
> {
>
> ui(i,j) = unirand_real(0.0,1.0);
>
> }
>
> }
>
> Thanks,
>
> Jacky
>
Yes, this is wrong since the generators are not threadsafe.
If you really need to parallelize the generation of random numbers then you have
a couple of options:
-) use multiple generators- one for each thread. This has quite a bit of extra
overhead and you have to be very careful in seeding them so that the random
numbers are truly independent in the different streams. Check out this link:
http://theo.phys.sci.hiroshima-u.ac.jp/~ishikawa/PRNG/mt_stream_en.html
-) Instead of trying to paralleize your initialization loop, just use an openmp
version of the random generator instead. You can find details here:
http://www.pgroup.com/lit/articles/insider/v2n2a4.htm
This is not in boost that I know, but perhaps it might be considered to add an
openmp version- there is a nice speedup with very little work, and would be a
simple solution for people who run into this kind of problem.
Boost list run by bdawes at acm.org, gregod at cs.rpi.edu, cpdaniel at pacbell.net, john at johnmaddock.co.uk