Я пытаюсь использовать параллелизм в 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() и больше в линии с тем, что я хочу. Я пойду с этим, если у кого-то не будет лучшего, официального пути.
спасибо.
Спасибо! Помещает ли вызов 'fetch' в массив заставить их всех выполнять одновременно? – Mageek
'fetch' блокирует, поэтому я предполагаю, что они блокируются по порядку, но я не уверен (и это не имело бы значения, я думаю). Вот почему использование pmap лучше, потому что оно сгорит первые N задач, и как только все возвращается, он начнет новый. – IainDunning