疑似乱数生成(メルセンヌ・ツイスター)の並列化
C++/c++11の環境で疑似乱数生成のメルセンヌ・ツイスターを並列化して動作させる方法をご教示下さい。
boost/random.hppとopenmpの組合せで実装出来るのかとも考えいろいろ試したのですが、
簡単には並列化できないようです。
#include <boost/random.hpp>
#include <omp.h>
using namespace std;
using namespace boost;
mt19937 gen;
uniform_real<> uniform_dst(0,1);//min,max
variate_generator< mt19937,uniform_real<> > uniform(gen,uniform_dst);
void test1(){
uniform.engine().seed(123);
int NN=1600000;
int i;
double x;
#pragma omp parallel for private(i,x,gen)
for(i=0;i<NN;++i){
x=uniform();
printf("%f in thread:%d\n",x,omp_get_thread_num());
}
}
int main(){
test1();
return 0;
}
乱数生成器のmt19937をベースにしているのですが、openmpのループの中からこの乱数生成器を呼び出しても、乱数生成器自体は並列化されているわけではないようです。uniform()は個別のスレッドから呼び出されているようですが、乱数生成器の部分は共通して動作しており、並列化はされていないようです。この乱数生成器自体を並列化したいと考えています。
よろしくお願い致します。