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

时间:2014-04-22 04:43:21

标签: parallel-processing 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 =零(n,n)"因为并行for循环内的第一个操作纠正了这个重复问题。如果不诉诸J阵列的强力清除,可以做同样的事情吗?

1 个答案:

答案 0 :(得分:1)

我从上面的代码中理解的是,当你写:

  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,因此求和会返回正确的答案。