我的代码的目标是使用值函数迭代来更新Bellman方程。假设像下面这样的二维Bellman方程(实际问题要复杂得多):
V(x,y)= max_ {yp} g(x,y,yp)+ E [V(xp,yp)| x]
为了并行执行计算,我构造了以下函数:
f(V,y,g,EV(xp,yp | x)),此函数的伪代码为:
for x=xmin:xmax, yp=ymin:ymax
vnew=g(x,y,yp)+E[V(xp,yp)|x]
if vnew>V(x,y)
V(x,y)=vnew
end
end
基本思想是分配V(二维矩阵),g(三维矩阵)和EV(二维矩阵),f是就地函数更新V的特定部分,因此我可以并行计算V通过:
Threads.@threads for y=ymin:ymax
f(V,y,g,EV(xp,yp|x))
end
在大多数情况下,代码都能正常工作,因为所有数组都已预先分配,并且该函数是就地函数,因此可以稳定地使用内存。但是,有时内存使用情况呈波形变化,我怀疑Julia正在复制很多对象。我该如何检查发生了什么并避免Julia复制数组?