Rob Pike的观点是什么
当你有一个算法的抽象形式在脑海中时,你必须选择使用消息传递、共享内存或者混合方式来实现它。你还必须考虑内存访问类型(NUMA、UMA等)和所使用的拓扑结构(超立方体、环、网格、树等)。
对于那些只想以并行方式完成某项任务(比如并行for循环)的人来说,这似乎是一项繁琐的工作,甚至是简单的任务也要如此。
特别是如果你改变了拓扑结构(为了获取所有优势),那么这将是一项非常艰巨的工作。
因此,你编写并行代码(无论是简单的还是复杂的),虚拟机或编译器会选择最佳方式运行它,甚至会以顺序方式运行!(例如.NET的任务并行库)
重要说明:
我应该说明的是,我所说的并发是指程序/算法中的并发,而不是系统中独立程序之间的并发。
你说:
众所周知,并发是将复杂的问题分解成更小的组件。如果你不能将某个东西正确地分解成较小的部分,就很难使用并发来解决它。
但这是错误的,因为这些更小的组件可能需要按照顺序依次完成,所以即使你将其分解成小组件,也不意味着你实现了并发/并行。
在我所有的并行和分布式算法课程中 (本科和硕士),我们从未谈论过“我们获得了并发,现在让我们看看如何获得并行”。如果你用并发来描述一种算法,那么你就意味着并行,反之亦然。
在文献中,分布式和并行之间存在细微的差别。
从算法的角度来看,你可以使用并发、并行和分布式,而得到相同的思路。
从实现的角度来看,如果你说“并行”,你通常指在本地计算机或集群上运行的程序(共享内存通信),而“分布式”则指在网格上运行程序(消息传递通信)。
现在,无论是分布式还是并行都意味着并发。
我认为你应该对这些术语的确切含义更加持怀疑态度,因为即使在文献中(我谈论的是那些实际上为此领域做出贡献的人,而不仅仅是创建了一些语言的人),它们也被用来表达抽象概念。
算法/程序中的并发意味着有些代码片段可以独立于其他代码片段运行,即使它们最终仍将等待某些其他代码片段(请查看Amdahl's Law以了解其确切含义)。
因此,无论何时,在算法/程序中使用并发,都意味着具有并行性。
我认为最好实现一些并行和分布式算法来更好地理解其背后的思想。如果您知道C/C++,可以使用OpenMPI进行分布式(消息传递)实现,使用OpenMP进行并行(共享内存)实现。
编辑:
他也可能是指并发作为抽象原则,并行作为实现方式[共享内存、消息传递、两者之间的混合;内存访问类型(numa、uma等)]。