Julia中异步多重计算的并行代码
Parallel code for asynchronous multiple calculations in Julia
我知道过去可能有人问过这个问题,但我绝对是 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_1
和 ct_1
的计算可以同时进行(或在同一循环中进行,而无需 ct_1
计算等待vt_1
计算)。
任何人都可以帮我将此代码并行修改为 运行 吗?我应该下载任何 Julia script/library 吗? (我有一个更大更复杂的动态规划代码,但本质是一样的。)
提前致谢
我很好奇是否有真正好的答案。通常,Julia 中的并行执行是 Base 的一部分,因此您不需要任何特殊的库。但是您的用例对于并行执行 IIUC 来说并不典型。通常,并行 for 循环会迭代调用具有不同值的相同表达式 - 即,您将在一个核心上执行与 i = 1
相关的表达式,在另一个核心上执行 i = 2
,然后合并结果。这里有一个很好的解释:https://docs.julialang.org/en/latest/manual/parallel-computing/#Parallel-Map-and-Loops-1
您的建议是 运行 程序的不同位(不同的表达式)在不同的内核上。编辑: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
我知道过去可能有人问过这个问题,但我绝对是 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_1
和 ct_1
的计算可以同时进行(或在同一循环中进行,而无需 ct_1
计算等待vt_1
计算)。
任何人都可以帮我将此代码并行修改为 运行 吗?我应该下载任何 Julia script/library 吗? (我有一个更大更复杂的动态规划代码,但本质是一样的。)
提前致谢
我很好奇是否有真正好的答案。通常,Julia 中的并行执行是 Base 的一部分,因此您不需要任何特殊的库。但是您的用例对于并行执行 IIUC 来说并不典型。通常,并行 for 循环会迭代调用具有不同值的相同表达式 - 即,您将在一个核心上执行与 i = 1
相关的表达式,在另一个核心上执行 i = 2
,然后合并结果。这里有一个很好的解释:https://docs.julialang.org/en/latest/manual/parallel-computing/#Parallel-Map-and-Loops-1
您的建议是 运行 程序的不同位(不同的表达式)在不同的内核上。编辑: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