For loop Julia中异步多重计算的并行代码

For loop Julia中异步多重计算的并行代码,for-loop,parallel-processing,julia,ijulia-notebook,For Loop,Parallel Processing,Julia,Ijulia Notebook,我知道过去可能会有人问这个问题,但我对朱莉娅绝对是个初学者 我在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

我知道过去可能会有人问这个问题,但我对朱莉娅绝对是个初学者

我在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_1
ct_1
的计算可以同时进行(或者在相同的循环中,无需让
ct_1
计算等待
vt_1
计算)

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


提前谢谢你

我想知道是否有一个真正好的答案。通常,Julia中的并行执行是Base的一部分,所以不需要任何特殊的库。但是您的用例不是典型的并行执行IIUC。通常,并行for循环将迭代调用具有不同值的相同表达式-即,您将在一个核心上执行与
i=1
相关的表达式,在另一个核心上执行与
i=2
相关的表达式,并合并结果。这里有一个很好的解释:


您的建议是在不同的内核上运行不同的程序位(不同的表达式)。编辑:Alexander的回复中对如何做到这一点有很好的描述。

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

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

我错过什么了吗?或者我所说的有意义吗?AFAICS它有完美的意义:-)我可以看到可能有这样做的用例。这正是我所寻找的!非常感谢。嗨!我一直在尝试这两个并行版本(使用不同的参数),并行计算所需的时间比顺序计算所需的时间要长得多。例如,通过将迭代次数从10更改为10000,在我的简单顺序代码中平均需要0.010秒才能完成,而在并行代码(您实际提供的第二个)中,平均需要27秒才能完成。你认为我做错什么了吗?也许我错过了什么?为了以防万一,我正在用一本Jupyter笔记本。蒂亚!所以27秒听起来太大了,所以可能还有其他原因,但是。。。向另一个处理器发送数据或从另一个处理器发送数据总是会有一个开销(与IO相关),在这种情况下,这个开销超过了分割计算的收益。(如果你有20个表达式可以在每个循环中拆分,那么故事可能会有所不同)。您可能会更幸运地尝试多线程-否则按照时间告诉您的最快速度去做!(或者你可以单独问一个关于以上速度的问题,这样你可能会找到比我更了解的人!)谢谢!事实上,我发现双重处理存在更多问题,我会把它留到其他帖子上。你可能想通过并行化一个基本循环来更改标题,人们会猜你的意思是在一个单独的核心上进行循环的每次迭代,而(我理解)您真正想要的是异步运行多个表达式,然后等待所有答案。完成。希望它现在更有意义。