hap*_*s10 21 parallel-processing concurrency multithreading
这是Rob Pike对此的幻灯片.每次我通过这个,我都觉得自己像个白痴.我无法弄清楚它的要点.众所周知,并发性是将复杂问题分解为更小的组件.如果你不能正确地将某些东西划分成较小的部分,那么使用并发很难解决它.
但是,一旦你实现了并发性,关于如何获得并行性的幻灯片中没有太多细节.在Lesson幻灯片(第52期)中,他说并发 - "甚至可能是并行".但问题是 - 何时以及如何才能正确有效地实现并发性并行化?
我的猜测是,在引擎盖下,Rob指出开发人员应该在并发级别工作 - 并行性应该是语言/ vm的关注(gomaxprocs?).只关心智能分解成更小的单元,只关心正确的并发性 - 并行性将由"系统"来处理.
请说清楚.
Rob Pike的意思
当您考虑到算法的抽象形式时,您必须选择是使用消息传递还是共享内存还是混合实现它.您还必须考虑内存访问类型(NUMA,UMA等)和使用的拓扑(Hypercube,Torus,Ring,Mesh,Tree等)
对于那些只想要某种东西,甚至可能是简单的,以并行方式完成的人来说,这似乎是很多工作(例如并行).
特别是如果你改变了拓扑结构,这是很多工作(所以你可以拥有它的所有优点).
所以你编写并行代码(简单或复杂),VM或编译器将选择最好的方式,甚至以顺序方式运行它!(一个例子是.net的任务并行库)
重要编辑:
我应该提一下,我在讨论程序/算法中的并发性,而不是在系统中运行的独立程序之间.
你之前这么说
众所周知,并发性是将复杂问题分解为更小的组件.如果你不能正确地将某些东西划分成较小的部分,那么使用并发很难解决它
但这是错误的b/c 那些较小的组件可能以顺序的方式相互依赖完成,所以即使你分成小组件,也不意味着你实现了并发/并行.
在我所有的并行和分布式算法(BS和MS)中,我们从未谈到" 我们获得的并发性,现在让我们看看如何获得并行性 ".如果使用并发一词来描述和算法,那么你就意味着并行性,反之亦然.
在文献中,您还会发现分布式和并行之间的细线.
从算法的角度来看,您可以使用并发,并行和分布式,并获得相同的想法.
从实现的角度来看,如果你说"并行",你通常打算在本地计算机或集群上运行一个程序(共享内存通信),并在网格上运行程序时"分发"(消息传递通信) .
现在,分布式和并行性都意味着并发性.
我认为你应该对这些术语的确切含义更加怀疑,因为即使在文献中(我谈到的是实际上对这个领域做出贡献的人而不仅仅是某种语言的创造),它们也被用来表达抽象概念.
算法上的并发(即它是程序)意味着拥有可以独立于其他代码片段运行的代码片段,即使它们最终会等待其他一些代码片段(检查Amdahl定律以确切地了解其中的含义).
因此,只要您在算法/程序中具有并发性,您就会有并行性.
我认为最好只实现一些并行AND分布式算法,以更好地理解它背后的想法.如果您了解C/C++,则可以将OpenMPI用于分布式(消息传递)实现,将OpenMP用于并行(共享内存)实现.
编辑:
他也可以将并发作为抽象原则,并将其与实现方式并行[共享内存,消息传递,两者之间的混合; 内存访问类型(numa,uma等)].