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