Julia v0.5中不同形式的并行性的开销是多少?

时间:2016-08-07 19:32:43

标签: multithreading parallel-processing julia

正如标题所述,不同形式的并行性的开销是多少,至少在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

(我知道现在没有线程缩减,但让我们表现得像,或者用更好的例子进行编辑)。当然,我可以对每个例子进行基准测试,但要记住一些好的规则会有很长的路要走。

更具体地说:什么是一些好的经验法则?

  • 在线程化之前,您需要添加/增加多少个数字才能提高性能,或者在多重处理之前提供性能增强?
  • 依赖朱莉娅目前的实施多少钱?
  • 它取决于线程/进程的数量?
  • 依赖于架构多少钱?是否有良好的规则来了解特定系统的阈值何时应该更高/更低?
  • 哪种应用程序违反了这些启发式方法?

同样,我不是在寻找硬性规则,只是指导发展的一般指导方针。

1 个答案:

答案 0 :(得分:2)

一些警告:1。我是根据0.4.6版(以及之前版)的经验发言,还没有玩过0.5(但是,我希望我的答案如下所示,我不知道#39;认为这对于我给出的回应是必不可少的。 2.这不是一个完全全面的答案。

尽管如此,根据我的经验,多个进程本身的开销非常小提供,您不会处理数据移动问题。换句话说,根据我的经验,任何时候你发现自己处于希望某事的状态比CPU上的单个进程能够管理得更快,你就已经远远超过了并行性将会有益的地步。例如,在您给出的随机数示例的总和中,我刚刚通过测试发现盈亏平衡点大约是10,000个随机数。更多和平行主义是明显的赢家。对于现代计算机来说,生成10,000个随机数是微不足道的,只需要一小段时间,并且远低于我开始对脚本的缓慢感到沮丧的阈值,并希望并行性能加速它们。

因此,我至少认为,尽管朱莉娅开发商可能会采取更多精彩的措施来减少开销,但此时,任何与朱莉娅相关的事情都不是。这将是你的限制因素,至少在并行性的计算方面。我认为在增强并行性的简易性和效率方面仍有待改进数据移动(我喜欢你在这个主题上开始的包是一个很好的步骤。你和我可能都同意那里还有更多的方法)。但是,最大的限制因素是:

  1. 您需要在流程之间移动多少数据?
  2. 在计算过程中,您需要对内存进行多少读/写操作? (例如,每次读/写的翻牌)
  3. 方面1.有时可能会倾向于使用并行性。方面2.更可能只是意味着你不会从中获得如此多的好处。并且,至少在我解释"开销时,"这些都没有真正直接落入这一具体考虑因素。而且,我认为,这些都将比你的系统硬件更加严重,而不是朱莉娅。