Опитвам се да паралелизирам малък научен код, който написах. Но когато добавя @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 време)
atoms
? Форма? Float64 ли е и т.н.? - person cd98   schedule 04.12.2014