我正在尝试并行化我编写的一些科学代码。但是当我添加@parallelize
时,仅一个处理器上的类似代码突然需要10倍的执行时间。它应该花费大致相同的时间。第一个代码进行一次内存分配,而第二个代码进行20次。但zeros(Float64, num_bins)
不应成为瓶颈。 num_bins
是1800.因此,对zeros()
的每次调用都应该分配8 * 1800字节。分配14,400字节的20次调用不应该花这么长时间。
我无法弄清楚我做错了什么,而且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字节,gc时间为17.40%)