2015-10-20 16 views
8

私は以下の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=[1,4,9,16,...,10000]

+0

並列ループで何をしたいですか?私はそれが正確な答えなしでは広い質問だと思う。 –

答えて

3

こんにちはキラ、

は私がジュリアに新しいですが、同じ問題に直面して:私は次のようにyの値を持っていると思います。このアプローチを試して、それがあなたのニーズに合っているかどうかを見てください。

function f(x) 
    return x^2; 
end 

[email protected] vcat for i= 1:100 
f(i); 
end; 

println(y) 

よろしく、RN

+0

すぐに:これはなぜ@parallelプレフィックスでのみ動作し、それがない場合はありませんか? –

+0

少なくとも(Julia v0.6では)すべてのワーカーでfを定義する必要があります。つまり、@ everywhere f(x)はx^2を返します。終わり –

9
あなたが使用することができます

n次元分散型配列の内包表記:

julia> addprocs(CPU_CORES - 1); 

まずあなたは、ローカルまたはリモートのいずれかのいくつかのより多くのプロセスを、追加する必要があります

次に、DistributedArraysにする必要があります。 cesses:

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> 

これは、ほとんどジュリアン IMHOを目的とする方法です。

我々は何が起こっているのか確認するために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> 
関連する問題