Julia Parallel宏似乎不起作用

sil*_*gon 3 parallel-processing julia

我是第一次使用并行计算julia.我有点头疼.所以让我说我开始julia如下:julia -p 4.然后我为所有处理器声明了一个函数,然后我pmap和它一起使用它@parallel for.

@everywhere function count_heads(n)
    c::Int = 0
    for i=1:n
        c += rand(Bool)
    end
    n, c  # tuple (input, output)
end

###### first part ######
v=pmap(count_heads, 50000:1000:70000)
println("Result first part")
println(v)

###### second part ######
println("Result second part")
@parallel for i in 50000:1000:70000
    println(count_heads(i))
end
Run Code Online (Sandbox Code Playgroud)

结果如下.

Result first part
Counting heads function
Any[(50000,24894),(51000,25559),(52000,26141),(53000,26546),(54000,27056),(55000,27426),(56000,28024),(57000,28380),(58000,29001),(59000,29398),(60000,30100),(61000,30608),(62000,31001),(63000,31520),(64000,32200),(65000,32357),(66000,33063),(67000,33674),(68000,34085),(69000,34627),(70000,34902)]
Result second part
    From worker 4:  (61000, From worker 5:  (66000, From worker 2:  (50000, From worker 3:  (56000
Run Code Online (Sandbox Code Playgroud)

因此,功能pmap显然工作正常,但@parallel for正在停止或它没有给我结果.难道我做错了什么?

谢谢!

更新

如果在我放的代码的最后sleep(10).它正确地工作.

From worker 5:  (66000,33182)
From worker 3:  (56000,27955)
............
From worker 3:  (56000,27955)
Run Code Online (Sandbox Code Playgroud)

Ale*_*ley 5

你的两个例子都可以在我的笔记本电脑上正常工作,所以我不确定,但我认为这个答案可以解决你的问题!

如果你在@sync之前添加,它应该按预期工作@parallel for

来自julia Parallel Computing Docs http://docs.julialang.org/en/release-0.4/manual/parallel-computing/:

...如果不需要,可以省略减少运算符.在这种情况下,循环以异步方式执行,即它在所有可用的worker上生成独立的任务,并立即返回RemoteRef数组而不等待完成.调用者可以稍后通过调用它们上的fetch()来等待RemoteRef完成,或者在循环结束时等待完成,前缀为@sync,如@sync @parallel for.

所以你可能println在完成之前调用RemoteRef.