Here是Rob Pike对此的幻灯片。每次我通过这个,我都觉得自己像个白痴。我无法弄清楚它的要点。众所周知,并发性是将复杂问题分解为更小的组件。如果你不能正确地将某些东西划分成较小的部分,那么使用并发很难解决它。
但是,在获得并发性后,幻灯片中没有太多关于如何获得并行性的细节。在Lesson幻灯片(第52期)中,他说并发 - “甚至可能是并行”。但问题是 - 何时以及如何才能正确有效地实现并发性?
我的猜测是,在引擎盖下,Rob指出开发人员应该在并发级别工作 - 并行性应该是语言/ vm的关注(gomaxprocs?)。只关心智能分解成更小的单元,只关心正确的并发性 - 并行性将由“系统”来处理。
请说清楚。
答案 0 :(得分:7)
Rob Pike的意思
当您考虑到算法的抽象形式时,您必须选择是否使用消息传递或共享内存或混合实现它。您还必须考虑内存访问类型(NUMA,UMA等)和使用的拓扑(超立方体,环面,环,网格,树等)
对于那些只想要某种东西,甚至可能是简单的,以平行方式完成的人来说,这似乎是很多工作(例如并行)。
特别是如果你改变了拓扑结构(这样你可以拥有它的所有优点),这是很多工作。
所以你编写并行代码(简单或复杂),VM或编译器将选择最好的方式,甚至以顺序方式运行它!(一个示例是.net的任务并行库
重要编辑:
我应该提一下,我在谈论程序/算法中的并发性,而不是在系统中运行的独立程序之间。
你说那个
众所周知,并发性是将复杂问题分解为更小的组件。如果你不能正确地将某些东西划分成较小的部分,那么使用并发很难解决它
但这是错误的b / c 那些较小的组件可能以顺序方式相互依赖来完成,所以即使你分成小组件,也不意味着你实现了并发/并行
在我所有的并行和分布式算法类中(在BS和MS中)我们从未谈过“我们获得的并发性,现在让我们看看如何获得并行性” 。如果使用并发一词来描述和算法,那么你就意味着并行性,反之亦然。
在文献中,您还可以找到分布式和并行之间的细线。
从算法的角度来看,你可以使用并发,并行和分布式,你会得到同样的想法。
从实现的角度来看,如果你说“并行”,你通常打算在本地计算机或集群上运行一个程序(共享内存通信),并在网格上运行程序时“分发”(消息)通过沟通。)
现在,分布式和并行性都意味着并发。
我认为你应该对这些术语的确切含义持怀疑态度,因为即使在文献中(我谈到实际上对这个领域做出贡献的人而不仅仅是某种语言的创造),它们也被用来表达这些术语。概念
算法上的并发(无论是程序)意味着拥有可以独立于其他代码片段运行的代码片段,即使它们最终会等待其他一些代码片段(检查Amdahl定律,看看究竟是什么意思)这一点)。
因此,只要您在算法/程序中具有并发性,您就会有并行性。
我认为最好只实现一些并行的AND分布式算法,以便更好地理解它背后的想法。如果您了解C / C ++,则可以将OpenMPI用于分布式(消息传递)实现,将OpenMP用于并行(共享内存)实现。
修改强>
他也可以将并发视为抽象原则,并将其作为实现方式并行[共享内存,消息传递,两者之间的混合;内存访问类型(numa,uma等)]。