0

由于模拟运行需要大量时间,我正在使用并行化在 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,但是当我以这种方式使用并行化时,我看不到性能提升。

非常感谢您的帮助。

4

1 回答 1

0

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

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

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

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

例如

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

% Do you stuff
end

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

于 2015-08-22T09:41:57.210 回答