首页 > 解决方案 > Julia 中的并行循环 - 不希望在开始之前将工作分开

问题描述

我的机器有4个核心。当我使用 @sync @parallel 进行并行运行时,我注意到 Julia 在将作业发送到 4 个处理器之前将作业分成 4 个:

# start of do_something.jl
function do_something(i, parts)
    procs = zeros(Int, parts)
    procs[i] = myid()
    total = 0.0
    for j = 1:i * 100000000
        total = total + 1e-6
    end
    return procs
end
# end of do_something.jl

# synctest3a.jl
addprocs(Sys.CPU_CORES)
@everywhere include("do_something.jl")
parts = 20
procs = @sync @parallel (+) for i = 1:parts
    do_something(i, parts)
end
@printf("procs=%s\n", procs)

julia synctest3a.jl 的结果,表示前 5 个被发送到处理器 2,接下来的 5 个被发送到处理器 3,依此类推:

procs=[2, 2, 2, 2, 2, 3, 3, 3, 3, 3, 4, 4, 4, 4, 4, 5, 5, 5, 5, 5]

我有一个应用程序,其中执行 do_something() 的时间变化很大(在这个玩具示例中,它或多或少与 i 成正比)。所以我真正想要的是让每个处理器在它空闲时立即执行 do_something,而不是每个处理器总是执行 1/4 的调用。我怎么做?

标签: parallel-processingjulia

解决方案


我认为你应该pmap改用。它有一个batch_size参数,默认为 1,这意味着零件将被一个接一个地发送给空闲的工人。pmap当然,您必须处理归约操作。请注意,我已经尝试了您的功能pmap并观察了您询问的行为。

控制调度行为的另一个选项是定义您自己的pmap(当然,名称无关紧要)函数。这样,您可以对调度有更多的控制。例如,您可以根据先前计算的结果更改调度。有关定义的示例以及如何定义,请参见此处。pmap


推荐阅读