Multithreading 分布式工作同步和fork-join并行编程方法之间的区别是什么

Multithreading 分布式工作同步和fork-join并行编程方法之间的区别是什么,multithreading,go,concurrency,Multithreading,Go,Concurrency,在维基百科的这篇文章中: 据称,go专家使用分布式工作同步模式来组织他的并行程序,而非专家使用fork-join: 我在学校熟悉fork-join,但我想知道分布式工作同步模式是什么,它与我熟悉的经典fork-join模型有什么区别 当我使用fork-join时,我通常会运行与内核一样多的线程,但在论文中他们说go专家也这样做,他们简要地提到创建新线程的开销是go专家优化代码的方法之一,但似乎没有详细说明。我会非常小心地将您引用的声明作为go编程的一般真理 我假设在“分布式工作同步”中描述的

在维基百科的这篇文章中:

据称,go专家使用分布式工作同步模式来组织他的并行程序,而非专家使用fork-join:

我在学校熟悉fork-join,但我想知道分布式工作同步模式是什么,它与我熟悉的经典fork-join模型有什么区别


当我使用fork-join时,我通常会运行与内核一样多的线程,但在论文中他们说go专家也这样做,他们简要地提到创建新线程的开销是go专家优化代码的方法之一,但似乎没有详细说明。

我会非常小心地将您引用的声明作为go编程的一般真理

我假设在“分布式工作同步”中描述的是将问题划分为子任务的方法,这些子任务主要由硬件实现的并行化决定,而不是由问题分解为较小任务的自然方式决定

根据您的具体问题和专业知识,这种方法可能会给您带来一些性能优势,但即使是在遇到问题时也可能会带来一些好处。此外,这种方法更依赖于您使用的特定硬件(例如2-32 vs 64-1024核,常规CAS vs LL/SC),以及特定的问题大小(例如适合L1 vs勉强适合RAM),最重要的是,取决于您对该方法的专业知识以及您用来解决问题的工具

以上是标准的“过早优化是万恶之源”/“简单、充分和正确胜过复杂、超快速和带有潜在缺陷”的建议,但本文引用的实际实验也给出了一些例子,说明为什么您应该使用自己的判断来使用哪种方法

  • 该研究使用Go 1.0.3。在调度、垃圾收集和goroutine/channel性能方面所做的重大改进可能已经有效地使结果过时

    1.1。具有讽刺意味的是,该论文提到,对于其中一个Chapel解决方案,使用Chapel 1.6(而不是1.5)时,专家版的速度慢了约68%

  • 这项研究并没有提供统计上显著的结果——对于4个平台中的每一个,一个非专家解决了6个符合特定蓝图的综合问题,然后根据一个专家的建议重新编写了他的解决方案

  • 专家不应对在特定环境之外应用其建议负责分布式工作同步是解决这些特定问题的更好方法,如果您是Golang团队(Luuk van Dijk)的员工软件工程师,您的备选方案是使用简单的分而治之和Go 1.0.3

  • 当我使用fork-join时,我通常会运行与内核一样多的线程,但在论文中他们说go专家也这样做了,他们简要地提到了创建新线程的开销,这是go专家优化代码的方法之一,但似乎没有详细介绍

    我假设创建新线程的开销与接近递归树底部时任务的增加有关

    我认为属于案例2和案例3的算法将受到特别的影响,但即使是属于案例1的算法(在树的叶级上完成的工作最重要,即生成线程的开销被稀释得最多)也会受到影响。例如,在自顶向下的合并排序中为每对元素的比较创建一个新的逻辑任务可能是多余的

    我运行的线程和内核一样多,但是在逻辑上自然地/在每个递归级别上划分工作是我对分布式工作同步的理解和简单的分而治之的理解之间的一个很大的折衷

    为了在K个工作线程上调度N个任务,您仍然在复杂性上付出了一些代价(可能,但不一定,在运行时间上)。这个价格可能会让您在运行时错失并行化机会,例如,因为缓存抖动、子操作调度、线程或核心关联等。 但是,这可能会在语言平台级别、Fork-Join框架级别(如果您使用的是框架)或操作系统级别从程序中抽象出来。 在这种情况下,您的解决方案并不完全负责适应语言平台、问题大小或机器硬件的变化,您应该能够从底层的优化中获益,而不必触及解决方案


    我敢打赌,定制分布式工作同步解决方案增加的复杂性和降低的可移植性是值得的,前提是你能证明你的自然分而治之的解决方案是不够的,并且你知道后果。

    太好了,我同意你的结论。我想我或多或少明白他们现在在做什么,而且听起来我还不需要退休。标记为已回答。感谢您的详细解释。=]