宏功能作为Julia的输入

时间:2017-05-25 17:12:43

标签: parallel-processing macros 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)

添加我的处理器后,它的运行速度明显慢于上面定义的宏。我需要定义一个新宏,它在我的不同处理器之间平均(或几乎相等)地分割计算负载。

1 个答案:

答案 0 :(得分: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