我知道过去可能会问这个问题,但我是朱莉娅的绝对初学者。
我在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
计算等待{{} 1}}计算)。
有人可以帮我修改此代码并行运行吗?我应该下载任何Julia脚本/库吗? (我有一个更大更复杂的动态编程代码,但实质是相同的。)
提前谢谢
答案 0 :(得分: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
或者没有匿名funcs:
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
答案 1 :(得分:2)
如果有一个真正好的答案,我会很好奇。通常Julia中的并行执行是Base的一部分,因此您不需要任何特殊的库。但是您的用例并不是并行执行IIUC的典型用例。通常,并行for循环将迭代调用具有不同值的相同表达式 - 即,您将在一个核上执行与i = 1
相关的表达,在另一个核上执行i = 2
,并合并结果。这里有一个很好的解释:https://docs.julialang.org/en/latest/manual/parallel-computing/#Parallel-Map-and-Loops-1
您建议的是在不同的核心上运行程序的不同位(不同的表达式)。编辑:在亚历山大的回应中,有一个很好的描述如何做到这一点。