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