質問

一部のデータ処理のために疎結合クラスターで作業しています。ネットワークコードと処理コードは整っていますが、私たちのアプローチではさまざまな方法論を評価しています。現時点では、当然のことながら、パフォーマンスの問題にI / Oがバインドされており、そのボトルネックを削減しようとしています。明らかに、Infinibandのような高速なスイッチは素晴らしいでしょうが、私たちが持っているものを捨てて新しい機器を手に入れるだけの贅沢を買う余裕はありません。

私の質問はこれです。クラスターで行われる従来の深刻なHPCアプリケーションはすべて、通常、メッセージの受け渡しとソケット経由の直接送信を使用して実装されます。これに対するパフォーマンス上の利点は何ですか?ソケットから切り替えた場合、スピードアップが見られるでしょうか?

役に立ちましたか?

解決

MPI MIGHTはソケットを使用します。しかし、直接分散共有メモリを使用するSAN(システムエリアネットワーク)で使用されるMPI実装もあります。もちろん、そのためのハードウェアを持っている場合。したがって、MPIを使用すると、将来このようなリソースを使用できます。その場合、大規模なパフォーマンスの改善を得ることができます(大学時代のクラスターでの私の経験では、数桁のゲインを達成できます)。したがって、ハイエンドクラスターに移植できるコードを作成する場合は、MPIを使用することをお勧めします。

パフォーマンスの問題を破棄する場合でも、MPIを使用すると時間を大幅に節約でき、システムの他の部分のパフォーマンスを改善したり、単に健全性を維持したりできます。

他のヒント

あなたがそのようなことを非常に得意でない限り、私はあなた自身を転がす代わりにMPIを使用することをお勧めします。独自のプロトコルを使用していくつかの分散コンピューティング風のアプリケーションを書いたので、私は常に自分自身がMPI内にある機能を再現する(および再現性が低い)ことに気付きます。

パフォーマンスに関しては、MPIが具体的なネットワークの高速化をもたらすとは期待していません-それはあなたと同じようにソケットを使用します。ただし、MPIは、多くのノードを管理するために必要な多くの機能、つまりノード間の同期を提供します。

この場合、高性能クラスターであっても、パフォーマンスだけが考慮されるわけではありません。 MPIは標準のAPIを提供し、「ポータブル」です。 MPIの異なるバージョン間でアプリケーションを切り替えることは比較的簡単です。

ほとんどのMPI実装は、TCPベースの通信にソケットを使用します。ソケットを直接使用する自家製のアプリケーションよりも、MPIの実装が最適化され、メッセージの受け渡しが速くなる可能性が高いです。

さらに、InfiniBandがあるクラスターでコードを実行する機会が得られた場合、MPIレイヤーはこれらのコードの変更を抽象化します。これは些細な利点ではありません-OFED(または別のIB動詞)実装を直接使用するようにアプリケーションをコーディングすることは非常に困難です。

ほとんどのMPIアプリケーションには、アプリケーションとは無関係にネットワーク設定の正確性を検証するために使用できる小さなテストアプリが含まれています。これは、アプリケーションをデバッグするときの大きな利点です。 MPI標準には、「pMPI」が含まれています。インターフェイス、MPI呼び出しのプロファイリング用。また、このインターフェイスを使用すると、すべてのメッセージパッシングルーチンにチェックサムなどのデータ検証を簡単に追加できます。

MPIには、集団通信を行えるという利点があります。 O(log p)でブロードキャスト/リダクションを行う/ * pはO(p)ではなくプロセッサの数です* /は大きな利点です。

OldManとfreespaceに同意する必要があります。 MPIに対する有用なメトリック(パフォーマンス、保守性など)の具体的な改善点を知っていない限り、なぜ車輪を再発明するのか。 MPIは、解決しようとしている問題に関する多くの共有知識を表します。

データを送信するだけでなく、対処する必要がある膨大な数の問題があります。接続のセットアップとメンテナンスはすべてあなたの責任となります。必要なMPIが正確に抽象化されている場合(そのように聞こえます)、それを使用します。

少なくとも、MPIを使用し、後で独自のシステムでリファクタリングすることは、MPIのインストールと依存関係を犠牲にする良いアプローチです。

MPIが単純なソケット通信をはるかに超えて提供するというOldManのポイントが特に気に入っています。透過的な抽象化により、多数の並列および分散コンピューティングの実装を実現します。

メッセージの受け渡しはテクノロジーではなくパラダイムです。最も一般的なインストールでは、MPIは通信にソケットを使用します。 MPIに切り替えると速度が向上しますが、ソケット通信を最適化していない場合に限ります。

アプリケーションのI / Oはどのようにバインドされますか?データブロックを作業ノードに転送することにバインドされていますか、それとも計算中の通信のためにバインドされていますか?

回答が「通信のため」である場合問題は、密結合アプリケーションを作成し、疎結合タスク用に設計されたクラスターで実行しようとしていることです。パフォーマンスを向上させる唯一の方法は、より優れたハードウェア(より高速なスイッチ、インフィニバンドなど)を入手することです...他の誰かのHPCに時間をかけることができますか?

答えが「データブロック」の場合転送は、ワーカーに複数のデータブロックを割り当てることを検討します(したがって、より長くビジー状態を維持します)&転送前にデータブロックを圧縮します。これは、疎結合アプリケーションで役立つ戦略です。

MPIは使用していませんが、ソケットはかなり使用しています。高性能ソケットについて考慮すべきことがいくつかあります。多くの小さなパケットを処理していますか、それとも大きなパケットを処理していますか?多数の小さなパケットを実行している場合は、応答を速くするためにNagleアルゴリズムをオフにすることを検討してください。

setsockopt(m_socket、IPPROTO_TCP、TCP_NODELAY、...);

また、大量のデータを取得しようとすると、実際には信号の使用が非常に遅くなる可能性があります。ずっと前に、リーダーが信号を待ってパケットを読み取るテストプログラムを作成しました。これは、毎秒100パケットを取得します。その後、読み取りをブロックし、1秒あたり10000回の読み取りを取得しました。

ポイントは、これらすべてのオプションを見て、実際にテストすることです。条件が異なると、異なる手法がより速く/遅くなります。意見を得るだけでなく、それらをテストすることが重要です。スティーブマグワイアは、「Writing Solid Code」でこれについて語っています。彼は直感に反する多くの例を使用し、それらをテストして、コードの改善/高速化を確認します。

MPIは下のソケットを使用するため、実際にコードがインターフェイスするAPIのみが違います。ソケットを直接使用している場合は、プロトコルを微調整できますが、それはそれです。データを使用して正確に何をしていますか?

MPIはソケットを使用します。何をしているのかわかっている場合は、多くのメタデータを送信する必要がないため、ソケットからより多くの帯域幅を取得できます。

しかし、あなたは自分が何をしているのかを知る必要があり、エラーが発生しやすくなります。基本的に、mpiを独自のメッセージングプロトコルに置き換えます。

大量かつ低オーバーヘッドのビジネスメッセージングの場合は、チェックアウトすることをお勧めします OAMQ といくつかの製品。オープンソースの亜種 OpenAMQ はJP Morganで取引を実行しているため、信頼できるはずです。

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