并行随机数发生器
这是关于MATLAB随机数生成器的多部分系列的第二部分。如果你问帮助提高,你会得到很多信息,包括有三个现代发电机的事实。
'twister' Mersenne twister' combRecursive'组合多重递归' multifibonacci '乘法滞后斐波那契
我的以前的文章是关于捻线机.今天的帖子是关于另外两个,“combRecursive”而且“multFibonacci”,它们是为并行计算而设计的。
内容
并行计算演示
我经常使用纸牌游戏Blackjack来演示并行计算。同时,我可以演示随机数生成器。我将Blackjack视为一种金融工具,就像上市公司的股票一样。模拟投资规模作为时间的函数是蒙特卡罗技术的一个典型应用。
首先打开一个工人池。
parpool;
使用“本地”配置文件启动并行池(parpool)…连接2个工人。
4个玩家每人玩2万张21点。
P = 4;N = 20000;
在这个数组中收集结果。
B = 0 (n,p);
一个平行的为循环执行一个对并行计算一无所知的Blackjack程序。
parfork = 1: B(:,k) = cumsum(blackjacksim(n));结束
画出结果。
情节(B)标题([“21点,$”, int2str(sum(B(end,:)))) xlabel(“手的数量”) ylabel (的股份,($))轴([0 n -2500 2500])
平行流
牌处理调用随机数生成器。重要的是,不同的并行工作者有不同的、独立的随机数流。默认的MATLAB生成器捻线机不提供此功能。简单的开始捻线机用不同的种子对不同的工蜂不提供统计上独立的流。所以我们转向其他发电机。要查看这里使用的是哪一个,运行一个小的spmd,“单程序,多数据”块。
spmdr = rng s = r. state '格式短X = rand(1,7)结束
实验室1:r =类型:'combRecursive' Seed: 0 State: [12x1 uint32] s =列1到6 1720035765 2052922678 1637499698 3048064580 1173461082 2391850890列7到12 1862757735 2368998908 1385613640 1660833332 146924518 3104031825 x = 0.8789 0.6969 0.0409 0.4609 0.7528 0.2871 0.5241实验室2:r =类型:'combRecursive' Seed: 0 State:[12x1 uint32] s =列1 ~ 6 323405913 3817048408 3712601073 1070773748 1552739185 3267875480列7 ~ 12 1594297407 2533167732 3377045245 3413340742 2651847732 1248925296 x = 0.1072 0.3194 0.1048 0.6623 0.0878 0.3692 0.8035
我们看到我们有两个工人,他们都在使用combRecursive发电机,它们有相同的种子,但不同州,所以它们产生了不同的随机数。
combRecursive
也被称为mrg32k3a.一个32位组合多重递归发生器(CMRG),由蒙特利尔大学的Pierre L’ecuyer和他的同事在下面引用的论文中描述。这个生成器类似于RngStreams包中实现的CMRG。它的周期为$2^{127}$,并通过序列分割支持最多$2^{63}$金宝app的并行流,以及长度为$2^{76}$的$2^{51}$子流。这里是C源代码的链接。combmrg2.c
骨干发生器的状态是一个2 × 3的数组S,它在每一步都按照MATLAB中简洁表达的线性递归式进行演化
M1 = 2^32 - 209;M2 = 2^32 - 22853;x1 = mod(1403580*S(1,2)-810728*S(1,3),m1);x2 = mod(527612*S(2,1)-1370589*S(2,3),m2);S = [x1 S(1,1) S(1,2)) x2(2, 1)(2, 2));
一个单精度随机实数u然后由
Z = mod(x1-x2,m1);如果Z > 0, u = Z /(m1+1);其他的, u = m1/(m1+1);结束
该生成器的重要特性是,可以为并行池中的每个工作线程创建不同的初始状态,这样产生的随机数流在统计上是独立的。
multFibonacci
也被称为mlfg6331_64.64位乘法滞后斐波那契生成器(MLFG),由佛罗里达州立大学的Michael Mascagni和Ashok Srinivasan开发。这个生成器有滞后$l=63$和$k=31$,类似于在SPRNG包中实现的MLFG。它的周期约为$2^{124}$。通过参金宝app数化,它支持最多$2^{61}$的并行流,以及长度为$2^{72}$的$2^{51}$子流。
此生成器的状态是一个长度为63位整数s的向量
$$ x_n = x_{n-k} \乘以x_{n-l} (mod 2^{64}) $$
每个随机双精度值使用生成器中的一个64位整数创建;可能的值都是$2^{-53}$的倍数,严格在区间(0,1)内。
同样,这个生成器的重要特性是可以为并行池中的每个工作线程创建不同的初始状态,这样产生的随机数流在统计上是独立的。
哪一个?
你应该使用哪一个?大多数情况下,使用默认设置就可以了。你会得到“旋风”在串行计算中“combRecursive”在平行水池里的工人身上。你可以使用
rng(“洗牌”)
在会话开始时,如果您想在不同的会话中使用不同的随机数序列。否则,不用担心设置生成器或种子。
如果你想尝试,你可以使用rng在你的计算中尝试不同的生成器和不同的起始种子。如果你发现一个问题,它使显着差异,请让我们知道。
谢谢
再次感谢彼得·珀金斯。
参考文献
Pierre L'Ecuyer, R. Simard, E. J. Chen和W. D. Kelton。具有许多长流和子流的面向对象随机数包运筹学研究,50(6):1073-1075。2002.< http://www.iro.umontreal.ca/ ~ lecuyer / myftp /论文/ streams00.pdf>
皮埃尔L 'Ecuyer。组合多递归随机数生成器的良好参数和实现。运筹研究47(1):159-164。1999.< http://dx.doi.org/10.1287/opre.47.1.159>
Michael Mascagni和Ashok Srinivasan。参数化并行乘法滞后斐波那契生成器并行计算,30:899-916。2004.< http://www.cs.fsu.edu/ asriniva /论文/ mlfg.ps>
Michael Mascagni和Ashok Srinivasan。SPRNG:伪随机数生成的可扩展库。ACM数学软件汇刊,26卷436-461。2000.< http://www.cs.fsu.edu/ asriniva /论文/ sprngacm.ps>
评论
如欲留言,请点击在这里登录您的MathWorks帐户或创建一个新帐户。