文档

控制随机数流

不同的工人

默认情况下,集群中的每个工人在同一工作有独特的随机数流。这个例子使用了两个工人在一个平行池给他们产生独特的随机数序列。

p = parpool (2);spmdR =兰德(1,4);%不同每个工人结束R {1}, {2}
0.3246 0.6618 0.6349 0.6497 0.2646 0.0968 0.5052 0.4866
删除(p)

如果你需要所有员工生成相同的数字序列,你可以种子他们的发电机都是一样的。

p = parpool (2);spmds = RandStream (“旋风”);%默认种子0。RandStream.setGlobalStream(年代);R =兰德(1,4);%同样对所有工人结束R {1}, {2}
0.8147 0.9058 0.1270 0.9134 0.8147 0.9058 0.1270 0.9134
删除(p)

请注意

因为rng(“洗牌”)种子的随机数发生器根据当前时间,你不应该使用这个命令来设置随机数流在不同的工人如果你想确保独立的溪流。尤其如此,当命令同时发送到多个工人,如在一个parfor,spmd或沟通工作。独立的溪流的工人,使用默认的行为;如果不能满足你的需求,考虑使用一个独特的substream每个工人。

说明如何生成随机数的一套可复制的parfor循环,看在parfor-Loops重复随机数字

客户机和工人

默认情况下,MATLAB®客户端和MATLAB工人使用不同的随机数生成器,即使工人们正在本地集群的一部分与客户在同一台机器上。为客户,默认是梅森素数捻线机发电机(“旋风”),工人们默认是结合多个递归发生器(“CombRecursive”“mrg32k3a”)。如果有必要生成相同的流客户机和工人的数量,你可以设置一个匹配另一个。

例如,您可以运行一个脚本作为批处理作业工人,并需要相同的序列生成器或客户端。假设你从一个脚本文件命名为开始randScript1.m包含:

R =兰德(1,4);

您可以在客户端运行此脚本,然后作为批处理作业工人。注意,默认生成的随机数序列的结果是不同的。

randScript1;%客户R
R = 0.8147 - 0.9058 0.1270 - 0.9134
parallel.defaultClusterProfile (“本地”)c = parcluster ();j =批(c,“randScript1”);%对工人等待(j);负载(j);R
R = 0.3246 - 0.6618 0.6349 - 0.6497

对于相同的结果,您可以设置客户机和工人使用相同的发电机和种子。这里的文件randScript2.m包含以下代码:

s = RandStream (“CombRecursive”,“种子”1);RandStream.setGlobalStream(年代);R =兰德(1,4);

现在,新的脚本运行在客户端和一个工人:

randScript2;%客户R
R = 0.4957 - 0.2243 0.2073 - 0.6823
j =批(c,“randScript2”);%对工人等待(j);负载(j);R
R = 0.4957 - 0.2243 0.2073 - 0.6823

客户端和GPU

默认情况下MATLAB客户使用不同的随机生成器代码运行在GPU上。gpu更像工人在这方面,并使用组合多个递归发生器(“CombRecursive”“mrg32k3a”)除非另有说明。

这个例子显示了一个默认生成随机数比较CPU和GPU在一个新的会话。

Rc =兰德(1、4)
Rc = 0.8147 - 0.9058 0.1270 - 0.9134
Rg =兰德(1,4,“gpuArray”)
Rg = 0.7270 0.4522 0.9387 0.2360

请注意,GPU支持只有三个发电机(万博1manbetx“CombRecursive”,“Philox4x32-10”,“Threefry4x64-20”)。下表列出了算法对这些发电机及其属性。

关键字 发电机 多个流和Substream支持万博1manbetx 近似的时期完全精确
“CombRecursive”“mrg32k3a” 结合多个递归发电机 是的 2127年
“Philox4x32-10” Philox 4×10轮发电机 是的 2129年
“Threefry4x64-20” Threefry 4 x64和20轮发电机 是的 2258年

这些是默认客户端发电机的CPU。在CPU和GPU生成相同的序列,您必须使用唯一的发电机由两个:万博1manbetx“CombRecursive”

sc = RandStream (“CombRecursive”,“种子”1);RandStream.setGlobalStream (sc);Rc =兰德(1、4)
Rc = 0.4957 - 0.2243 0.2073 - 0.6823
sg = parallel.gpu.RandStream (“CombRecursive”,“种子”1);parallel.gpu.RandStream.setGlobalStream (sg);Rg =兰德(1,4,“gpuArray”)
Rg = 0.4957 0.2243 0.2073 0.6823

正态分布随机数产生的randn、CPU代码默认使用一个用一个随机流NormalTransform设置金字形神塔,而GPU代码使用的设置反演。你可以设置CPU和GPU发电机得到同样的也一样randn序列。GPU只支持万博1manbetx反演,所以设置CPU来匹配:

sc = RandStream (“CombRecursive”,“NormalTransform”,“反转”,“种子”1);RandStream.setGlobalStream (sc) sg = parallel.gpu.RandStream (“CombRecursive”,“NormalTransform”,“反转”,“种子”1);parallel.gpu.RandStream.setGlobalStream (sg);Rc = randn (1、4)
Rc = -0.0108 - -0.7577 -0.8159 - 0.4742
Rg = randn (1, 4,“gpuArray”)
Rg = -0.0108 -0.7577 -0.8159 0.4742

工人CPU和GPU

代码运行在一个工人的CPU使用相同的随机数生成器来创建代码运行在一个工人的GPU,但他们不共享相同的流。你可以使用一个普通种子生成相同的数字序列,如本例中所示,其中每个工人GPU和CPU上创建相同的序列,但不同序列的其他工人。

p = parpool (2);spmdsc = RandStream (“CombRecursive”,“种子”,labindex);RandStream.setGlobalStream (sc);兰德(1、4)sg Rc = = parallel.gpu.RandStream (“CombRecursive”,“种子”,labindex);parallel.gpu.RandStream.setGlobalStream (sg);Rg =兰德(1,4,“gpuArray”)结束删除(p)

正态分布的随机数randn在默认情况下,一个工人CPU使用NormalTransform设置金字形神塔当一个工人GPU使用的设置反演。你可以设置它们反演如果你需要相同的序列从CPU和GPU。

这个主题有帮助吗?