【发布时间】: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