如何在 julia 中编写并行循环?
How to write a parallel loop in julia?
我有以下 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]
嗨基拉,
我是 Julia 的新手,但面临同样的问题。试试这个方法,看看它是否符合您的需求。
function f(x)
return x^2;
end
y=@parallel vcat for i= 1:100
f(i);
end;
println(y)
此致,RN
可以使用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>
我有以下 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]
嗨基拉,
我是 Julia 的新手,但面临同样的问题。试试这个方法,看看它是否符合您的需求。
function f(x)
return x^2;
end
y=@parallel vcat for i= 1:100
f(i);
end;
println(y)
此致,RN
可以使用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>