【问题标题】:Julia: Unexpected Result when Using @parallel for Loop with SharedArrayJulia:将 @parallel for Loop 与 SharedArray 一起使用时出现意外结果
【发布时间】:2018-06-16 23:53:13
【问题描述】:

我正在尝试在 Julia 中学习并行 for 循环,但我对以下示例代码的结果感到困惑:

addprocs(4)
@everywhere begin
N = 10
V = SharedArray{Int64,1}(N)
@sync @parallel for i = 1:N
    V[i] = i
    println(V[i])
end 
end

通过使用 println,我试图确定哪个工人经历了哪个步骤。令人惊讶的是,我从上面的代码中得到的是,每个工人都在不断地进行整个迭代,直到最后一个工人(在我的例子中是工人 3)完成 for 循环:

From worker 4:  1
From worker 4:  2
From worker 4:  3
From worker 5:  1
From worker 5:  2
From worker 5:  3
From worker 5:  4
From worker 5:  5
From worker 5:  6
From worker 5:  4
From worker 5:  5
From worker 5:  6
From worker 2:  7
From worker 2:  8
From worker 2:  4
From worker 2:  5
From worker 2:  6
From worker 2:  9
From worker 2:  10
From worker 4:  1
From worker 4:  2
From worker 2:  7
From worker 2:  8
From worker 3:  9
From worker 5:  4
From worker 5:  5
From worker 5:  6
From worker 3:  10
From worker 3:  7
From worker 3:  8
From worker 3:  7
From worker 3:  8
From worker 3:  9
From worker 3:  10
From worker 2:  4
From worker 2:  5
From worker 2:  6
From worker 3:  7
From worker 3:  8
From worker 4:  3
From worker 4:  9
From worker 4:  10
From worker 4:  1
From worker 4:  2
From worker 4:  3
From worker 4:  1
From worker 4:  2
From worker 4:  3
From worker 5:  9
From worker 5:  10

这不是我对并行 for 循环的期望,因为我认为工作应该在工作人员之间分配然后组合在一起,而不是为每个工作人员单独完成。我的意思是,并行for循环的概念应该是每个worker只经过2-3个步骤吗?

我的代码有问题还是我误解了并行 for 循环的概念?

谢谢!


编辑:我刚刚意识到@everywhere 与此有关。在我消除了@everywhere 之后,一切正常。

【问题讨论】:

  • 您的示例无法精确重现。我可以建议您修复一个随机种子(例如srand(2017))并指定您初始化的进程数,例如通过addprocs(X)julia -p X?

标签: for-loop parallel-processing julia


【解决方案1】:

您告诉 julia(通过@everywhere)在每个工作人员和主机进程上运行并行循环,因此您以并行方式从 1 计数到 10 5 次。 (检查您发布的输出中从 1 到 10 的每个数字是否恰好出现 5 次)

稍微详细一点:首先我们注意到进程总数为nprocs() == 5(一个“主机”和4个工作人员,请查看workers())。 @everywhere 告诉 Julia 在每个进程上运行 begin end 块的内容,因此在我们的示例中运行 5 次。 begin end 块的内容是“做一个并行循环,从 1 数到 10”。这正是发生的事情。

当您删除 @everywhere 时,您只会执行一个并行循环。因此,您将得到您想要的:

julia> N = 10
       V = SharedArray{Int64,1}(N)
       @sync @parallel for i = 1:N
           V[i] = i
           println(V[i])
       end
        From worker 5:  9
        From worker 5:  10
        From worker 3:  4
        From worker 3:  5
        From worker 3:  6
        From worker 2:  1
        From worker 2:  2
        From worker 2:  3

推荐阅读:https://docs.julialang.org/en/stable/manual/parallel-computing

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-03-21
    • 2013-11-07
    • 1970-01-01
    • 1970-01-01
    • 2021-01-30
    • 2017-04-29
    • 1970-01-01
    相关资源
    最近更新 更多