両方がメッセージを渡す場合、MPIは共有メモリよりも難しいと見なされ、Erlangはより簡単と見なされるのはなぜですか?

StackOverflow https://stackoverflow.com/questions/185444

質問

最近、Erlangはマルチコアで並列プログラムを作成するための言語として多くの関心を集めています。 Erlangのメッセージパッシングモデルは、スレッドなどの主要な共有メモリモデルよりもプログラムが簡単であると人々が主張するのを聞いたことがあります。

逆に、高性能コンピューティングコミュニティでは、支配的な並列プログラミングモデルはMPIであり、これはメッセージパッシングモデルも実装しています。しかし、HPCの世界では、このメッセージ受け渡しモデルは一般にプログラミングが非常に難しいと考えられており、人々はOpenMPやUPCなどの共有メモリモデルをプログラミングする方が簡単だと主張しています。

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

役に立ちましたか?

解決

これまでのすべての答えに同意しますが、完全に明らかにされていない重要な点は、MPIが難しいと見なされ、Erlangが簡単である理由の1つは、モデルとドメインの一致であると思います。

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

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

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

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

他のヒント

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

まず、Erlangのメッセージの受け渡しは一流の言語機能であるため、構文糖衣により簡単に感じられます。

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

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

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

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

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

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

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

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

議論を続けることはできますが、一般的な見方は、メッセージパッシングの構造が実際に使用しているプログラミング言語とパラダイムに組み込まれている場合、通常、それは他の何かに比べてソリューションを表現するためのより良い手段です「タックオン」または、言語のアドオンとして(ライブラリまたは拡張機能の形式で)存在します。

  

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

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

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

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

最後に、これらの技術的な違いに加えて、政治的な問題もあります。 Erlangの連中は、Erlangがマルチコアに関連していない場合に関連しているふりをして、マルチコアの誇大広告に乗ろうとしています。特に、優れた拡張性を誇示しているため、絶対的なパフォーマンスも考慮することが不可欠です。 Erlangは、1つのコアでの低い絶対パフォーマンスから、任意の数のコアでの低い絶対パフォーマンスに簡単にスケーリングできます。ご想像のとおり、これはHPCコミュニティを感動させるものではありません(ただし、多くの大量の並行コードには適しています)。

MPIとOpenMP / UPCの比較:MPIでは、問題を小さな断片に切り分けて、データの移動に責任を負わせます。 「すべてのデータが存在する」というOpenMP / UPCでは、ポインターを逆参照するだけです。 MPIの利点は、32-512 CPUクラスターが32-512 CPUシングルマシンよりもはるかに安価であることです。また、MPIでは、アルゴリズムを設計する際の費用は前払いです。 OpenMP / UPCは、システムがNUMAを使用している場合(およびすべての大きなシステムが使用している場合)、実行時に得られるレイテンシーを隠すことができます。

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

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

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top