【问题标题】:How to write a parallel loop in julia?如何在 Julia 中编写并行循环?
【发布时间】:2016-01-15 10:12:01
【问题描述】:

我有以下 Julia 代码,我想将其并行化。

using DistributedArrays

function f(x)
    return x^2;
end
y = DArray[]
@parallel for i in 1:100
    y[i] = f(i)
end
println(y)

输出为DistributedArrays.DArray[]。我希望 y 的值如下:y=[1,4,9,16,...,10000]

【问题讨论】:

  • 你想在并行循环中做什么?我认为这是一个没有确切答案的宽泛问题。

标签: parallel-processing julia


【解决方案1】:

您可以使用 n 维分布式数组推导:

首先,您需要添加更多进程,本地或远程:

julia> addprocs(CPU_CORES - 1);

那么你必须使用 DistributedArrays 在每一个衍生的进程中:

julia> @everywhere using DistributedArrays

最后你可以使用@DArray宏,像这样:

julia> x = @DArray [@show x^2 for x = 1:10];
        From worker 2:  x ^ 2 = 1
        From worker 2:  x ^ 2 = 4
        From worker 4:  x ^ 2 = 64
        From worker 2:  x ^ 2 = 9
        From worker 4:  x ^ 2 = 81
        From worker 4:  x ^ 2 = 100
        From worker 3:  x ^ 2 = 16
        From worker 3:  x ^ 2 = 25
        From worker 3:  x ^ 2 = 36
        From worker 3:  x ^ 2 = 49

你可以看到它做了你所期望的:

julia> x
10-element DistributedArrays.DArray{Int64,1,Array{Int64,1}}:
   1
   4
   9
  16
  25
  36
  49
  64
  81
 100

记住它适用于任意数量的维度:

julia> y = @DArray [@show i + j for i = 1:3, j = 4:6];
        From worker 4:  i + j = 7
        From worker 4:  i + j = 8
        From worker 4:  i + j = 9
        From worker 2:  i + j = 5
        From worker 2:  i + j = 6
        From worker 2:  i + j = 7
        From worker 3:  i + j = 6
        From worker 3:  i + j = 7
        From worker 3:  i + j = 8

julia> y
3x3 DistributedArrays.DArray{Int64,2,Array{Int64,2}}:
 5  6  7
 6  7  8
 7  8  9

julia>

这是最julian的方式来做你想要的恕我直言。

我们可以查看macroexpand 的输出以了解发生了什么:

注意:为便于阅读,此输出已稍作编辑,T 代表:

DistributedArrays.Tuple{DistributedArrays.Vararg{DistributedArrays.UnitRange{DistributedArrays.Int}}}

julia> macroexpand(:(@DArray [i^2 for i = 1:10]))
  :(
    DistributedArrays.DArray(
      (
        #231#I::T -> begin
          [i ^ 2 for i = (1:10)[#231#I[1]]]
        end
      ),
      DistributedArrays.tuple(DistributedArrays.length(1:10))
    )
  )

这与手动输入基本相同:

julia> n = 10; dims = (n,);

julia> DArray(x -> [i^2 for i = (1:n)[x[1]]], dims)
10-element DistributedArrays.DArray{Any,1,Array{Any,1}}:
   1
   4
   9
  16
  25
  36
  49
  64
  81
 100

julia>

【讨论】:

    【解决方案2】:

    嗨,基拉,

    我是 Julia 的新手,但面临同样的问题。试试这种方法,看看它是否符合您的需求。

    function f(x)
      return x^2;
    end
    
    y=@parallel vcat for i= 1:100
     f(i);
    end;
    
    println(y)
    

    问候,注册护士

    【讨论】:

    • 顺便说一句:为什么这只适用于 @parallel 前缀而不是没有?
    • 看来(至少在 Julia v0.6 中)您需要在每个工人身上定义 f,即 @everywhere f(x) return x^2;结束
    猜你喜欢
    • 2016-02-20
    • 1970-01-01
    • 2021-09-15
    • 1970-01-01
    • 2020-08-14
    • 1970-01-01
    • 2016-10-27
    • 2016-07-19
    • 2015-06-26
    相关资源
    最近更新 更多