周海军同学分享 http://blog.sciencenet.cn/u/haijunzhouitp

博文

并行计算中的随机数产生问题

已有 6487 次阅读 2012-5-29 21:49 |个人分类:有所思|系统分类:科研笔记|关键词:学者| 并行计算, 随机数

只会做一点最简单的数值计算。一直用一个比较慢的随机数生成程序,它不适合于并行计算环境。

几年以前,读过Heiko Bauke和Steven Mertens的论文,知道他们开发了一个并行随机数软件包,
称为TRNG (是Tina's Random Number Generator的缩写)。

这几天仔细阅读了该软件包的使用手册,也请我的一位同事将它安装到我们的微型并行计算机系统了。
发现它真的很好,值得推荐。推荐理由如下:

a) 有N种不同的随机数产生器,N -->infty!
b) 提供block splitting及leapfrog功能(这样一个随机数序列可以分配给任意多个进程):这分别通过jump及split函数实现;
c) ...
d) ...

软件包的下载地址为:

如果您在使用时有心得体会,请一定要教我。

一个简单的应用程序(目的是理解随机数产生器的一种调用方式,以及split 函数的应用):

====
#include <cmath>
#include <fstream>
#include <iostream>
#include <string>
#include <valarray>
#include <trng/lcg64_shift.hpp>
#include <trng/uniform01_dist.hpp>
#include "mpi.h"
using namespace std;

class mytest
{
public:
  test(trng::lcg64_shift &, trng::lcg64_shift&);
  void simulation(const string& );

private:
   trng::lcg64_shift PRNG;  
   trng::lcg64_shift PRNG2;  
   trng::uniform01_dist<> uprn; 
};

int main(int argc, char ** argv)
{
  int number_of_processes, my_rank;

  MPI_Init(&argc, &argv);
  MPI_Comm_size(MPI_COMM_WORLD, &number_of_processes);
  MPI_Comm_rank(MPI_COMM_WORLD, &my_rank);
  if(number_of_processes!=8) exit(1);

  valarray<string> ofilename("t00.dat",number_of_processes);
  ofilename[0]="t00.dat";
  ofilename[1]="t01.dat";
  ofilename[2]="t02.dat";
  ofilename[3]="t03.dat";
  ofilename[4]="t04.dat";
  ofilename[5]="t05.dat";
  ofilename[6]="t06.dat";
  ofilename[7]="t07.dat";

  trng::lcg64_shift PRNG, PRNG2;    //定义两个随机数产生器
  PRNG.split(number_of_processes, my_rank); //将PRNG的序列leapfrog 到不同的进程

  mytest uniformrd(PRNG , PRNG2 );
  uniformrd.simulation(ofilename[my_rank]);

  MPI_Finalize();

  return 0;
}

mytest::mytest(trng::lcg64_shift &rd, trng::lcg64_shift &rd2)
{
  PRNG=rd;

  PRNG2=rd2;

  return ;
}

void my::simulation(const string& ofilename)
{
  ofstream output(ofilename.c_str() );
  output.precision(16);

  for(int i=0; i<10; ++i)
    output<<uprn(PRNG)<<endl;
  output<<endl<<endl<<endl;

  for(int j=0; j<10; ++j)
    {
      for(int i=0; i<8; ++i)
output<<uprn(PRNG2)<<endl;
      output<<endl;
    }
  output.close();

  return ;
}



https://m.sciencenet.cn/blog-560622-576369.html

上一篇:ICTP定量生物学资深博士后位置
下一篇:《白色巨塔》值得一看

3 蒋迅 haoye ilovemoney

该博文允许注册用户评论 请点击登录 评论 (1 个评论)

数据加载中...
扫一扫,分享此博文

Archiver|手机版|科学网 ( 京ICP备07017567号-12 )

GMT+8, 2024-5-18 02:43

Powered by ScienceNet.cn

Copyright © 2007- 中国科学报社

返回顶部