2014-10-02 1 views
4

Я пытаюсь использовать параллелизм в Julia для создания нескольких больших типов (в частности, гауссовских моделей смеси через sklearn через PyCall).Julia: Создание параллельных параллельных типов

Если бы я делал это в серии, я хотел бы сделать:

models = Array(GMM, N) 
for i = 1 : N 
    params = ... 
    models[i] = train_gmm(params) 
end 

Однако, я должен быть в состоянии сделать это параллельно. Мне трудно понять, с чего начать, поскольку SharedArrays и @parallel не подходят для меня.

Я пытался использовать @spawn, но обнаружил следующее:

function f1() 
    rand(10000000) 
    rand(10000000) 
    rand(10000000) 
    rand(10000000) 
    rand(10000000) 
end 

function f2() 
    a = @spawn rand(10000000) 
    b = @spawn rand(10000000) 
    c = @spawn rand(10000000) 
    d = @spawn rand(10000000) 
    e = @spawn rand(10000000) 
    a_r = fetch(a) 
    b_r = fetch(b) 
    c_r = fetch(c) 
    d_r = fetch(d) 
    e_r = fetch(e) 
end 

f1() 
f2() 
println(@elapsed(f1())) 
println(@elapsed(f2())) 

f1 занимает 0,21 секунды, f2 занимает 0,32 секунды! Есть что-то в @spawn, что я пропал?

EDIT

Похоже делает:

function f1() 
    [sum(rand(100000000)), 
    sum(rand(100000000)), 
    sum(rand(100000000)), 
    sum(rand(100000000)), 
    sum(rand(100000000))] 
end 

function f2() 
    a = @spawn sum(rand(100000000)) 
    b = @spawn sum(rand(100000000)) 
    c = @spawn sum(rand(100000000)) 
    d = @spawn sum(rand(100000000)) 
    e = @spawn sum(rand(100000000)) 
    [fetch(a), fetch(b), fetch(c), fetch(d), fetch(e)] 
end 

Причины f2(), чтобы работать быстрее, чем f1() и больше в линии с тем, что я хочу. Я пойду с этим, если у кого-то не будет лучшего, официального пути.

спасибо.

ответ

5

Я думаю, что у вашего редактирования есть это правильно.

IAINMAC:~ idunning$ julia -p 3 

julia> @everywhere function foo() 
     sleep(2) 
     end 

julia> @time [foo(), foo(), foo()] 
elapsed time: 6.017959282 seconds (294088 bytes allocated) 
3-element Array{Nothing,1}: 
nothing 
nothing 
nothing 

julia> function bar() 
     a = @spawn foo() 
     b = @spawn foo() 
     c = @spawn foo() 
     [fetch(a), fetch(b), fetch(c)] 
     end 
bar (generic function with 1 method) 

julia> @time bar() 
elapsed time: 2.030760103 seconds (199720 bytes allocated) 
3-element Array{Nothing,1}: 
nothing 
nothing 
nothing 

или даже более элегантно с pmap:

julia> @everywhere function foo(a::Int) 
     sleep(a) 
     end 

julia> @time pmap(foo,1:3) 
elapsed time: 3.004821524 seconds (448540 bytes allocated) 
3-element Array{Any,1}: 
nothing 
nothing 
nothing 

julia> @time map(foo,1:3) 
elapsed time: 6.006557822 seconds (1368 bytes allocated) 
3-element Array{Nothing,1}: 
nothing 
nothing 
nothing 
+0

Спасибо! Помещает ли вызов 'fetch' в массив заставить их всех выполнять одновременно? – Mageek

+2

'fetch' блокирует, поэтому я предполагаю, что они блокируются по порядку, но я не уверен (и это не имело бы значения, я думаю). Вот почему использование pmap лучше, потому что оно сгорит первые N задач, и как только все возвращается, он начнет новый. – IainDunning

 Смежные вопросы

  • Нет связанных вопросов^_^