【问题标题】:Generate random numbers inside spmd in matlab在matlab中的spmd内生成随机数
【发布时间】:2015-08-22 03:12:05
【问题描述】:

由于运行模拟需要大量时间,我正在使用并行化在 Matlab 中运行蒙特卡罗模拟。

主要目标是创建一个非常大的面板数据集并使用它来估计一些回归。

问题是,当我在没有并行的情况下运行模拟时,它们需要很长时间才能运行,所以我决定使用 spmd 选项。但是,运行并行代码的结果与正常运行代码的结果大不相同。

rng(3857);
for r=1:MCREP
Ycom=[];
Xcom=[];
YLcom=[];

spmd
for it=labindex:numlabs:NT
    (code to generate different components, alpha, delta, x_it, eps_it)
    %e.g. x_it=2+1*randn(TT,1);   
    (uses random number generator: rndn)

    % Create different time periods observations for each individual
    for t=2:TT
        yi(t)=xi*alpha+mu*delta+rho*yi(t-1)+beta*x_it(t)+eps_it(t);
        yLi(t)=yi(t-1);
    end

    % Concatenate each individual in a big matrix: create panel
    Ycom=[Ycom yi];
    Xcom=[Xcom x_it];
    YLcom=[YLcom yLi];
end
end

% Retrieve data stored in composite form
mm=matlabpool('size');
for i=1:mm
Y(:,(i-1)*(NT/mm)+1:i*(NT/mm))=Ycom{i};
X(:,(i-1)*(NT/mm)+1:i*(NT/mm))=Xcom{i};
YL(:,(i-1)*(NT/mm)+1:i*(NT/mm))=YLcom{i};
end

(rest of the code, run regressions)

end

代码的密集部分是与 spmd 并行化的部分,它创建了一个非常大的面板数据集,其中列是独立的个体,行是相关的时间段。

我的主要问题是,当我使用并行运行代码时,结果与我不使用它时的结果不同,而且如果我使用 8 个工人或 16 个工人,结果也不同。然而,在没有并行化的情况下运行代码在一段时间内是不可行的。

我相信问题出在随机数生成上,但我无法修复 spmd 中的种子,因为这意味着在 Monte Carlo 循环中修复种子,因此所有重复都将具有相同的数字。

我想知道如何修复随机数生成器,这样无论我使用多少个工人都可以得到相同的结果。

PS。另一种解决方案是在最外层循环(蒙特卡洛循环)中执行 spmd,但是当我以这种方式使用并行化时,我看不到性能提升。

非常感谢您的帮助。

【问题讨论】:

标签: matlab random parallel-processing montecarlo spmd


【解决方案1】:

呵呵... MATLAB 并行执行中的随机生成器确实是个问题。

关于随机生成器 (http://www.mathworks.com/help/matlab/math/creating-and-controlling-a-random-number-stream.html) 的 MATLAB 网页指出,只有两个流/生成器可以有多个流。这两者的期限有限(参见上一个链接中的表格)。

但是!!!默认生成器 (mt19937ar) 可以播种以获得不同的结果:)

因此,您可以做的是从mrg32k3a 开始,在每个worker 中获取一个随机数,然后使用这个随机数和worker 索引来播种mt19937ar 生成器。

例如

spmd
  r1 = rand(randStream{labindex}, [1 1]);
  r2 = rand(randStream{labindex}, [1 1]);
  rng(labindex+(r1/r2), 'twister');

% Do you stuff
end

当然,r1r2 可以修改(或者,也许,添加更多 r's)以获得更复杂的播种。

【讨论】:

    猜你喜欢
    • 2010-12-25
    • 1970-01-01
    • 2016-05-09
    • 2011-07-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-01-08
    • 1970-01-01
    相关资源
    最近更新 更多