【问题标题】:Julia: Using pmap correctlyJulia:正确使用 pmap
【发布时间】:2014-08-29 11:57:14
【问题描述】:

为什么这不符合我的想法:

benjamin@benjamin-VirtualBox:~$ julia -p 3
julia> @everywhere(function foom(bar::Vector{Any}, k::Integer) println(repeat(bar[2],bar[1])); return bar; end)
julia> foo={{1,"a"},{2,"b"},{3,"c"}}
julia> pmap(foom, foo, 5)
    From worker 2:  a
1-element Array{Any,1}:
 {1,"a"}

这就是它的全部输出。我期待 pmap 遍历 foo 中的每个元组并调用 foom 。

编辑:

当我不传递其他参数时它可以正常工作:

julia> @everywhere(function foom(bar::Vector{Any}) println(repeat(bar[2],bar[1])); return bar; end)

julia> pmap(foom, foo)
    From worker 3:  bb
    From worker 2:  a
    From worker 4:  ccc
3-element Array{Any,1}:
 {1,"a"}
 {2,"b"}
 {3,"c"}

如何向 pmap 传递更多参数?

【问题讨论】:

    标签: parallel-processing julia pmap


    【解决方案1】:

    pmap 函数确实接受任意数量的参数,每个参数都是一个集合

    function pmap(f, lsts...; err_retry=true, err_stop=false)
    

    函数 f 将为每个集合发送一个参数

    示例多参数函数

    julia> @everywhere f(s,count)=(println("process id = $(myid()) s = $s count = $count");repeat(s,count))
    

    pmap 使用 1

    julia> pmap((a1,a2)->f(a1,a2),{"a","b","c"},{2,1,3})
        From worker 3:  process id = 3 s = b count = 1
        From worker 2:  process id = 2 s = a count = 2
        From worker 4:  process id = 4 s = c count = 3
    3-element Array{Any,1}:
     "aa" 
     "b"  
     "ccc"
    

    pmap 使用 2

    或者,参数可以作为来自一个外部集合的参数集合发送,这些参数可以分配到目标函数的多个参数中

    julia> pmap((args)->f(args...),{{"a",2},{"b",1},{"c",3}})
        From worker 2:  process id = 2 s = a count = 2
        From worker 3:  process id = 3 s = b count = 1
        From worker 4:  process id = 4 s = c count = 3
    3-element Array{Any,1}:
     "aa" 
     "b"  
     "ccc"
    

    【讨论】:

    • 截至今天,用于创建向量的大括号 {} 在 Julia 中已停用。在您的示例中使用 () 或 [] 代替。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-08-05
    • 1970-01-01
    • 1970-01-01
    • 2011-07-11
    • 2021-08-02
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多