use*_*260 6 parallel-processing distributed-computing shared-memory go
Go的口号是"不要通过共享内存进行通信;而是通过通信共享内存".我想知道Go是使用共享内存还是分布式计算方法.例如,对于MPI来说,它是明确分布式的,OpenMP显然是共享内存; 但我不确定Go,这是独一无二的.
我见过很多帖子,比如共享内存与Go频道的通信,有效的Go文档等,但无法澄清.提前致谢.
jim*_*imt 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
}
Run Code Online (Sandbox Code Playgroud)
这个问题假设共享内存和分布式计算是对立的。这有点像问:RAM 和 LAN 是对立的吗?区分 CPU/内存节点内的共享内存并发和 CPU/内存节点之间的共享内存并发会更清楚。
这是并行处理研究大局的一部分。已经有许多研究项目,包括:
开发具有多个 CPU 共享单个内存的非冯诺依曼计算机,并通过某种形式的交换结构(通常是 Clos 网络)加入。OpenMP 非常适合这些。
开发由一组 CPU 组成的并行计算机,每个 CPU 都有自己独立的内存,并且节点之间有一些通信结构。这通常是 MPI 等的所在地。
第一个案例专门针对高性能计算兄弟会。我们大多数人都熟悉后一种情况。在这种情况下,现在通常只是通过以太网进行通信,但是已经(成功地)为某些细分市场开发了各种更快的低延迟替代方案(例如IEEE1355 SpaceWire,它来自 Transputer 串行链路)。
多年来,主流观点认为只有共享内存才能实现高效的并行性,因为通过传递消息进行通信的成本被(天真地)认为是过高的。对于共享内存并发,困难在于软件:因为一切都是相互依赖的,随着系统变得越来越大,设计并发变得越来越难。需要硬核专业知识。
对于我们其他人来说,Go 遵循 Erlang、Limbo 和 Occam,将消息传递作为编排要完成的工作的手段。这源于通信顺序过程的代数,它为创建任何规模的并行系统提供了基础。CSP 设计是可组合的:每个子系统本身都可以是更大系统的一个组件,没有理论限制。
你的问题提到了OpenMP(共享内存)和MPI(分布式内存消息传递),可以一起使用。Go 可以被认为大致相当于 MPI,因为它促进了消息传递。然而,它也允许锁和共享内存。Go 不同于 MPI 和 OpenMP,因为它没有明确关注多处理器系统。要进入使用 Go 进行并行处理的世界,需要一个网络消息传递框架,例如OpenCL,有人正在为此开发 Go API。