23

是 Rob Pike 的幻灯片。每次经过这个我都觉得自己像个白痴。我无法弄清楚它的要点。众所周知,并发是将复杂问题分解为更小的组件。如果你不能正确地将某些东西分成更小的部分,那么使用并发就很难解决它。

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

我的猜测是,Rob 指出开发人员应该在并发级别上工作——并行性应该是语言/虚拟机的关注点(gomaxprocs?)。只关心智能分解成更小的单元,只关心正确的并发性——并行性将由“系统”来处理。

请阐明一些观点。

4

1 回答 1

6

罗布·派克是什么意思

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

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

这需要做很多工作,尤其是如果您更改拓扑(这样您就可以拥有它的所有优势)。

因此,您编写并行代码(无论是简单的还是复杂的),VM 或编译器将选择似乎是最好的方法,甚至以顺序方式运行它!(一个例子是 .net 的任务并行库)

重要编辑:

我应该提一下,我说的是程序/算法中的并发,而不是系统中运行的独立程序之间的并发。

你之前这么说

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

但是错误的 b/c那些较小的组件可能会以顺序的方式相互依赖来完成,因此即使您分成小组件,也并不意味着您实现了并发/并行。

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

在文献中,您还会发现分布式和并行之间的细线。

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

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

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

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

算法(无论是程序)的并发性意味着拥有可以独立于其他代码段运行的代码片段,即使它们最终会等待其他一些代码片段(检查阿姆达尔定律以准确了解这一点)。

因此,每当您在算法/程序中具有并发性时,您也具有并行性。

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

编辑:

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

于 2012-07-28T12:52:15.853 回答