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