2

我知道过去可能有人问过这个问题,但我绝对是 Julia 的初学者。

我在 Julia 中有一个简单的代码,我想并行运行。

#--Two Calculations during the Loop--

vt_0=0
ct_0=0

for i=1:10

 #--Calculation vt_1
 vt_1=max(rand(1:i),vt_0,ct_0)


 #--Calculation ct_1
 ct_1=min(rand(1:i),vt_0,ct_0)

 ct_0=ct_1
 vt_0=vt_1

end

如您所见,vt_1and的计算ct_1可以同时完成(或在同一个循环期间完成,而无需ct_1等待vt_1计算)。

任何人都可以帮我修改此代码以并行运行吗?我应该下载任何 Julia 脚本/库吗?(我有一个更大更复杂的动态编程代码,但本质是一样的。)

先感谢您

4

2 回答 2

3

这是你想要的?可能更快不使用像我在这里的匿名函数,但除此之外。

addprocs(2)        
vt_0 = 0; ct_0 = 0;
for i=1:10
  #--Calculation vt_1
  vt_1 = remotecall((x,y)->max(rand(1:i),x,y), 2, vt_0, ct_0)

  #--Calculation ct_1
  ct_1 = remotecall((x,y)->min(rand(1:i),x,y), 3, vt_0, ct_0)

  ct_0 = fetch(ct_1)
  vt_0 = fetch(vt_1)
end

或者没有匿名函数:

addprocs(2)
@everywhere minrand(i,x,y) = min(rand(1:i),x,y)
@everywhere maxrand(i,x,y) = max(rand(1:i),x,y)
vt_0 = 0; ct_0 = 0; 

for i=1:10 
  #--Calculation vt_1
  vt_1 = remotecall(maxrand, 2, i, vt_0, ct_0)

  #--Calculation ct_1
  ct_1 = remotecall(minrand, 3, i, vt_0, ct_0)

  ct_0 = fetch(ct_1)
  vt_0 = fetch(vt_1)
end
于 2017-10-13T11:18:58.430 回答
2

我会很好奇这个问题是否有一个真正好的答案。通常,Julia 中的并行执行是 Base 的一部分,因此您不需要任何特殊的库。但是您的用例对于并行执行 IIUC 来说并不典型。通常,并行 for 循环将迭代调用具有不同值的相同表达式 - 即,您将i = 1在一个内核i = 2上执行与另一个内核相关的表达式,然后合并结果。这里有一个很好的解释:https ://docs.julialang.org/en/latest/manual/parallel-computing/#Parallel-Map-and-Loops-1

您的建议是在不同的内核上运行程序的不同部分(不同的表达式)。编辑:在亚历山大的回应中有一个很好的描述如何做到这一点。

于 2017-10-13T08:21:41.140 回答