Julia中的并行循环 - 不希望在开始之前分工

Pet*_*r B 5 parallel-processing 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)
Run Code Online (Sandbox Code Playgroud)

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]
Run Code Online (Sandbox Code Playgroud)

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

hck*_*ckr 8

我想你应该用pmap.它有一个batch_size参数,默认为1,表示部件将逐个发送给自由工作人员.有了pmap,当然,你必须处理的还原操作.请注意,我已经尝试过您的功能pmap并观察您提出的行为.

控制调度行为的另一个选择是定义自己的pmap(当然,名称无关紧要)功能.通过这种方式,您可以更好地控制计划.例如,您可以根据先前计算的结果更改计划.请参阅此处以获取pmap定义示例以及如何定义定义.