Rob Pike 是什么意思
当您考虑到算法的抽象形式时,您必须选择是使用消息传递或共享内存还是混合来实现它。您还必须考虑内存访问的类型(NUMA、UMA 等)和使用的拓扑(Hypercube、Torus、Ring、Mesh、Tree 等)
对于只想要一些东西的人来说,这似乎需要做很多工作,甚至可能很简单,以并行方式完成(例如并行)。
而且工作量很大,尤其是在您更改拓扑时(这样您就可以发挥其所有优势)。
所以你编写并行代码(无论是简单的还是复杂的),VM 或编译器会选择似乎是最好的方法,甚至以顺序方式运行它!(一个例如 .net 的任务并行库)
重要编辑:
我应该提一下,我说的是程序/算法中的并发,而不是系统中运行的独立程序之间的并发。
你说过
众所周知,并发是将复杂问题分解为更小的组件。如果你不能正确地将某个东西分成更小的部分,那么使用并发很难解决它
但是b/c是错误的那些较小的组件可能会以顺序的方式相互依赖来完成,所以即使你分成小组件,也不代表你实现了并发/并行.
在我所有的并行和分布式算法类别中(在 BS 和 MS 中)我们从未谈论过“我们获得了并发性,现在让我们看看如何获得并行性” .如果你用并发这个词来描述和算法,那么你就意味着并行,反之亦然。
在文献中,您还会发现分布式和并行之间有一条细线。
从算法的角度来看,您可以使用并发、并行和分布式,并且您会得到相同的想法。
从实现的角度来看,如果说“并行”,通常是指在本地计算机或集群上运行的程序(共享内存通信),而当您在网格上运行程序时是“分布式”(消息传递通信)。
现在,分布式和并行都意味着并发。
我认为您应该对这些术语的确切含义持怀疑态度,因为即使在文献中(我谈论的是对这一领域做出实际贡献的人,而不仅仅是创造某种语言),它们也被用来表达抽象概念。
算法(无论是程序)的并发性意味着拥有可以独立于其他代码段运行的代码片段,即使它们最终会等待其他一些代码片段(查看阿姆达尔定律以准确了解这个)。
因此,当您在算法/程序中具有并发性时,您也具有并行性。
我认为最好只实现一些并行和分布式算法以更好地理解其背后的想法。如果您了解 C/C++,则可以将 OpenMPI 用于分布式(消息传递)实现,将 OpenMP 用于并行(共享内存)实现。
编辑:
他也可以将并发作为抽象原理,将并行作为实现方式[共享内存,消息传递,两者之间的混合;内存访问类型(numa、uma 等)]。