у меня есть этот код (примитив передачи тепла):Джулия значительно медленнее @parallel
function heat(first, second, m)
@sync @parallel for d = 2:m - 1
for c = 2:m - 1
@inbounds second[c,d] = (first[c,d] + first[c+1, d] + first[c-1, d] + first[c, d+1] + first[c, d-1])/5.0;
end
end
end
m = parse(Int,ARGS[1]) #size of matrix
firstm = SharedArray(Float64, (m,m))
secondm = SharedArray(Float64, (m,m))
for c = 1:m
for d = 1:m
if c == m || d == 1
firstm[c,d] = 100.0
secondm[c,d] = 100.0
else
firstm[c,d] = 0.0
secondm[c,d] = 0.0
end
end
end
@time for i = 0:opak
heat(firstm, secondm, m)
firstm, secondm = secondm, firstm
end
Этот код дает хорошие времена, когда работать последовательно, но когда я добавляю @parallel его замедлить, даже если я бег на один нить. Мне просто нужно объяснение, почему это происходит? Код, только если он не изменяет алгоритм функции тепла.
Я не уверен, что параллельное обновление/чтение различных элементов общего массива действительно работает. –
@RezaAfzalan он должен работать нормально, если каждый участвующий процесс в 'SharedArray' работает только с его локальными индексами массива. Опыталась ли ОП [пример адвекции] (http://docs.julialang.org/en/latest/manual/parallel-computing/#id2) из параллельных вычислений? Я нашел это очень полезным. Обратите внимание на границы, демаркированные «локальными индексами». –
Несвязанные с параллельными вычислениями, но полезная привычка формироваться рано: в Юлии более эффективны заполнение 'firstm' и' secondm' столбцами вместо строк. Попробуйте поместить индекс 'd' во внешний цикл и переменную' c' во внутреннем цикле. –