是否使用共享内存或分布式计算

时间:2012-12-15 18:54:49

标签: parallel-processing go shared-memory distributed-computing

Go的口号是“不要通过共享内存进行通信;而是通过通信共享内存”。我想知道Go是使用共享内存还是分布式计算方法。例如,对于MPI来说,它是明确分布式的,OpenMP显然是共享内存;但我不确定Go,这是独特的。

我看过许多帖子,例如Shared memory vs. Go channel communication,有效的Go文档等,但无法澄清。提前致谢。

2 个答案:

答案 0 :(得分:15)

Go不会阻止你在goroutines / threads之间共享内存。它们通信的意思是,您通过一个通道发送一大块数据或指向该块的指针。这有效地将数据的“所有权”转移到频道的目标读者。请注意,这种所有权转移不是由语言或运行时强制执行的,而是按照惯例。

如果您愿意,您仍然可以完全从两个goroutine写入相同的内存。换句话说:Go不会阻止你在脚下射击自己,它只是提供语言语义,使这些错误更容易被发现。

如果一个值传递到一个通道,程序员必须假设该值不再是他在同一个goroutine中写入的。

func F(c chan *T) {
    // Create/load some data.
    data := getSomeData()

    // Send data into the channel.
    c <- data

    // 'data' should now be considered out-of-bounds for the remainder of
    // this function. This is purely by convention, and is not enforced
    // anywhere. For example, the following is still valid Go code, but will
    // lead to problems.
    data.Field = 123
}

答案 1 :(得分:4)

该问题假设共享内存和分布式计算是对立的。这有点像问:RAM和LAN是否存在对立面?区分CPU /内存节点内和CPU /内存节点之间的共享内存并发将更加清晰。

这是并行处理研究的更大图景的一部分。有许多研究项目,包括:

  • 开发具有多个CPU共享单个内存的非Von-Neumann计算机,通过某种形式的交换结构(通常是Clos网络)加入。 OpenMP非常适合这些。

  • 开发由一组CPU组成的并行计算机,每个CPU都有自己独立的内存,并且节点之间有一些通信结构。这通常是MPI的所在地。

第一个案例专门研究高性能计算联盟。后一种情况对我们大多数人来说都很熟悉。在这种情况下,通常这些天通信只是通过以太网,但是已经(成功)为某些利基开发了各种更快的低延迟替代方案(例如IEEE1355 SpaceWire,它来自Transputer串行链路)。

多年来,主流观点认为只有共享内存才能实现高效的并行性,因为传递消息的通信成本(天真地)被认为是禁止的。对于共享内存并发,困难在于软件:因为一切都是相互依赖的,随着系统变大,设计并发性变得越来越难以组合。需要核心专业知识。

对于我们其他人来说,Go跟随Erlang,Limbo,当然还有Occam推广传递消息作为编排工作的手段。这源于Communicating Sequential Processes的代数,它为创建任何大小的并行系统提供了基础。 CSP设计是可组合的:每个子系统本身可以是更大系统的组件,没有理论限制。

您的问题提到了OpenMP(共享内存)和MPI(分布式内存消息传递),它们可以一起使用。 Go可以被认为大致相当于MPI,因为它促进了消息传递。但它也允许锁定和共享内存。 Go与MPI和OpenMP都不同,因为它没有明确涉及多处理器系统。要使用Go进入并行处理领域,需要一个网络消息传递框架,例如OpenCL,有人正在使用Go API。