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

Chr*_*kas 9 parallel-processing multithreading julia

正如标题所述,不同形式的并行性的开销是多少,至少在Julia的当前实现中是什么(v0.5,以防将来实施剧烈变化)?我正在寻找一些"实用的措施",一些一般的启发式或棒球场,以便在它有用时保留在我的脑海里.例如,很明显多处理不会在循环中获得收益,如:

addprocs(4)
@parallel (+) for i=1:4
  rand()
end
Run Code Online (Sandbox Code Playgroud)

并没有给你带来性能提升,因为每个进程只占用一个随机数,但是有没有一般的启发式方法可以知道它什么时候值得?另外,线程启发式怎么样?它肯定比多处理开销更低,但是例如,有4个线程,对于N,多线程是一个好主意:

A = rand(4)
Base.@threads (+) for i = 1:N
  A[i%4+1] 
end
Run Code Online (Sandbox Code Playgroud)

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

用更具体的术语来说:什么是一些好的经验法则?

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

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

Mic*_*gge 2

一些注意事项: 1.我是根据 0.4.6 版本(及之前的版本)的经验说的,还没有玩过 0.5(但是,正如我希望我下面的回答所表明的那样,我认为这对于-相对于我给出的回应)。2.这不是一个完全全面的答案。

然而,根据我的经验,只要您不处理数据移动问题,多个进程本身的开销就非常小。换句话说,根据我的经验,每当您发现自己希望某个东西比 CPU 上的单个进程可以管理的速度更快时,您就已经远远超出了并行性的好处。比如你给出的随机数求和的例子,我刚才通过测试发现盈亏平衡点在10000个随机数左右。任何更多的东西和并行性都是明显的赢家。对于现代计算机来说,生成 10,000 个随机数是微不足道的,只需几分之一秒的时间,并且远低于我开始因脚本的缓慢而感到沮丧并希望并行性来加快速度的阈值。

因此,至少我认为,尽管 Julia 开发人员可能可以做更多奇妙的事情来进一步减少开销,但在这一点上,与 Julia 相关的任何事情都不会那么多限制因素,至少在并行性的计算方面。 我认为在增强并行数据移动的便利性和效率方面仍然需要改进(我喜欢您在该主题上开始的软件包,这是一个很好的步骤。您和我可能都同意有还有很长的路要走)。但是,最大的限制因素是:

  1. 您需要在进程之间移动多少数据?
  2. 在计算过程中,您需要对内存进行多少读/写操作?(例如每次读/写的失败次数)

方面 1. 有时可能会反对使用并行性。方面2.更有可能只是意味着你不会从中获得那么多好处。而且,至少在我对“开销”的解释中,这两个因素都没有直接落入该特定考虑范围。而且,我相信,这两者都将更多地由系统硬件决定,而不是由 Julia 决定。