33

最近、マルチコアで並列プログラムを作成するための言語として、Erlang に多くの関心が寄せられています。Erlang のメッセージ パッシング モデルは、スレッドなどの主要な共有メモリ モデルよりもプログラミングが容易であるという意見を聞いたことがあります。

逆に、ハイ パフォーマンス コンピューティング コミュニティでは、主流の並列プログラミング モデルは MPI であり、メッセージ パッシング モデルも実装されています。しかし、HPC の世界では、このメッセージ パッシング モデルは一般にプログラミングが非常に難しいと考えられており、OpenMP や UPC などの共有メモリ モデルの方がプログラミングが容易であると主張する人もいます。

IT および HPC の世界で、メッセージ パッシングと共有メモリの認識にこのような違いがある理由を知っている人はいますか? Erlang と MPI のメッセージ パッシングの実装方法に根本的な違いがあり、Erlang スタイルのメッセージ パッシングが MPI よりもはるかに簡単になったためでしょうか? それとも他に何か理由があるのでしょうか?

4

7 に答える 7

39

私は以前のすべての回答に同意しますが、完全に明確にされていない重要なポイントは、MPI が難しく、Erlang が簡単であると見なされる理由の 1 つは、モデルとドメインの一致であるということだと思います。

Erlang は、ローカル メモリ、非同期メッセージ パッシング、および共有状態の概念に基づいており、すべてのスレッドがアクセスできる何らかの形式のグローバル データベースを使用して解決されます。これは、大量のデータを移動しないアプリケーション向けに設計されており、調整が必要な 100k の個別のノードに爆発することは想定されていません。

MPI は、ローカル メモリとメッセージ パッシングに基づいており、データの移動がドメインの重要な部分である問題を対象としています。ハイ パフォーマンス コンピューティングとは、問題のためにデータセットを取得し、それを多数のコンピューティング リソースに分割することです。データは分散を念頭に置いて明示的に分散する必要があるため、メッセージ パッシング システムではかなりの労力を要します。基本的に、MPI は、共有メモリがスケーリングしないことをしぶしぶ認めるものと見なすことができます。また、10 万以上のプロセッサにまたがる高性能計算をターゲットにしています。

Erlang は可能な限り最高のパフォーマンスを達成しようとしているのではなく、自然に並列化された問題を自然なスレッドに分解しようとしています。MPI とはまったく異なる種類のプログラミング タスクを念頭に置いて設計されています。

したがって、Erlang は、非常に異なる (そしてある程度本質的に困難な) 問題セットを実際に対象とする MPI よりも、pthread やその他のかなりローカルな異種スレッド ソリューションと比較するのが最適です。

于 2008-11-01T21:13:56.457 に答える
13

Erlang での並列処理は、まだ実装するのがかなり難しいです。つまり、問題を分割する方法を理解する必要がありますが、C または C++ の MPI ライブラリと比較すると、この困難を緩和するいくつかの小さなことがあります。

第一に、Erlang のメッセージ パッシングは第一級の言語機能であるため、シンタックス シュガーによって簡単に感じられます。

また、Erlang ライブラリはすべて、Erlang のメッセージ パッシングを中心に構築されています。このサポート構造は、並列処理の土地へのブーストを提供するのに役立ちます。gen_server、gen_fsm、gen_event などの OTP のコンポーネントを見てみましょう。これらは、プログラムを並列化するのに役立つ非常に使いやすい構造です。

erlang のメッセージ パッシングを他の MPI 実装と区別するのは、言語自体の特定の機能ではなく、使用可能な標準ライブラリの堅牢性だと思います。

于 2008-10-09T03:20:01.027 に答える
10

通常、HPCでの同時実行とは、大量のデータを処理することを意味します。この種の並列処理はデータ並列処理と呼ばれ、OpenMPのような共有メモリアプローチを使用して実装する方が実際に簡単です。これは、オペレーティングシステムがタスクのスケジューリングや配置などを処理するためです。これは、メッセージパッシングパラダイムを使用する場合に自分で実装する必要があります。 。

対照的に、Erlangは、電話システムで発生するタスクの並列処理に対処するように設計されています。電話システムでは、限られた量の通信とフォールトトレランスとリカバリの強力な要件だけで、さまざまなコードを同時に実行する必要があります。

このモデルは、ほとんどの人がPThreadsを使用するモデルに似ています。これは、各リクエストを異なるスレッドで処理できるWebサーバーなどのアプリケーションに適合しますが、HPCアプリケーションは、ワーカー間で交換する必要のある大量のデータに対してほぼ同じことを行います。

于 2011-12-07T15:57:18.887 に答える
9

これは、MPI でプログラミングしている場合と、Erlang でプログラミングしている場合の考え方に関係があると思います。たとえば、MPI は言語に組み込まれていませんが、Erlang にはメッセージ パッシングのサポートが組み込まれています。もう 1 つの考えられる理由は、単にメッセージを送受信することと、ソリューションを同時実行単位に分割することの間の断絶です。

Erlang では、データが実際に関数呼び出しから関数呼び出しへと移動する関数型プログラミング フレームで考える必要があります。受信は、言語の通常の構造のように見える能動的な行為です。これにより、実際に実行している計算とメッセージを送受信する行為との間のより密接な関係が得られます。

一方、MPI を使用すると、実際のメッセージの受け渡しについてのみ考える必要があり、実際には作業の分解については考える必要がありません。この考え方では、ソリューションの記述とコード内のメッセージング インフラストラクチャとの間で、多少のコンテキストの切り替えが必要になります。

議論は続くかもしれませんが、一般的な見方は、メッセージ パッシングの構成要素が実際に使用しているプログラミング言語とパラダイムに組み込まれている場合、通常、それは「追加された他のものと比較して、解決策を表現するためのより良い手段である」というものです。 " または、言語へのアドオンとして (ライブラリまたは拡張機能の形で) 存在します。

于 2008-11-01T20:21:14.253 に答える
5

IT および HPC の世界でメッセージ パッシングと共有メモリの認識にこのような違いがある理由を知っている人はいますか? Erlang と MPI のメッセージ パッシングの実装方法に根本的な違いがあり、Erlang スタイルのメッセージ パッシングが MPI よりもはるかに簡単になったためでしょうか? それとも他に何か理由があるのでしょうか?

その理由は、単純に並列処理と並行処理です。Erlang は並行プログラミング用に作られています。HPC は並列プログラミングがすべてです。これらは関連していますが、異なる目的です。

並行プログラミングは、非常に非決定論的な制御フローによって非常に複雑になり、多くの場合、レイテンシーが重要な目標になります。Erlang の不変データ構造の使用により、並行プログラミングが大幅に簡素化されます。

並列プログラミングの制御フローははるかに単純であり、目的は最大の総スループットであり、待ち時間ではありません。ここでは効率的なキャッシュの使用がはるかに重要であり、Erlang と不変のデータ構造の両方がほとんど不適切になります。このコンテキストでは、共有メモリの変更は扱いやすく、大幅に優れています。実際には、キャッシュ コヒーレンスによって、ハードウェア アクセラレーションによるメッセージ パッシングが提供されます。

最後に、これらの技術的な違いに加えて、政治的な問題もあります。Erlang の連中は、Erlang がマルチコアに関連していないのに関連があるふりをすることで、マルチコアの誇大宣伝に乗ろうとしています。特にスケーラビリティの高さをアピールしているため、絶対的なパフォーマンスも考慮する必要があります。Erlang は、1 つのコアでの絶対的なパフォーマンスの低さから、任意の数のコアでの絶対的なパフォーマンスの低さまで、楽にスケーリングできます。ご想像のとおり、これは HPC コミュニティに感銘を与えるものではありません (ただし、大量の並列コードには十分です)。

于 2010-12-27T01:13:12.567 に答える
1

この記事は実際にそれをうまく説明しています。Erlangは小さなデータを周囲に送信する場合に最適であり、MPIはより複雑なものではるかに優れています。また、Erlangモデルは理解しやすいです:-)

ErlangとMPI-最終結果とソースコード

于 2012-06-19T10:39:04.937 に答える
1

MPI と OpenMP/UPC について: MPI では、問題を細かく分割し、データを移動する責任を負う必要があります。OpenMP/UPC では、「すべてのデータがそこにある」ため、ポインターを逆参照するだけで済みます。MPI の利点は、32-512 CPU クラスターが 32-512 CPU 単一マシンよりもはるかに安価であることです。また、MPI を使用すると、アルゴリズムを設計するときにコストがかかります。OpenMP/UPC は、システムが NUMA を使用している場合 (およびすべての大きなシステムが使用している場合)、実行時に発生するレイテンシを隠すことができます。プログラムはスケーリングされず、理由を理解するのに時間がかかります。

于 2008-10-09T00:19:28.097 に答える