在并行计算中使用rng('shuffle')函数

时间:2014-09-11 07:14:53

标签: matlab parallel-processing random-sample parfor

我在parfor中有一个Matlab循环用于并行计算。我希望在每个调用8个worker上的parfor循环时有不同的随机数。如果我不使用rng('shuffle')函数,则randperm(10)具有相同的随机数。在这种情况下,我的代码在所有工作者中同时在rng('shuffle')之前运行randperm函数。在这种情况下我有不同的随机数吗?当我在parfor循环中看到randperm输出时,其中一些输出是相同的!

我需要在rng之前保存rng('shuffle')并在结束并行循环后使用类似rng(saved_rng)的内容吗?

我们在Matlab帮助中有这个:

  

注意因为rng('shuffle')基于随机数生成器播种   在当前时间,您不应该使用此命令来设置随机   如果你想保证独立,不同工人的数字流   流。当命令发送到多个时,尤其如此   工人同时工作,例如在parfor,spmd或a   沟通工作。对于工人的独立流,请使用   默认行为;或者如果这不足以满足您的需求,   考虑在每个工人身上使用一个独特的子流。

那我该怎么办?如果删除rng,我有不同的随机数吗?我有这两个版本的代码。其中一个是使用parfor进行计算,另一个使用for循环进行计算,我可以从shuffle循环中删除for吗?在这种情况下我有不同的随机数?

感谢。

的PS。

我可以拥有这些结构:

parfor I=1:X
xx = randperm(10)
end


parfor I=1:X
rng('shuffle');
xx = randperm(10)
end

rng('shuffle');
parfor I=1:X
xx = randperm(10)
end

我希望randperm函数中包含不同的随机数。我怎样才能做到这一点?对于for结构,我需要shuffle函数(没有它,随机数是相同的)但是当我将它添加到parfor时,randperm的一些随机输出是相同的!< / p>

1 个答案:

答案 0 :(得分:1)

要正确执行此操作,您需要选择支持并行子流的RNG算法(换句话说,您可以将随机流拆分为子流,并且每个子流仍然具有您想要的正确统计属性随机流)。

默认的RNG算法(Mersenne Twister,或mt19937ar)不支持并行子流,但MATLAB支持两种算法(乘法滞后Fibonacci生成器mlfg6331_64和组合多重递归生成器{{ 1}})。

例如:

mrg32k3a

s = RandStream.create('mrg32k3a','NumStreams',4,'Seed','shuffle','CellOutput',true)现在是随机数子流的单元数组。所有都有相同的种子,如果需要,您可以记录s的重现性。

现在,您可以调用s{1}.Seed(或rand(s{1}))从流1生成随机数,依此类推。使用randn(s{1})将流重置为其初始配置,您会发现每个流都可以单独重现。

然后,每个工作人员都可以以统计上合理的方式生成随机数,并且即使并行也可以重现:

reset(s{1})

有关详细信息,请查看“加速统计计算”下的“统计工具箱”文档。这里有一些文章带您了解所有复杂的细节。如果您没有统计工具箱,则该文档将在MathWorks网站上联机。