gpt4 book ai didi

parallel-processing - 你能在没有特殊数组的情况下在 Julia 中并行化不精确的雅可比计算吗?

转载 作者:行者123 更新时间:2023-12-04 08:52:16 24 4
gpt4 key购买 nike

在 Julia 中,您想根据向量函数 f(x) 计算不精确的雅可比行列式,这需要大量计算才能求值。雅可比行列式的评估显然在概念上可以非常巧妙地并行化。我的问题是,这可以在 Julia 中完成而无需求助于 DistributedArray、SharedArray 等吗?

例如,假设您有以下代码:

function Jacob(f::Function,x)
eps=1e-7
delta=eps*eye(length(x))
J=zeros(length(x),length(x))
for i=1:length(x)
J[:,i]=(f(x+delta[:,i])-f(x-delta[:,i]))/2/eps
end
J
end

根据手册,是否可以以与并行化 200000000 次随机硬币翻转的总和相同的方式并行化?也就是说,相当于
nheads = @parallel (+) for i=1:200000000
int(randbool())
end

我试过这个:
function Jacob(f::Function,x)
require("testfunc.jl");
eps=1e-7
delta=eps*eye(length(x))
J=zeros(length(x),length(x))
J=@parallel (+) for i=1:length(x)
J[:,i]=(f(x+delta[:,i])-f(x-delta[:,i]))/2/eps
J
end
J
end

其中“testfunc.jl”是找到此代码和 f 本身定义的文件的名称。当我尝试这个时,f 只是对 x.^2+cos(x) 求值,我能够得到一个合适的(对角线)矩阵,但是这些值与非并行代码给出的值不匹配(我可以确认是正确的值)。进一步的调查表明,当使用 julia -p 4 时,得到的雅可比行列式有一些乘以 2 或 3 的值。

我所描述的方法是否合理(并且只需要进行调整以防止重复评估)?如果没有,是否有另一种方法可以在不使用更复杂的特殊数组类型的情况下评估雅可比行列式?

似乎将 "J=zeros(n,n)"添加为并行 for 循环内的第一个操作可以纠正此重复问题。同样的事情可以在不诉诸J阵列的这种蛮力清除的情况下完成吗?

最佳答案

我从上面的代码中了解到,当您编写时:

  J=zeros(length(x),length(x))
J=@parallel (+) for i=1:length(x)
J[:,i]=(f(x+delta[:,i])-f(x-delta[:,i]))/2/eps
J
end

Julia 发送了一份 J到新进程然后评估 f(x)并将结果汇​​总在一起。
我认为更好更有效的方法是防止发送 J在线程之间,并执行以下操作:
  @parallel (+) for i=1:length(x)
J=zeros(length(x),length(x))
J[:,i]=(f(x+delta[:,i])-f(x-delta[:,i]))/2/eps
J
end

使用上面的代码,每个线程都在一个新的 J 上工作所以求和返回正确的答案。

关于parallel-processing - 你能在没有特殊数组的情况下在 Julia 中并行化不精确的雅可比计算吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23210539/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com