只会做一点最简单的数值计算。一直用一个比较慢的随机数生成程序,它不适合于并行计算环境。
几年以前,读过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://blog.sciencenet.cn/blog-560622-576369.html
上一篇:
ICTP定量生物学资深博士后位置下一篇:
《白色巨塔》值得一看