matlab - 在 MATLAB 中运行 PARFOR 循环时内存不足
问题描述
我和一些同事在集群上运行以下函数时内存不足,其中 F_scattered 是使用scatterInterpolant 生成的插值集合。任何人都可以建议我们可以采取的步骤来减少 parfor 循环的内存密集度吗?我担心编写的代码可能会将所有 F_scattered 发送给每个工作人员,但我不确定如何检查是否发生这种情况。如果有帮助,此消息底部会提供更多上下文。预先感谢您的帮助。
函数 [V1q,V2q] = interpolate(F_gridded,X_gridded,F_scattered,X_scattered)
w = F_gridded(X_gridded);
k = fix(w);
w = w-k;
[n,m] = size(F_scattered);
assert(n==2)
F1 = cell(m,1);
F2 = cell(m,1);
parfor j=1:m
kj = k==j;
X = X_scattered(kj,:);
if j<m
W = w(kj);
F1{j} = (1-W).*F_scattered{1,j}(X)+W.*F_scattered{1,j+1}(X);
F2{j} = (1-W).*F_scattered{2,j}(X)+W.*F_scattered{2,j+1}(X);
else
F1{j} = F_scattered{1,j}(X);
F2{j} = F_scattered{2,j}(X);
end
end
Vq = nan(size(w));
for j=1:m
kj = k==j;
V1q(kj) = F1{j};
V2q(kj) = F2{j};
end
结尾
附加上下文如下。我和一些同事正在尝试使用内生网格方法在七维网格上进行搭配。相关详情如下:
• 我们的维度是(b1,dstate,omega,u,b2,b3,eps_pi)。b1、b2、b3 和 eps 是连续的。dstate、omega 和 u 是离散的。eps_pi 由于内生网格算法而分散,但其他变量的网格是使用 ndgrid 从向量构建的。
• 因为scatteredInterpolant 最多接受三个维度的参数,所以我们通过在(b1,dstate,omega,u) 中“切片”我们的搭配网格来构造我们的插值,然后在与每个切片相关联的(b2,b3,eps_pi) 值上运行scatterInterpolant .
• 由于 b1 是 (b1,dstate,omega,u) 中唯一的连续变量,因此我们通过 (i) 进行插值,找到包含 (b1,dstate,omega,u) 的查询值的两个切片,然后 (ii)在 (b2,b3,eps_pi) 的查询值上运行与这些切片相关联的分散插值,然后 (iii) 对输出进行适当加权平均。
以下是相对最小形式的代码的关键部分:
%%% 设置网格向量
b1_t_grid = linspace(0,1,8);
dstate_t_grid = [-1:12];
omega_t_grid = [-2,2];
u_t_grid = [0,1];
b2_t_grid = linspace(0,1,5);
b3_t_grid = linspace(0,1,5);
quasidiff_t_grid = linspace(-9*0.05*4*2,9*0.05*4*2,8); % ``target’’ variable for the endogenous grid method
%%% 将切片维度与其他维度分开
gridded_dims_TSnow = [numel(b1_t_grid),numel(dstate_t_grid),numel(omega_t_grid),numel(u_t_grid)];
n_gridded_substates_TSnow = prod(gridded_dims_TSnow);
scattered_dims_TSnow = [numel(b2_t_grid),numel(b3_t_grid),numel(quasidiff_t_grid)];
n_scattered_substates_TSnow = prod(scattered_dims_TSnow);
[b1_ts_TSnow,dstate_ts_TSnow,omega_ts_TSnow,u_ts_TSnow,b2_ts_TSnow,b3_ts_TSnow,quasidiff_ts_TSnow] = ndgrid(b1_t_grid,dstate_t_grid,omega_t_grid,u_t_grid,b2_t_grid,b3_t_grid,quasidiff_t_grid);
b1_ts_TSnow = reshape(b1_ts_TSnow ,n_gridded_substates_TSnow,n_scattered_substates_TSnow);
dstate_ts_TSnow = reshape(dstate_ts_TSnow ,n_gridded_substates_TSnow,n_scattered_substates_TSnow);
omega_ts_TSnow = reshape(omega_ts_TSnow ,n_gridded_substates_TSnow,n_scattered_substates_TSnow);
u_ts_TSnow = reshape(u_ts_TSnow ,n_gridded_substates_TSnow,n_scattered_substates_TSnow);
b2_ts_TSnow = reshape(b2_ts_TSnow ,n_gridded_substates_TSnow,n_scattered_substates_TSnow);
b3_ts_TSnow = reshape(b3_ts_TSnow ,n_gridded_substates_TSnow,n_scattered_substates_TSnow);
quasidiff_ts_TSnow = reshape(quasidiff_ts_TSnow,n_gridded_substates_TSnow,n_scattered_substates_TSnow);
grid_size_TSnow = numel(b1_ts_TSnow);
grid_dims_TSnow = size(b1_ts_TSnow);
%%% 我们最终将应用内生网格算法的维度的初始猜测:
Gamma = @(yhat,omega) 0.05*(yhat-omega) + 0.10*(max(0,yhat-omega)).^2;
CP = @(omega,u) ((omega == 2).*(u == 1) - (omega == -2).*(u == 0))*0.05*4;
CP_ts_TSnow = CP(omega_ts_TSnow,u_ts_TSnow);
yhat_ts_TSnow_UNCnow = (ergoprob_L*omega_L + (1-ergoprob_L)*omega_H)*ones(grid_dims_TSnow);
eps_pi_ts_TSnow = quasidiff_ts_TSnow - Gamma(yhat_ts_TSnow_UNCnow,omega_ts_TSnow) - CP_ts_TSnow;
%%% 预先计算一些对插值有用的东西
substate_finder_TSnow = griddedInterpolant({b1_t_grid,dstate_t_grid,omega_t_grid,u_t_grid},reshape(1:n_gridded_substates_TSnow,gridded_dims_TSnow));
yhat_t_TSnow_fxns = cell(1,n_gridded_substates_TSnow); pihat_t_TSnow_fxns = cell(1,n_gridded_substates_TSnow);
parfor iii=1:n_gridded_substates_TSnow
yhat_t_TSnow_fxns{iii} = scatteredInterpolant(b2_ts_TSnow(iii,:)',b3_ts_TSnow(iii,:)',eps_pi_ts_TSnow(iii,:)', yhat_ts_TSnow_UNCnow(iii,:)');
pihat_t_TSnow_fxns {iii} = scatteredInterpolant(b2_ts_TSnow(iii,:)',b3_ts_TSnow(iii,:)',eps_pi_ts_TSnow(iii,:)',pihat_ts_TSnow_UNCnow(iii,:)');
结尾
%%% 插值示例,给定查询点的任意网格 (b1s,dstates,omegas,us,b2s,b3s,epses)
yhats = NaN(size(b1s));
pihats= NaN(size(b1s));
[yhats(:),pihats(:)] = interpolate(substate_finder_TSnow ,[b1s(:),dstates(:), omegas(:),us(:)],...
[yhat_t_TSnow_fxns;pihat_t_TSnow_fxns],[b2s(:),b3(:),epses (:)]);
解决方案
推荐阅读
- javascript - 仅在单击该菜单项时出现子菜单
- javascript - JavaScript:数组值会自动被删除
- java - 如何用随机数据填充 DTO 以测试其序列化?
- sql-server - 列出 Visual Studio 中的所有数据流 - 完整的菜鸟
- php - 如何将查询生成器转换为 eloquent
- python - Python 从循环输出中删除重复项
- flutter - Flutter - 实际值和显示值之间的差异
- parsing - 从一组示例构建解析器
- html - 这个 CSS 代码如何/为什么在使我的文本响应时起作用?
- php - 弃用通知:类 App\Http\Controllers\tagsController 不符合 psr-4 自动加载标准