2017-10-13 51 views
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_1ct_1計算可以在同一時間完成(或不具有ct_1計算等待vt_1計算同一迴路中)。

任何人都可以幫助我修改此代碼並行運行嗎?我應該下載任何Julia腳本/庫嗎? (我有一個動態編程一個更大和複雜的代碼,但實質是一樣的。)

預先感謝您

+1

您可能要更改標題,通過並行基本循環的人會想你指的是循環的每個迭代上的一個單獨的核心,而(我明白了什麼)你真正想要的只是異步運行多個表達式,然後等待所有的答案。 –

+0

完成。希望它現在更有意義。 – Gunnar

回答

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 
+0

正是我在找的東西!非常感謝。 – Gunnar

+0

嗨!我一直在試用這兩個並行版本(使用不同的參數),並行計算所需的時間比順序計算所需的時間長得多。例如,通過將迭代次數從10更改爲10000,我的簡單順序代碼平均需要0.010秒才能完成,而在並行代碼中(實際提供的第二個代碼)平均需要27秒才能完成。你認爲我做錯了什麼嗎?也許我錯過了什麼?爲了以防萬一,我正在使用Jupyter Notebook。 TIA! – Gunnar

+0

所以27秒聽起來太大了,所以可能還有其他的東西,但是......總是會有一個開銷(與IO有關)向/從另一個處理器發送數據,在這種情況下超過了分割計算的收益。 (如果你有20個表達式可以在每個循環中拆分,那麼故事可能會不同)。你*可能*有更好的運氣嘗試多線程 - 否則與什麼時間告訴你是最快的! –

2

我會好奇,如果有一個實際的好答案。通常在Julia中並行執行是Base的一部分,所以你不需要任何特殊的庫。但您的使用案例對於並行執行IIUC並不常見。通常情況下,並行for循環會迭代調用具有不同值的同一個表達式 - 即,您將在一個核心上執行與i = 1相關的表達式,在另一個核心上執行i = 2,併合並結果。這裏有一個很好的解釋:https://docs.julialang.org/en/latest/manual/parallel-computing/#Parallel-Map-and-Loops-1

你的建議是在不同的內核上運行程序的不同位(不同表達式)。編輯:有關如何在亞歷山大的迴應中做到這一點的很好的描述。

+0

我錯過了什麼嗎?或者我所說的是有意義的? –

+0

AFAICS它是非常有意義的:-)我可以看到可能有用例來做這樣的事情。 –