并发不是并行性?
这是Rob Pike在这张幻灯片上的幻灯片。 每次我经过这个时候,我都觉得自己像个白痴。 我无法弄清楚它的要点。 众所周知,并发性是将复杂问题分解为更小的组件。 如果您无法正确地将某些东西分成较小的部分,则很难使用并发来解决它。
但是,一旦达到并发性,关于如何获得并行性的幻灯片没有太多细节。 在Lesson slide(第52期)中,他说并发 - “甚至可能并行”。 但问题是 - 何时以及如何才能正确有效地导致并行性?
我的猜测是,在Rob的指导下,开发人员应该在并发水平上工作 - 并行应该是语言的/ vm的担忧(gomaxprocs?)。 只关心智能分解成更小的单元,只关心正确的并发性 - 并行将由“系统”来照顾。
请说明一下。
Rob Pike的意思
在考虑算法的抽象形式时,您必须选择是否使用消息传递或共享内存或混合模式实现它。 您还必须考虑内存访问类型(NUMA,UMA等)和所用拓扑(超立方体,圆环,环形,网格,树等)
对于那些只想要一些东西,甚至可能很简单,以平行方式完成(例如并行)的人来说,这似乎有很多工作要做。
特别是如果你改变拓扑结构(这样你就可以拥有它的所有优点)是很多工作。
所以你编写并行代码(无论是简单的还是复杂的),虚拟机或编译器会选择似乎是最好的方式, 甚至以顺序方式运行它! (一个例子是.net的Task Parallel Library)
重要编辑:
我应该提到,我正在谈论程序/算法中的并发性,而不是在系统中运行的独立程序之间。
你之前这么说
众所周知,并发性是将复杂问题分解为更小的组件。 如果您无法正确地将某些东西分成较小的部分,则很难使用并发来解决它
但是它们是错误的b / c 这些较小的组件可能会依次相互依次完成,因此即使将它们分成小组件,也并不意味着您实现了并发/并行。
在我所有的并行和分布式算法 (无论是BS还是MS)中,我们从未谈及“我们获得的并发性,现在让我们看看如何获得并行性”。 如果你使用并发性来描述和算法,那么你意味着并行性,反之亦然。
在文献中,您还会发现分布式和并行之间的细线。
从算法的角度来看,你可以使用并发性,并行性和分布式,你可以得到同样的想法。
从实现的角度来看,如果你说“并行性”,你通常想要一个在本地计算机或集群上运行的程序(共享内存通信),当你在网格上运行程序时“分布式”(消息传递通信) 。
现在,分布式和并行性都意味着并发性。
我认为你应该对这些术语的确切含义持怀疑态度,因为即使在文献中(我谈论的是实际上对这个领域有贡献的人,而不仅仅是某种语言的创造),他们也被用来表达抽象概念。
并发算法(不管它是程序)意味着拥有可以独立于其他代码段运行的代码片段,即使它们最终会等待其他代码片段(检查Amdahl定律以查看其确切含义)。
所以,只要你在算法/程序中具有并发性,你也有并行性。
我认为最好是实施一些并行和分布式算法来更好地理解背后的想法。 如果您了解C / C ++,则可以使用OpenMPI进行分布式(消息传递)实现,并使用OpenMP进行并行(共享内存)实现。
编辑:
他还可以将并发作为抽象原则,并行执行的方式[共享内存,消息传递,两者之间的混合; 内存访问类型(numa,uma等)]。
链接地址: http://www.djcxy.com/p/79303.html上一篇: Concurrency is not Parallelism?
下一篇: What is the difference between concurrency and parallelism?