首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >并发不是并行吗?

并发不是并行吗?
EN

Stack Overflow用户
提问于 2012-07-28 20:17:20
回答 1查看 6.3K关注 0票数 22

Here是Rob Pike在这方面的幻灯片。每次我经历这样的事情,我都觉得自己像个笨蛋。我不能理解它的大意。众所周知,并发是将复杂的问题分解成更小的组件。如果你不能正确地将一些东西分成更小的部分,那么就很难使用并发来解决它。

但是在实现并发性之后,幻灯片中没有太多关于如何获得并行性的细节。在课程幻灯片(编号52)中,他说并发性-“甚至可能是并行的”。但问题是-何时以及如何正确有效地实现并行性?

我的猜测是,Rob在幕后指出,开发人员应该在并发级别工作-而并行应该是语言/vm的关注点(gomaxprocs?)。只关心智能分解成更小的单元,只关心正确的并发性-并行将由“系统”负责。

请放出一些光芒。

EN

回答 1

Stack Overflow用户

发布于 2012-07-28 20:52:16

罗伯·派克的意思是

当你脑海中有了算法的抽象形式时,你就必须选择是用消息传递实现它,还是共享内存,或者可能是混合实现。您还必须考虑内存访问的类型(NUMA、UMA等)和使用的拓扑(Hypercube、Torus、Ring、Mesh、Tree等)

对于那些只想要一些东西,甚至是简单的,以并行方式完成的人来说,这似乎是大量的工作(例如,并行)。

而且这是大量的工作,特别是如果你改变了拓扑(这样你就可以拥有它的所有优点)。

所以你写并行代码(不管是简单的还是复杂的),虚拟机或编译器会选择最好的方法,甚至以顺序的方式运行它!(一个例子是.net的任务并行库)

重要编辑:

我应该提到的是,我谈论的是程序/算法中的并发性,而不是在系统中运行的独立程序之间的并发性。

你说过的

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

但它是错误的b/c 那些较小的组件可能依赖于彼此的顺序方式来完成,所以即使你划分成小的组件,这并不意味着你实现了并发性/并行性。

在我所有的并行和分布式算法类(包括BS和MS)中,我们从未讨论过“我们获得的并发性,现在让我们看看如何获得并行性”。如果你使用并发这个词来描述和算法,那么你就意味着并行性,反之亦然。

在文献中,你也会发现分布式和并行之间只有一条细线。

从算法的角度来看,你可以使用并发性、并行性和分布式,你会得到同样的想法。

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

现在,分布式和并行性都意味着并发。

我认为你应该对这些术语的确切含义持更多的怀疑态度,因为即使在文献中(我说的是对这个领域做出贡献的人,而不仅仅是某种语言的创造),它们也被用来表达抽象的概念。

算法(程序)上的并发性意味着拥有可以独立于其他代码片段运行的代码片段,即使它们最终会等待一些其他代码片段(请查看Amdahl定律以了解这一点的确切含义)。

因此,当你在一个算法/程序中有并发时,你也有并行性。

我认为最好是实现一些并行和分布式算法,以便更好地理解其背后的思想。如果您了解C/C++,就可以使用OpenMPI实现分布式(消息传递),使用OpenMP实现并行(共享内存)。

编辑:

他还可以将并发作为抽象原则,将并行作为实现共享内存、消息传递、两者之间的混合的方式;内存访问的类型(numa、uma等)。

票数 6
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/11700953

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档