问题Parfor Implemenation

3视图(30天)
你好,
我新的并行计算和我试图并行化(相对密集的)代码,使它运行得更快。然而,我面临很多问题,我不能够地址。的代码如下:
%初始猜测政策功能
c_pol = max (cmin r * 1(年代,1)* b_grid);
c_poli = c_pol;%的下一个迭代
%猜V_t + 1
负载CRRA.mat%加载c_pol和n_pol CRRA在原始GL代码(开始前检查线终端党卫军部分)
v_pol = (1 / (1-bet)) * (c_pol。^ (1-gam) / (1-gam)) + pssi * (((1-n_pol)。^ (1-eta)) / (1-eta));
v_poli = v_pol;%的下一个迭代
dif = 1;
dif > tol_pol
ui =公关* (((-v_pol)。^ (t1)。* (c_pol。^ (gam)));
ui = ui (:, b_grid > =φ);
v_u =公关* ((-v_pol)。^(1α));
v_un = v_u (:, b_grid > =φ);
v_con = v_u (:, b_grid <φ);
s = 1: s% %这里我需要并行化
c = ((1 + r) *注* ((v_un(年代,:))。^(α/(1α)。* ui(年代,:)))。^ (1 / gam);
n = max (0,1 - fac (s) * c。^ gameta);
b = b_grid (b_grid > =φ)/ (1 + r) + c -θ(s) * n - z(年代);
v = c。^ (1-gam)。* ((1 / (1-gam))) + pssi *(((其它)。^ (1-eta)) / (1-eta)) -赌* ((v_un(年代,:))。^(1 /(1α)));
如果(1)>φ
c_c = linspace (cl (s), c (1), Ic);% * * *
n_c = max (0, 1 - fac (s) * c_c。^ gameta);
b_c =φ/ (1 + r) + c_c -θ(s) * n_c - z (s);
六世= cl (1,1) ^ (1-gam)。* ((1 / (1-gam))) + pssi * (((1-n_c)。^ (1-eta)) / (1-eta)) -赌* ((v_un(1,1))。^(1 /(1α)));
v_c = linspace(六世(1),v (1), Ic);
b = [b_c (1: Ic-1), b];
c = [c_c (1: Ic-1), c);
v = [v_c (1: Ic-1), v);
结束
c_poli(年代)= interp1 (b, c, b_grid,“线性”,“extrap”);%真实c_t + 1
v_poli(年代)= interp1 (b, v, b_grid,“线性”,“extrap”);%真实v_t + 1
v_poli (v_poli > 0) = 1 e-6;
结束
%检查收敛性
c_poli = max (c_poli cmin);
v_poli = min (v_poli cmin);
dif1 = max (max (abs (c_poli - c_pol)));
dif2 = max (max (abs (v_poli-v_pol)));
dif = max ([dif1 dif2]);
%更新
c_pol = c_poli;
v_pol = v_poli;
结束
尝试使用“parfor”我得到以下错误“无法分类变量v_poli parfor-loop身体的”,我不知道如何解决。
任何帮助将不胜感激

接受的答案

沃尔特·罗伯森
沃尔特·罗伯森 2021年6月19日
改变
v_poli(年代)= interp1 (b, v, b_grid,“线性”,“extrap”);%真实v_t + 1
v_poli (v_poli > 0) = 1 e-6;
v_polis = interp1 (b, v, b_grid,“线性”,“extrap”);%真实v_t + 1
v_polis (v_polis > 0) = 1 e-6;
:v_poli (s) = v_polis;
否则你要测试 所有 v_poli()包括行是由其他循环迭代。
5个评论
Panagiotis Veneris
Panagiotis Veneris 2021年7月1日
%管家
%关闭所有;
清晰;
clc;
% = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = =
% 1。设置参数
% = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = =
%方便从劳动力供给方程全局参数
全球θz fac gameta
%固定参数
gam = 4;%的倒数EIS
弗里希= 1;% avg弗里希过去。
r = 2.5/400;%党卫军利率
RA = 10;%风险规避
α= 1-RA /访问;% = 0 (RA = gam)减少CRRA案例
%校准目标
不= 0.4;% avg小时的工作
nu_Y = 0.4;%的UI / GDP中获益
B_4Y = 1.6;%液体财富每年GDP
D1_4Y = 0.18;% HH债务与GDP年度初始党卫军
D2_4Y = 0.08;% HH债务与GDP年度终端党卫军
%休闲曲率遵循
η= 1 /弗里希* (1 - NE) /东北;
gameta = gam / eta;
%的数值参数
麦克斯特= 500;%标定最大迭代数
cmin = 1 e-6;%对消费下界
tol_pol = 1平台以及;%宽容政策级函数
tol_dist = 1平台以及;%公差级分布
tol_mkt = 1 e-6;%公差级市场出清
tol_cali = 1的军医;%为校准公差级
%资产网格
我= 200;%对债券的数量的网格点
Ic = 100;%的现消费% Ic = 2;
bmin = 2;%下界
bmax = 50;%上界
b_grid = bmin +((1:我)/ I)。^ 2 * (bmax - bmin);%为低密度值
db = 0.01;% MPC的步长
%的收入冲击过程
负载inc_process %加载x,公关,公关
%十二个国家工作状态由陶亨马尔可夫链的方法
% x:日志生产力(实际工资)
%的公关:过渡矩阵
%的公关:不变的分布
%增加失业
θ= [0;exp (x)];
S =长度(θ);%的国家生产力(13个州对生产率/实际工资)
鳍= 0.8820;%求职概率
9月= 0.0573;%分离概率
%的新转移矩阵
公关= [1-fin,鳍*公关;9月* (s - 1, - 1), (1-sep) *公关];
%找到新的invariate分布
公关=[0,公关];
dif = 1;
虽然dif > tol_dist
革命制度党=公关*公关;
dif = max (abs (pri-pr));
公关=革命制度党;
结束
%初始猜测校准参数,NE ~ Y
打赌= 0.8 ^ (1/4);%的折扣因素
ν= nu_Y *东北;%的UI的好处
B = B_4Y *不* 4;%的净债券的供应
phi1 = D1_4Y *不* 2;%借贷约束初始党卫军= 0.1440
phi2 = D2_4Y *不* 2;%借贷约束终端党卫军= 0.0640
东北pssi = ^ (gam) * (1-NE) ^埃塔;%如果代理从劳动负效用
%为直接校准设置rerun_initial = 1。
% rerun_initial = 1;
% rerun_terminal = 1;
% = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = =
% 2。校准初始稳态
% = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = =
%如果rerun_initial = = 1
%负载标准;
%结束
%设置相关借贷约束
φ= phi1;
%预先配置
cl = 1 (1, S);%的消费借贷约束
n_pol = 0 (S I);%劳动政策
y_pol = 0 (S I);%生产政策
b_pol = 0 (S I);%的储蓄政策
mpc = 0 (S I);% mpc
抽搐
disp(“计算初始平衡…”);
parfor = 1:麦克斯特
%更新(政府)预算约束
τ= (pr(1) *νB + r / (1 + r) *) /(1 -公关(1));%劳动税
z =[ν,τ*的(1,s - 1)];%完全传输方案(τ波浪号纸)
%在状态空间的下界找到消费:今天当
%,明天代理在债务上限- >约束绑定
% t和t + 1
fac = (pssi。/θ)^(1 /η);
s = 1: s %循环/生产力州(13)
cl (s) = fzero (“find_cl”,…%的目标
[cmin, 100),……%区间对分
[],……%的选项
年代,φ,φ,r);%,资产,利率
结束
%)解决消费政策
% - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
%初始猜测政策功能
c_pol = max (cmin r * 1(年代,1)* b_grid);%猜c_t + 1
c_poli = c_pol;%的下一个迭代
%猜V_t + 1
负载CRRA。垫%加载c_pol和n_pol CRRA在原始GL代码(开始前检查线终端党卫军部分)
v_pol = (1 / (1-bet)) * (c_pol。^ (1-gam) / (1-gam)) + pssi * (((1-n_pol)。^ (1-eta)) / (1-eta));%想使用c_pol V_t + 1,从CRRA n_pol情况
% v_pol = (c_pol。^ (1-gam) / (1-gam)) + pssi * (((1-n_pol)。^ (1-eta)) / (1-eta));%没问题
v_poli = v_pol;%的下一个迭代
dif = 1;
虽然dif > tol_pol
%预计明天边际效用
ui =公关* (((-v_pol)。^ (t1)。* (c_pol。^ (gam)));
ui = ui (:, b_grid > =φ);
v_u =公关* ((-v_pol)。^(1α));
v_un = v_u (:, b_grid > =φ);
v_con = v_u (:, b_grid <φ);
% parfor s = 1: s
s = 1: s
%无约束
c = ((1 + r) *注* ((v_un(年代,:))。^(α/(1α)。* ui(年代,:)))。^ (1 / gam);% c_t
n = max (0,1 - fac (s) * c。^ gameta);% n_t
b = b_grid (b_grid > =φ)/ (1 + r) + c -θ(s) * n - z(年代);% b_t
v = c。^ (1-gam)。* ((1 / (1-gam))) + pssi *(((其它)。^ (1-eta)) / (1-eta)) -赌* ((v_un(年代,:))。^(1 /(1α)));% v_t
%的限制
如果b(1) >φ
c_c = linspace (cl (s), c (1), Ic);
n_c = max (0, 1 - fac (s) * c_c。^ gameta);
b_c =φ/ (1 + r) + c_c -θ(s) * n_c - z (s);
六世= cl (1,1) ^ (1-gam)。* ((1 / (1-gam))) + pssi * (((1-n_c)。^ (1-eta)) / (1-eta)) -赌* ((v_un(1,1))。^(1 /(1α)));%值函数在下界
v_c = linspace(六世(1),v (1), Ic);%值函数(v_t)的限制
b = [b_c (1: Ic-1), b];%总b_t
c = [c_c (1: Ic-1), c);%总c_t
v = [v_c (1: Ic-1), v);%总v_t
结束
c_poli(年代)= interp1 (b, c, b_grid,“线性”,“extrap”);%真实c_t + 1 > 0无处不在
v_poli(年代)= interp1 (b, v, b_grid,“线性”,“extrap”);%真实v_t + 1 < 0无处不在
v_poli (v_poli > 0) = 1 e-6;
%并行化部分
% c_polis = interp1 (b, c, b_grid,“线性”,“extrap”);
% c_poli(年代,:)= c_polis;
% v_polis = interp1 (b, v, b_grid,“线性”,“extrap”);%真实v_t + 1%
% v_polis (v_polis > 0) = 1 e-6;
% v_poli(年代,:)= v_polis;
结束
%检查收敛性
c_poli = max (c_poli cmin);%执行非负限制消费
v_poli = min (v_poli cmin);% % % %检查! ! !也许我们应该最小
dif1 = max (max (abs (c_poli - c_pol)));
dif2 = max (max (abs (v_poli-v_pol)));
dif = max ([dif1 dif2]);
%更新
c_pol = c_poli;
v_pol = v_poli;
结束
%保存其他政策功能和mpc
% parfor s = 1: s %并行化
s = 1: s
n_pol(年代)= max (0, 1 - fac (s) * c_pol(年代,:)。^ gameta);
:y_pol (s) =θ(s) * n_pol(年代:);
b_pol(年代)= max ((1 + r) * (b_grid + y_pol(年代,:)- c_pol(年代:)+ z (s)),φ);
mpc(年代)= (interp1 (b_grid, c_pol(年代,:),b_grid + db,“线性”,“extrap”)——c_pol(年代,:))/ db;
结束
% B)找到不变(迭代概率分布。反式。矩阵找到不变分布的债券)
% - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
%分配权重相邻网格点距离成正比
[~,ib_pol] = histc (b_pol b_grid);
ib_pol (ib_pol < 1) = 1;
魏= (b_pol - b_grid (ib_pol)。/ (b_grid (ib_pol + 1) - b_grid (ib_pol));
%迭代资产转移矩阵从均匀分布
dif = 1;
pd = 1 (S I) / (S *);%资产分布(制服)周期t, s:产品。州,我:收入状态
虽然dif > tol_dist
pdi = 0 (S I);%初始化周期t + 1资产分布
s = 1: s %循环/生产力周期t网格
i = 1:我在周期t %网格遍历资产
如果= 1:S %循环/生产力网格在时间t + 1
pdi (si ib_pol (s i)) =(1 -魏(s i)) *公关(年代,si) * pd (s i) + pdi (si, ib_pol (s i));
pdi (si ib_pol (s i) + 1) =魏(s i) *公关(年代,si) * pd (s i) + pdi (si, ib_pol (s i) + 1);
结束
结束
结束
%检查收敛性
dif = max (max (abs (pdi - pd)));
%确保分布集成(金额)为1
pd = pdi /笔(金额(pdi));
结束
% C)检查市场出清和校准
% - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
%债券市场结算,我指的是当前迭代
Bi =总和(和(pd)。* b_grid);
res_mkt = abs (B - Bi);
%校准数据,我指的是当前迭代
易=总和(sum (pd。* y_pol));国内生产总值(GDP) %
NEi =总和(和(pd。* n_pol。* (n_pol > 0))) /笔(金额(pd。* (n_pol > 0)));% avg小时的工作
B_4Yi = Bi /易/ 4;%的债务比率
Di =总和(和(pd)。*分钟(b_grid, 0));
D_4Yi = Di /易/ 4;%的债务比率
nu_Yi =ν/易;%的UI效益比率
res_cali = max (abs ([B_4Yi、D_4Yi nu_Yi, NEi] - [B_4Y, D1_4Y nu_Y, NE]));
%报告收敛
disp([“迭代”,num2str (it)));
disp([债券mkt结算:,num2str (B - Bi)]);
disp([财富:液体,num2str (B_4Yi - B_4Y)));
disp([债务与国内生产总值:,num2str (D_4Yi - D1_4Y)));
disp ([UI好处:,num2str (nu_Yi - nu_Y)));
disp ([: Avg小时,num2str (NEi - NE)));
disp (' - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -”)
%检查收敛的,必要时更新
如果(res_cali < tol_cali) & & (res_mkt < tol_mkt)
打破;
其他的
%的折扣因素
btemp =日志(1-bet);
. 1 * (Bi - B_4Y btemp = btemp - * 4 *易);
打赌= 1 - exp (-btemp);
%将基于这些更新
phi_d =φ* D1_4Y / D_4Yi;
nu_d = nu_Y *易;
pssi_d = pssi * ((1-NE) / (1-NEi)) ^“埃塔”;
φ=φ+ 0.1 * (phi_d -φ);
ν=ν+ 1 * (nu_d -ν);
pssi = pssi + 1 * (pssi_d - pssi);
%更新总量
B = B + 0.1 * (Bi - B);%的净债券的供应
结束
结束
%总统计
日元=总和(sum (pd。* y_pol));国内生产总值(GDP) %
C1 =总和(sum (pd。* c_pol));%的消费
D1 =总和(和(pd)。*分钟(b_grid, 0));%的债务
N1 =总和(sum (pd。* n_pol));%劳动力供给(包括失业)
MPC1 =总和(sum (pd。* mpc));% MPC
%保存结果
phi1 =φ;
r1 = r;
pd1 = pd;
c_pol1 = c_pol;
b_pol1 = b_pol;
v_pol1 = v_pol;
图1百分比
图;
2 = (b_grid >φ)& (b_grid < 50 * Y1);%的域
次要情节(1、2、1)
情节(b_grid (ii) / (4 * Y1), c_pol (2, 2) b_grid (ii) / (4 * Y1), c_pol (ii),“——”,“线宽”,1.3);
标题(“消费”);
框;网格;
%设置(gca的字形大小14);
轴(13 0。6 [2])
次要情节(1、2、2)
情节(b_grid (ii) / (4 * Y1), n_pol (2, 2) b_grid (ii) / (4 * Y1), n_pol (ii),“——”,“线宽”,1.3);
标题(“劳动力供给”);
传奇(' \θ^ 2 ',' \θ^ 8 ');
框;网格;
%设置(gca的字形大小14);
轴([13 - 2。1。7)
集(gcf,“位置”,[440 378 700 300]);
设置(gcf PaperPosition, [0 0 14 6]);
集(gcf、“PaperSize”[6] 14日);
无花果= gcf;
saveas(图,“fig1-policies.pdf”);
这是整个脚本。这将是非常有用的理解当(,)我可以获得并行化,因为在我看来,我的部分并行(见% parfor命令)导致的开销,使得代码慢近7倍(408秒vs 2661秒执行)。

登录置评。

更多的答案(0)

类别

找到更多的在并行for循环(parfor)帮助中心文件交换

社区寻宝

找到宝藏在MATLAB中央,发现社区如何帮助你!

开始狩猎!

翻译的