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

Parallel processing 在没有特殊数组的情况下,你能在Julia中并行进行不精确的雅可比计算吗?,parallel-processing,julia,Parallel Processing,Julia,在Julia中,您希望基于向量函数f(x)计算不精确的雅可比矩阵,这需要大量计算才能计算。雅可比矩阵的求值在概念上显然是相当简洁的可并行的。我的问题是,这可以在朱莉娅身上实现,而不必求助于DistributedArray、SharedArray等 例如,假设您拥有以下代码: function Jacob(f::Function,x) eps=1e-7 delta=eps*eye(length(x)) J=zeros(length(x),length(x)) for i=1:len

在Julia中,您希望基于向量函数f(x)计算不精确的雅可比矩阵,这需要大量计算才能计算。雅可比矩阵的求值在概念上显然是相当简洁的可并行的。我的问题是,这可以在朱莉娅身上实现,而不必求助于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-P4时,得到的雅可比矩阵的某些值被乘以2或3

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


似乎在并行for循环中添加“J=zeros(n,n)”作为第一个操作可以纠正此重复问题。在不使用暴力清除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
上工作,因此求和返回正确的答案