我面臨着以下問題:朱莉婭並行編程 - 使現有可用的功能,所有工人
我有一個名爲TrainModel功能,對於一個很長的時間在單個線程上運行。當它完成計算時,它會返回一個函數作爲輸出參數,我們稱之爲f。當我詢問這˚F的類型,朱莉婭返回:
(generic function with 1 method)
(我不知道這最後一條信息是有用的人閱讀本)
現在在第二步中,我需要對非常大的數值應用函數f。這是我想要平行的一個步驟。通過多個流程啓動了Julia,例如
julia -p 4
理想情況下,我會用:
pmap(f, my_values)
或者是:
aux = @parallel (hcat) for ii=1:100000000
f(my_values[ii])
end
不幸的是,這是行不通的。朱莉婭抱怨說,工人們不知道的功能˚F,即我收到了一封郵件:
ERROR: function f not defined on process 2
我怎樣才能使功能˚F提供給所有工人呢?顯然,一個「髒」的解決辦法是全體職工或許運行耗時的功能TrainModel,像這樣:
@everywhere f = TrainModel(...)
,但是當我要的只是結果,這將是CPU的浪費f適用於所有工人。
雖然我搜索了類似的問題的帖子,到目前爲止,我無法找到答案...
提前感謝! 最好,
N.
這是這裏的問題嗎? http://docs.julialang.org/en/release-0.3/manual/parallel-computing/#code-availability-and-loading-packages – Claies
我認爲這正是問題所在。我明白如何在聲明函數時使所有工作者都可以使用函數:例如,在聲明函數時可以使用宏@everywhere。變量也一樣。但是,對於不在模塊中或聲明的函數,而是在運行時創建的函數,如何做呢? – user1438310
這是一個很好的問題,我不認爲把OP引導到Julia文檔有幫助。事實上,從OP的問題可以清楚地看到,OP已經閱讀並理解了文檔中的相關部分,並且沒有解決運行時在不同範圍之間生成和傳遞的函數問題。此外還有一個額外的考慮因素:由於函數是在運行時生成的,因此編譯器可能無法確定輸出類型(即它不會是類型穩定的),這可能會導致其他問題(可能只有性能有關)。 –