Джулия выделяет огромное количество памяти по неизвестной причине

Я пытаюсь распараллелить небольшой научный код, который написал. Но когда я добавляю @parallelize, аналогичный код только на одном процессоре внезапно начинает выполняться в 10 раз дольше. Должно пройти примерно столько же времени. Первый код делает одно выделение памяти, а второй — 20. Но zeros(Float64, num_bins) не должно быть узким местом. num_bins равно 1800. Таким образом, каждый вызов zeros() должен выделять 8*1800 байт. 20 вызовов для выделения 14 400 байт не должны занимать так много времени.

Я не могу понять, что я делаю неправильно, и документация Джулии расплывчата и неконкретна в отношении того, как осуществляется доступ к переменным в @parallel. Обе версии приведенного ниже кода вычисляют правильное значение для вектора rdf. Может ли кто-нибудь сказать, глядя на него, что заставляет его выделять так много памяти и так долго?

atoms = readAtoms(file)

rdf = zeros(Float64, num_bins)
@time for k = 1:20
    for i = 1:num_atoms
        for j = 1:num_atoms
            r = distance(k, atoms, i, atoms, j)

            bin_number = floor(r / dr) + 1
            rdf[bin_number] += 1
        end
    end
end

истекшее время: 8,1 секунды (выделено 0 байтов)

atoms = readAtoms(file)

@time rdf = @parallel (+) for k = 1:20
    rdf_part = zeros(Float64, num_bins)

    for i = 1:num_atoms
        for j = 1:num_atoms
            r = distance(k, atoms, i, atoms, j)

            bin_number = floor(r / dr) + 1
            rdf_part[bin_number] += 1
        end
    end

    rdf_part
end

прошедшее время: 81,2 секунды (выделено 33472513332 байта, 17,40% времени gc)


person Nick    schedule 04.12.2014    source источник
comment
Можете ли вы поставить этот последующий вопрос как другой вопрос?   -  person IainDunning    schedule 04.12.2014
comment
Можете ли вы привести пример того, что такое atoms? Форма? Это Float64 и т. д.?   -  person cd98    schedule 04.12.2014