gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-04 08:06:57 26 4
gpt4 key购买 nike

我的机器有 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 的调用。我怎么做?

最佳答案

我认为你应该使用 pmap 反而。它有一个 batch_size参数,默认为 1,这意味着零件将被一一发送给自由 worker 。与 pmap ,当然,你要处理归约操作。请注意,我已经使用 pmap 尝试了您的功能。并观察你问的行为。

控制调度行为的另一个选项是定义您自己的 pmap (当然名字无关紧要)函数。通过这种方式,您可以更好地控制调度。例如,您可以根据先前计算的结果更改调度。见 herepmap 为例定义以及如何定义。

关于parallel-processing - Julia 中的并行循环 - 不希望在开始之前划分工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50361704/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com