2016-05-14 2 views
3

Я тестирую параллелизм в Julia, чтобы увидеть, есть ли ускорение на моей машине (я выбираю язык для реализации новых алгоритмов). Я не хотел бы посвятить массу времени написания огромный пример, так что я сделал следующий тест на релиз версии Julia 0.4.5 (Mac OS X и двухъядерный):pmap slow для примера игрушки

$ julia -p2 

julia> @everywhere f(x) = x^2 + 10 
julia> @time map(f, 1:10000000) 
julia> @time pmap(f, 1:10000000) 

pmap значительно медленнее, чем карта (> 20x) и выделяет более 10x памяти. Что я делаю не так?

Спасибо.

ответ

8

Это потому, что pmap предназначен для тяжелых вычислений на ядро, не так много простых. Если вы используете что-то простое, как ваша функция, накладные расходы на перемещение по информации вдоль proccesors больше, чем пользы. Вместо этого, проверить этот код (я запускаю его с 4 ядрами в i7):

function fast(x::Float64) 
    return x^2+1.0 
end 

function slow(x::Float64) 
    a = 1.0 
    for i in 1:1000 
     for j in 1:5000 
      a+=asinh(i+j) 
     end 
    end 
    return a 
end 

info("Precompilation") 
map(fast,linspace(1,1000,1000)) 
pmap(fast,linspace(1,1000,1000)) 
map(slow,linspace(1,1000,10)) 
pmap(slow,linspace(1,1000,10)) 

info("Testing slow function") 
@time map(slow,linspace(1,1000,10)) #3.69 s 
@time pmap(slow,linspace(1,1000,10)) #0.003 s 
info("Testing fast function") 
@time map(fast,linspace(1,1000,1000)) #52 μs 
@time pmap(fast,linspace(1,1000,1000)) #775 s 

Для распараллеливания много очень малых итераций, вы можете использовать @parallel, искать его в документации.

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