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

Опитвам се да паралелизирам малък научен код, който написах. Но когато добавя @parallelize, подобен код само на един процесор внезапно отнема 10 пъти повече време за изпълнение. Трябва да отнеме приблизително същото време. Първият код прави едно разпределение на паметта, докато вторият прави 20. Но zeros(Float64, num_bins) не трябва да бъде пречка. num_bins е 1800. Така че всяко извикване на zeros() трябва да разпределя 8*1800 байта. 20 извиквания за разпределяне на 14 400 байта не трябва да отнемат толкова време.

Не мога да разбера какво правя погрешно и документацията на Julia е неясна и неспецифична за това как се осъществява достъп до променливите в @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