
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.