为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

Go
慕慕森 2021-05-20 16:18:02
Go的标语是“不要通过共享内存进行通信;而是通过通信来共享内存”。我想知道Go是使用共享内存还是分布式计算方法。例如,对于MPI来说,它显然是分布式的,而OpenMP则是显然是共享内存的;但是我不确定Go的独特性。我已经看到很多帖子,例如Shared memory vs. Go频道通信,有效的Go文档等,但无法澄清。提前致谢。
查看完整描述

2 回答

?
智慧大石

TA贡献1946条经验 获得超3个赞

Go不会阻止您在goroutine /线程之间共享内存。它们的含义是,您通过通道发送数据块或指向该数据块的指针。这有效地将数据的“所有权”转移到通道的目标读取器。请注意,所有权的转移不是由语言或运行时强制执行的,只是按照惯例。


如果您愿意的话,您仍然可以从两个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

}


查看完整回答
反对 回复 2021-05-24
?
呼啦一阵风

TA贡献1802条经验 获得超6个赞

该问题假定共享内存和分布式计算是相反的。有点像在问:RAM和LAN是否相反?区分CPU /内存节点内的共享内存并发与CPU /内存节点之间的共享内存并发会更加清晰。

这是并行处理研究的整体内容的一部分。有许多研究项目,包括:

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

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

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

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

对于我们其他人,Go跟随Erlang,Limbo,当然还有Occam来促进消息传递,以作为编排要完成的工作的手段。这源于通信顺序过程的代数,它为创建任何规模的并行系统提供了基础。CSP设计是可组合的:每个子系统本身都可以是更大系统的组成部分,而没有理论上的限制。

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


查看完整回答
反对 回复 2021-05-24
  • 2 回答
  • 0 关注
  • 288 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信