7

Go has the slogan "Do not communicate by sharing memory; instead, share memory by communicating". I was wondering whether Go uses shared memory or distributed computing approach. For example, for MPI it is clearly distributed, OpenMP is clearly shared memory; but I was not sure about Go, which is unique.

I have seen many posts, such as Shared memory vs. Go channel communication, effective Go document etc., but could not clarify. Thanks in advance.

4

2 に答える 2

15

Go は、ゴルーチン/スレッド間でメモリを共有することを妨げません。通信とは、チャネルを介してデータのチャンク、またはチャンクへのポインターを送信することを意味します。これにより、データの「所有権」がチャネルのターゲット リーダーに効果的に転送されます。この所有権の譲渡は、言語やランタイムによって強制されるのではなく、慣習によるものです。

必要に応じて、2 つのゴルーチンから同じメモリに完全に書き込むことができます。言い換えれば、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
}
于 2012-12-15T22:30:56.517 に答える
5

この質問は、共有メモリと分散コンピューティングが正反対であることを前提としています。それは、「RAM と LAN は正反対ですか?」と尋ねるようなものです。CPU/メモリ ノード内の共有メモリの同時実行と、CPU/メモリ ノード間の共有メモリの同時実行を区別する方が明確です。

これは、並列処理研究の全体像の一部です。以下を含む多くの研究プロジェクトがありました。

  • 複数の CPU が 1 つのメモリを共有し、何らかの形式のスイッチング ファブリック (多くの場合 Clos ネットワーク) によって結合された、非フォン ノイマン コンピュータの開発。これらには OpenMP が適しています。

  • それぞれが独自のメモリを持ち、ノード間の通信ファブリックを持つ CPU の集合で構成される並列コンピュータの開発。これは通常、特に MPI のホームです。

最初のケースは、ハイ パフォーマンス コンピューティングの友愛に特化しています。私たちのほとんどによく知られているのは後者のケースです。この場合、通常、最近の通信は単にイーサネット経由ですが、特定のニッチ向けにさまざまな高速で低遅延の代替手段が (成功して) 開発されています (たとえば、Transputer シリアル リンクから出現したIEEE1355 SpaceWire )。

何年もの間、効率的な並列処理はメモリが共有されている場合にのみ可能であるという見方が支配的でした。これは、メッセージを渡すことによる通信のコストが (素朴に) 法外に高いと想定されていたためです。共有メモリの同時実行では、問題はソフトウェアにあります。すべてが相互に依存しているため、システムが大きくなるにつれて、同時実行の設計は組み合わせ的にますます難しくなります。筋金入りの専門知識が必要です。

それ以外の私たちにとって、Go は、Erlang、Limbo、そしてもちろん Occam に続き、行われる作業を振り分ける手段としてメッセージの受け渡しを推進しています。これは、任意のサイズの並列システムを作成するための基礎を提供する、Communicating Sequential Processesの代数から生じます。CSP 設計は構成可能です。各サブシステム自体が、理論上の制限なしに、より大きなシステムのコンポーネントになることができます。

あなたの質問は、一緒に使用できる OpenMP (共有メモリ) と MPI (分散メモリ メッセージ パッシング) に言及していました。Go は、メッセージ パッシングを促進するという点で、MPI とほぼ同等であると見なすことができます。ただし、ロックと共有メモリも許可されます。Go は、マルチプロセッサ システムに明示的に関与していないため、MPI や OpenMP とは異なります。Go を使用して並列処理の世界に進むには、誰かが Go API に取り組んでいるOpenCLなどのネットワーク メッセージ パッシング フレームワークが必要です。

于 2012-12-16T13:52:28.677 に答える