并发不等于并行?

24

这里是Rob Pike关于此事的幻灯片。每次我看到它,我都感觉自己像个白痴。众所周知,并发是将复杂问题分解成较小组件的过程。如果您无法正确地将某些东西分解成较小的部分,则很难使用并发解决它。

但是,在实现并发之后,幻灯片中并没有详细介绍如何实现并行性。在第52页的课程幻灯片中,他说并发-“甚至可能是并行”。但问题是 - 何时以及如何才能使并发正确高效地导致并行性?

我猜,在幕后,Rob指出开发人员应该在并发级别上工作,而并行性应该是语言/虚拟机的关注点(gomaxprocs?)。只需关注智能分解为较小单元,仅关注正确的并发性-并行性将由“系统”处理。

请给我们一些启示。


这里有太多开放式讨论的空间了。我已经向Programmers.SE的管理员询问过这是否可行。谢谢。 - Kev
1个回答

7

Rob Pike的观点是什么

当你有一个算法的抽象形式在脑海中时,你必须选择使用消息传递、共享内存或者混合方式来实现它。你还必须考虑内存访问类型(NUMA、UMA等)和所使用的拓扑结构(超立方体、环、网格、树等)。

对于那些只想以并行方式完成某项任务(比如并行for循环)的人来说,这似乎是一项繁琐的工作,甚至是简单的任务也要如此。

特别是如果你改变了拓扑结构(为了获取所有优势),那么这将是一项非常艰巨的工作。

因此,你编写并行代码(无论是简单的还是复杂的),虚拟机或编译器会选择最佳方式运行它,甚至会以顺序方式运行!(例如.NET的任务并行库)

重要说明:

我应该说明的是,我所说的并发是指程序/算法中的并发,而不是系统中独立程序之间的并发。

你说:

众所周知,并发是将复杂的问题分解成更小的组件。如果你不能将某个东西正确地分解成较小的部分,就很难使用并发来解决它。

但这是错误的,因为这些更小的组件可能需要按照顺序依次完成,所以即使你将其分解成小组件,也不意味着你实现了并发/并行。

在我所有的并行和分布式算法课程中 (本科和硕士),我们从未谈论过“我们获得了并发,现在让我们看看如何获得并行”。如果你用并发来描述一种算法,那么你就意味着并行,反之亦然。

在文献中,分布式和并行之间存在细微的差别。

从算法的角度来看,你可以使用并发、并行和分布式,而得到相同的思路。

从实现的角度来看,如果你说“并行”,你通常指在本地计算机或集群上运行的程序(共享内存通信),而“分布式”则指在网格上运行程序(消息传递通信)。

现在,无论是分布式还是并行都意味着并发。

我认为你应该对这些术语的确切含义更加持怀疑态度,因为即使在文献中(我谈论的是那些实际上为此领域做出贡献的人,而不仅仅是创建了一些语言的人),它们也被用来表达抽象概念。

算法/程序中的并发意味着有些代码片段可以独立于其他代码片段运行,即使它们最终仍将等待某些其他代码片段(请查看Amdahl's Law以了解其确切含义)。

因此,无论何时,在算法/程序中使用并发,都意味着具有并行性。

我认为最好实现一些并行和分布式算法来更好地理解其背后的思想。如果您知道C/C++,可以使用OpenMPI进行分布式(消息传递)实现,使用OpenMP进行并行(共享内存)实现。
编辑: 他也可能是指并发作为抽象原则,并行作为实现方式[共享内存、消息传递、两者之间的混合;内存访问类型(numa、uma等)]。

2
我认为Rob Pike所说的重点是关于“处理并行性”-多个线程在多核处理器上同时运行。 - Marcelo De Zen
1
我已经在编辑部分涵盖了这个问题 :)。 - amb
@devundef,如果你手头只有一个单处理器(即1个ALU),那么你就不能谈论并行性/并发性/分布式算法。那么你想说什么? - amb
5
看起来你读了太多而没有实践。你应该花大约15分钟重新阅读并理解并发是什么。你误解了一些基础知识。使用抢占式的时间共享线程,你可以在单核处理器上获得并发性。但在单核处理器上无法实现并行处理。明白了吗? - Marcelo De Zen
1
@devundef 我只是在谈论算法(及其实现)方面的概念。我有足够的实践经验,使用OpenMP和OpenMPI实现并行和分布式算法。不要混淆算法相关的概念和操作系统视图相关的概念。这就是为什么我认为在算法(及其实现)的上下文中使用并发这个词是一个糟糕的选择,因为人们会开始考虑操作系统层面,而不是具体到该程序。 - amb
显示剩余3条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接