2017-05-25 9 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

マクロは入力式としてのみ式を取得するため、式を生成する必要があります。マクロによって生成される式は、元々書かれていたかのように実際に評価されるコードです。これは、あなたが書いただけで何文字通りです

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を取って正常な機能として:例えば、あなたが引数として機能fを取る関数を書くしようとしているものを達成できているようです最初の議論。このように呼び出すことができます:

parallel_calc(100) do n 
    # do something with `n` 
end 
関連する問題