2015-04-23 3 views
0

У меня есть вопрос об использовании pmap. Я думаю, что это простой/очевидный ответ, но он все еще не может понять! В настоящее время я запускаю цикл, где каждая из 50 итераций является отдельной и поэтому ее параллельная работа должна быть возможной и должна улучшать скорость. Он использует функцию с несколькими входами и выходами, которые представляют собой смесь векторов и скаляров. Мне нужно сохранить выходы функции для каждой из 50 итераций для последующего использования. Вот основы кода, когда они не параллельны.Julia: использование pmap с матрицами

A=Array(Float64, 500,50) 
b=Array(Float64,50) 

for i in 1:50 

    A[:,i],b[i] = func(i,x,y,z) 

end 

Любой совет, как реализовать это, является параллельным? Я использую v0.3 Julia.

Заранее спасибо.

David

ответ

1

Это сработало для меня.

@everywhere x,y,z = 1,2,3 
@everywhere function f(i,x,y,z) 
    sleep(1) 
    return(ones(500)*i, i+x+y+z) 
end 

naive = @time map(i -> f(i,x,y,z), 1:50) 
parallel = @time pmap(i -> f(i,x,y,z), 1:50) 

A = [x[1] for x in parallel] 
b = [x[2] for x in parallel] 

Позвольте мне знать, если кто-то может предложить более удобный способ, чтобы получить А и Б из массива кортежей, который производится ртар.

Тайминги (при запуске на 8-процессов) являются, как мы ожидали бы

elapsed time: 5.063214725 seconds (94436 bytes allocated) 
elapsed time: 0.815228485 seconds (288864 bytes allocated) 
+0

Это очень полезно, спасибо. Интересно, что A хранится как вектор размера 50, где каждый компонент представляет собой вектор размером 500, а не матрицей 500 на 50 или 25000 на 1. Я могу обойти это, выполнив: C = Int64 [] для i в 1:50 C = append! (C, A [i]) конец конец C = reshape (C, 500,50) Хотя дайте мне знать, если есть лучший способ сделать это. В очередной раз благодарим за помощь. –

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