主要内容

控制工人上的随机数流

随机数生成函数兰德兰迪,randn与MATLAB相比,并行计算的行为是不同的®客户端。您可以在并行工作人员或客户端上更改随机数生成器的行为,以生成可重复的随机数流。

默认情况下,MATLAB客户端和MATLAB工作人员使用不同的随机数生成器,即使工作人员是与客户端在同一台机器上的本地集群的一部分。下表总结了客户端和工作人员的默认设置:

发电机 种子 正常的变换
客户端 “旋风”“mt19937ar” 0 “神”
工作人员(本地或远程) “Threefry”“Threefry4x64_20” 0 “反转”

有关可用生成器和普通转换的更多信息,请参见选择随机数生成器.集群中的每个工作人员都从具有表中的属性的独立流中抽取随机数。a中每个worker上生成的随机数parfor每个循环和客户端生成的随机数都不一样。

请注意

如果你的工作器上有一个GPU,不同的设置适用于GPU上的随机数流。有关更多信息,请参见GPU上的随机数流

客户机和工人

如果需要在客户端和工作人员中生成相同的数字流,您可以设置一个匹配另一个。您可以设置生成器算法和种子使用rng

例如,您可能在一个worker上作为批处理作业运行一个脚本,并且需要与客户机相同的生成器或序列。假设您从一个名为randScript1.m它包含以下行:

R =兰德(1,4);

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

randScript1;%客户R
R = 0.8147 0.9058 0.1270 0.9134
parallel.defaultClusterProfile (“本地”) c = parcluster();j =批(c,“randScript1”);%对工人等待(j);负载(j);R
R = 0.1349 0.6744 0.9301 0.5332

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

rng (1,“Threefry”);R =兰德(1,4);

现在,在客户端和worker上运行新脚本:

randScript2;%客户R
R = 0.1404 0.8197 0.1073 0.4131
j =批(c,“randScript2”);%对工人等待(j);负载(j);R
R = 0.1404 0.8197 0.1073 0.4131

不同的工人

默认情况下,集群中工作于同一作业的每个worker都有一个独立的随机数流。如果兰德兰迪,或randn并行调用时,每个工人产生一个唯一的随机数序列。

请注意

因为rng(“洗牌”)基于当前时间的随机数生成器种子,如果你想确保独立的流,不要使用此命令在不同的worker上设置随机数流。当命令同时发送给多个worker时尤其如此,例如在parforspmd,或者是一份沟通工作。对于worker上的独立流,使用默认行为;或者,如果这还不足以满足您的需求,可以考虑在每个worker上使用唯一的子流RandStream

这个例子在一个并行池中使用了两个worker来显示它们生成了唯一的随机数序列。

p = parpool (2);spmdR =兰德(1,4);每个工人不同结束R {1}, {2}
Ans = 0.1349 0.6744 0.9301 0.5332
删除(p)

如果你需要所有工人生成相同的数字序列,你可以设置每个工人使用相同的生成器设置:

p = parpool (2);spmdrng (0,“Philox”);默认种子0。R =兰德(1,4);所有工人都一样结束R {1}, {2}
Ans = 0.3655 0.6975 0.1789 0.4549
删除(p)

如果你需要在a的每次迭代中控制随机数parfor循环,看在parfor循环中重复随机数

正态分布随机数

如果你用的是正态分布的随机数randn函数,您可以使用与上面相同的方法使用RandStream在每个worker和客户端上设置生成器类型、种子和普通转换算法。

例如,假设这个文件randScript3.m包含的代码:

流= RandStream (“Threefry”“种子”0,“NormalTransform”“反转”);RandStream.setGlobalStream(流);R = randn (7)
您可以在客户机和并行作业中的工作程序上运行此代码(使用批处理spmd)以产生相同的随机数序列:
R = -0.3479 0.1057 0.3969 0.6544 -1.8228 0.9587 0.5360

另请参阅

|

相关的话题