【发布时间】:2016-05-01 13:32:42
【问题描述】:
我有这个代码(原始热传递):
function heat(first, second, m)
@sync @parallel for d = 2:m - 1
for c = 2:m - 1
@inbounds second[c,d] = (first[c,d] + first[c+1, d] + first[c-1, d] + first[c, d+1] + first[c, d-1]) / 5.0;
end
end
end
m = parse(Int,ARGS[1]) #size of matrix
firstm = SharedArray(Float64, (m,m))
secondm = SharedArray(Float64, (m,m))
for c = 1:m
for d = 1:m
if c == m || d == 1
firstm[c,d] = 100.0
secondm[c,d] = 100.0
else
firstm[c,d] = 0.0
secondm[c,d] = 0.0
end
end
end
@time for i = 0:opak
heat(firstm, secondm, m)
firstm, secondm = secondm, firstm
end
此代码在顺序运行时提供了很好的时间,但是当我添加 @parallel 时,即使我在一个线程上运行它也会减慢速度。我只需要解释为什么会这样?仅在不改变热函数算法的情况下编写代码。
【问题讨论】:
-
我不确定并行更新/读取共享数组的不同元素是否真的有效。
-
@RezaAfzalan 如果
SharedArray中的每个参与进程仅适用于其数组的本地索引,它应该可以正常工作。 OP 是否查看了并行计算文档中的advection example?我发现它很有帮助。注意localindices划分的边界。 -
与并行计算无关,但早期形成的一个有益习惯:在 Julia 中,按列而不是按行填充
firstm和secondm效率更高。尝试将d索引放在外循环中,将c变量放在内循环中。
标签: julia