Parallel processing go是使用共享内存还是分布式计算

Parallel processing go是使用共享内存还是分布式计算,parallel-processing,go,shared-memory,distributed-computing,Parallel Processing,Go,Shared Memory,Distributed Computing,围棋的口号是“不要通过分享记忆来交流,而是通过交流来分享记忆”。我想知道Go是使用共享内存还是分布式计算方法。例如,对于MPI,它是明确分布的,OpenMP是明确共享的内存;但我不确定围棋,它是独一无二的 我看过很多帖子,比如,有效的围棋文件等,但无法澄清。提前谢谢 Go不会阻止您在goroutine/线程之间共享内存。他们所说的通信是指通过一个通道发送一个数据块或指向该数据块的指针。这有效地将数据的“所有权”转移到通道的目标读取器。请注意,这种所有权转移不是由语言或运行时强制执行的,而是由约定

围棋的口号是“不要通过分享记忆来交流,而是通过交流来分享记忆”。我想知道Go是使用共享内存还是分布式计算方法。例如,对于MPI,它是明确分布的,OpenMP是明确共享的内存;但我不确定围棋,它是独一无二的


我看过很多帖子,比如,有效的围棋文件等,但无法澄清。提前谢谢

Go不会阻止您在goroutine/线程之间共享内存。他们所说的通信是指通过一个通道发送一个数据块或指向该数据块的指针。这有效地将数据的“所有权”转移到通道的目标读取器。请注意,这种所有权转移不是由语言或运行时强制执行的,而是由约定执行的

如果您愿意的话,您仍然完全能够从两个goroutine写入相同的内存。换句话说:围棋并不能阻止你射中自己的脚,它只是提供了语言语义,使这些错误更容易被发现

如果一个值被传递到一个通道中,那么程序员必须假设该值不再是他在同一个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
}
func F(c chan*T){
//创建/加载一些数据。
数据:=getSomeData()
//将数据发送到通道中。

这个问题假设共享内存和分布式计算是对立的。这有点像问:RAM和LAN是对立的吗?区分CPU/内存节点内的共享内存并发和CPU/内存节点之间的共享内存并发会更清楚

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

  • 开发非冯·诺依曼计算机,多个CPU共享一个内存,通过某种形式的交换结构(通常是Clos网络)连接。OpenMP非常适合这些

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

第一种情况是专门针对高性能计算行业的。我们大多数人都熟悉后一种情况。在这种情况下,现在的通信通常只是通过以太网,但已经(成功)为某些领域开发了各种更快、更低延迟的替代方案(例如,从Transputer串行链接中出现)

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

对于我们其他人来说,Go遵循Erlang、Limbo,当然还有Occam,促进信息的传递,作为编排工作的手段。这源于代数,它为创建任何规模的并行系统提供了基础。CSP设计是可组合的:每个子系统本身都可以是la的一个组件rger系统,无理论限制


您的问题提到了OpenMP(共享内存)和MPI(分布式内存消息传递),可以一起使用。Go可以被认为是MPI的近似等效物,因为它促进了消息传递。但它也允许锁和共享内存。Go与MPI和OpenMP不同,因为它不明确涉及多处理器系统。要使用Go进入并行处理世界,需要一个网络消息传递框架,例如,有人正在为其开发Go API。

如果我理解正确,ITYM“不会阻止你自食其果”。)回答得很好。过去两周我一直在学习Go,包括golang.org网站,观看Google talks,不幸的是,这个简单但关键的概念一开始并不明显。谢谢!从Go 1.1开始,测试可以使用
-race
标志运行。这将调用Go的种族检测系统,该系统将为y发现此类问题ou并向您报告。这不是100%准确。可能会出现一些误报和误报,但总体而言,这是一种在您的代码中发现竞争条件的好方法,因为程序员没有充分遵守通信约定。