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