2017-05-25 48 views
2

我在Julia中編寫了一個可以在多個處理器之間分割某個函數的宏。我有以下幾點:在Julia中輸入函數的宏

macro parallel_calc(N::Int,proc::Int=4) 

     n=round(Int,N/proc); 

     proc_sum = @parallel (+) for i=1:proc 

      f(n) 

    end 

    return proc_sum/proc 

end 

的問題是我想寫宏,以便

@parallel_calc f(n) 

然後它就能自動分割我的處理器之間的工作。 Julia有沒有辦法編寫一個以函數作爲輸入的宏?我試過在網上尋找,但我還沒有找到任何可以幫助的東西。我也嘗試使用

@everywhere f(n) 

添加我的處理器後,但運行速度明顯慢於上面定義的宏。我需要定義一個新的宏,在我的不同處理器之間平均分配計算負載(或幾乎相同)。

回答

2

宏只獲取表達式作爲輸入,只能生成表達式。宏產生的表達式就是實際評估的代碼,就像原來寫入的代碼一樣。看來你可以完成你想要與需要的功能f作爲參數,如函數寫什麼:

function parallel_calc(f::Function, N::Int, proc::Int=4) 
    n = round(Int, N/proc) 
    proc_sum = @parallel (+) for i = 1:proc 
     f(n) 
    end 
    return proc_sum/proc 
end 

這簡直是你寫的正是,但作爲一個正常的功能,以f爲第一個論點。你可以這樣稱呼它:

parallel_calc(100) do n 
    # do something with `n` 
end