如何在Julia中编写并行循环?

15

我有以下的 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]

你想在并行循环中做什么?我认为这是一个广泛的问题,没有确切的答案。 - Reza Afzalan
2个回答

14
你可以使用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>

3

你好,Kira。

我是Julia的新手,但也遇到了同样的问题。尝试这种方法,看看是否符合你的需求。

function f(x)
  return x^2;
end

y=@parallel vcat for i= 1:100
 f(i);
end;

println(y)

尊敬的RN:


小插曲:为什么只有带有 @parallel 前缀的代码才能运行,没有则不行呢? - David Zentler-Munro
看起来(至少在Julia v0.6中),您需要在每个Worker上定义f,即@everywhere f(x) return x^2; end - Joris Bierkens

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接