正如标题所述,不同形式的并行性的开销是多少,至少在Julia的当前实现中是什么(v0.5,以防将来实施剧烈变化)?我正在寻找一些“实用的措施”,一些一般的启发式或棒球场,以便在它有用时保留在我的脑海里。例如,很明显,多处理不会在循环中获得收益,如:
addprocs(4)
@parallel (+) for i=1:4
rand()
end
并没有给你带来性能提升,因为每个进程只占用一个随机数,但是是否有通用的启发式方法来了解什么时候值得?另外,线程启发式怎么样?它肯定比多处理开销更低,但是例如,有4个线程,对于N是多线程的好主意:
A = rand(4)
Base.@threads (+) for i = 1:N
A[i%4+1]
end
(我知道现在没有线程缩减,但让我们表现得像,或者用更好的例子进行编辑)。当然,我可以对每个例子进行基准测试,但要记住一些好的规则会有很长的路要走。
更具体地说:什么是一些好的经验法则?
同样,我不是在寻找硬性规则,只是指导发展的一般指导方针。
答案 0 :(得分:2)
一些警告:1。我是根据0.4.6版(以及之前版)的经验发言,还没有玩过0.5(但是,我希望我的答案如下所示,我不知道#39;认为这对于我给出的回应是必不可少的。 2.这不是一个完全全面的答案。
尽管如此,根据我的经验,多个进程本身的开销非常小提供,您不会处理数据移动问题。换句话说,根据我的经验,任何时候你发现自己处于希望某事的状态比CPU上的单个进程能够管理得更快,你就已经远远超过了并行性将会有益的地步。例如,在您给出的随机数示例的总和中,我刚刚通过测试发现盈亏平衡点大约是10,000个随机数。更多和平行主义是明显的赢家。对于现代计算机来说,生成10,000个随机数是微不足道的,只需要一小段时间,并且远低于我开始对脚本的缓慢感到沮丧的阈值,并希望并行性能加速它们。
因此,我至少认为,尽管朱莉娅开发商可能会采取更多精彩的措施来减少开销,但此时,任何与朱莉娅相关的事情都不是。这将是你的限制因素,至少在并行性的计算方面。我认为在增强并行性的简易性和效率方面仍有待改进数据移动(我喜欢你在这个主题上开始的包是一个很好的步骤。你和我可能都同意那里还有更多的方法)。但是,最大的限制因素是:
方面1.有时可能会倾向于使用并行性。方面2.更可能只是意味着你不会从中获得如此多的好处。并且,至少在我解释"开销时,"这些都没有真正直接落入这一具体考虑因素。而且,我认为,这些都将比你的系统硬件更加严重,而不是朱莉娅。