6

物理シミュレーションの実行に使用される科学アプリケーションを開発しています。使用されるアルゴリズムは O(n3) であるため、大量のデータ セットの処理には非常に長い時間がかかります。アプリケーションは約 17 分でシミュレーションを実行し、約 25,000 回のシミュレーションを実行する必要があります。つまり、処理時間は約 1 年です。

幸いなことに、シミュレーションは互いに完全に独立しているため、プログラムを簡単に変更して、複数のコンピューターに作業を分散させることができます。

これを実装するために私が見ることができる複数のソリューションがあります:

  • マルチコア コンピューターを入手し、すべてのコアに作業を分散します。私がする必要があることには十分ではありません。
  • 複数の「処理」サーバーに接続し、それらの間で負荷を分散するアプリケーションを作成します。
  • 安価な Linux コンピューターのクラスターを入手し、プログラムにすべてを 1 つのエンティティとして扱わせます。

オプション番号 2 は実装が比較的簡単なので、これを実装する方法についての提案はあまり探しません (特定のポートでパラメーターを待機し、値を処理して結果を返すプログラムを作成するだけで実行できます)。シリアル化されたファイルとして)。これは、グリッド コンピューティングの良い例です。

ただし、最後のオプションである従来のクラスターの可能性については疑問に思っています。Linux グリッドで Java プログラムを実行するのはどれくらい難しいですか? すべての個別のコンピューターは、複数のコアを備えた単一のコンピューターとして扱われ、プログラムの適応が容易になりますか? 始めるのに役立つリソースへの適切なポインタはありますか? または、これを複雑にしすぎて、オプション番号 2 を使用したほうがよいでしょうか?

編集: 追加情報として、Wired Magazine のこの記事で説明されているようなものを実装する方法に興味があります: Scientific は、スーパーコンピューターを Playstation 3 Linux クラスターに置き換えました。間違いなくナンバー2は行くべき道のように聞こえます...しかし、涼しさの要素です.

編集 2: 計算は非常に CPU バウンドです。基本的に、逆数や乗算など、大きな行列には多くの演算があります。これらの操作のより良いアルゴリズムを探してみましたが、これまでのところ、必要な操作は 0(n3) であることがわかりました (通常利用可能なライブラリ内)。(このような操作の場合) データ セットは大きいですが、入力パラメーターに基づいてクライアント上で作成されます。


Linux でのコンピューター クラスターの仕組みについて誤解していたことがわかりました。複数のコアを備えたコンピューターを持っているかのように、すべてのコンピューターですべてのプロセッサが利用可能であるように見えるように動作すると仮定しましたが、そうではないようです。これらのスーパーコンピューターはすべて、中央エンティティによって分散されたタスクを実行するノードを持つことで機能し、この分散を簡単に実行できるいくつかの異なるライブラリとソフトウェア パッケージがあるようです。

3 番のようなものはないので、質問は次のようになります。クラスター化された Java アプリケーションを作成する最善の方法は何ですか?

4

8 に答える 8

5

特に計算がすでに独立しているため、Java Parallel Processing Framework を強くお勧めします。私はこの学部生とかなりの仕事をしましたが、とてもうまくいっています。実装の作業はすでに完了しているため、これは「2 番目」の目標を達成するための良い方法だと思います。

http://www.jppf.org/

于 2008-12-02T11:03:44.003 に答える
3

3番は難しくありません。クライアントとスーパーバイザーという 2 つの異なるアプリケーションを開発する必要があります。クライアントは、シミュレーションを実行するアプリケーションです。ただし、TCP/IP などを使用してスーパーバイザに接続し、一連のシミュレーション パラメータを要求するように変更する必要があります。次に、シミュレーションを実行し、結果をスーパーバイザーに送り返します。スーパーバイザーは、クライアントからの要求をリッスンし、要求ごとに、データベースから未割り当てのシミュレーションを取得し、データベースを更新して、アイテムが割り当てられているが未完成であることを示します。シミュレーションが終了すると、スーパーバイザはデータベースを結果で更新します。スーパーバイザーが実際のデータベース (MySql など) にデータを格納している場合、データベースはシミュレーションの現在の状態を簡単に照会できます。

于 2008-12-02T11:29:53.577 に答える
2

Java 向けの最も単純な peer2peer (中央サーバーなし) クラスタリング ソリューションである Hazelcast確認してください。クラスターでコードを実行するには、Hazelcast Distributed ExecutorService を試してください。

よろしく、

-タリップ

于 2009-05-15T06:09:53.167 に答える
2

Linux クラスターでコンピューティングを分散する最も簡単な方法は、MPI を使用することです。MPICH2 をダウンロードして確認することをお勧めします。それは無料です。 彼らのホームページはこちら

シミュレーションが完全に独立している場合、MPI のほとんどの機能は必要ありません。MPI と連携してスクリプトまたは Java プログラムの実行を開始するには、数行の C を記述する必要がある場合があります。

于 2008-12-05T20:49:29.857 に答える
1

アルゴリズムはどの程度最適化されていますか?ネイティブBLASライブラリを使用していますか?ナイーブなライブラリから最適化されたライブラリに切り替えることで、パフォーマンスを約1桁向上させることができます。ATLASのように、システム上の複数のCPUに計算を自動的に分散するものもあるため、箇条書き1を自動的にカバーします。

AFAIKクラスターは通常、単一のエンティティとして扱われません。これらは通常、個別のノードとして扱われ、MPIやSCALAPACKなどでプログラムされて、行列の要素を複数のノードに分散します。とにかくデータセットが1つのノードのメモリに収まる場合、これはそれほど役に立ちません。

于 2008-12-02T15:32:27.613 に答える
1

あなたはすでにそれを提案しましたが、失格にしました: マルチコア。十分なコアがあれば、マルチコアに行くことができます。ホットなトピックの 1 つは GPGPU コンピューティングです。特に。NVIDIA の CUDA は、同じ計算を実行する必要がある独立したタスクが多数ある場合、非常に重要なアプローチです。GTX 280 は 280 コアを提供し、最大 1120 ~ 15360 スレッドを同時に計算できます。それらのペアで問題を解決できます。すべてのスカラー プロセッサは SIMD 方式で動作するため、実際に実装できるかどうかはアルゴリズム (データ フローと制御フロー) に依存します。

欠点: Java ではなく、C/C++ になります。

于 2008-12-02T11:59:44.763 に答える
1

テラコッタを見たことがありますか?

作業の分散には、 Master/Worker フレームワークを使用する必要があります。

于 2009-01-27T07:44:58.963 に答える
1

10 年前、私が働いていた会社は同様の仮想化ソリューションを検討しました。当時、Sun、Digital、および HP はすべてそれをサポートしていましたが、ハードウェアのホットスワップなどを備えた最先端のスーパーコンピューターのみでした。それ以来、解決策 3 で探している種類の仮想化を Linux がサポートしていると聞きましたが、私自身は使用したことがありません。

Java プリミティブとパフォーマンス

ただし、行列計算を行う場合は、Java ではなくネイティブ コードで実行する必要があります (Java プリミティブを使用していると仮定します)。特にキャッシュ ミスは非常にコストがかかり、配列内でインターリーブするとパフォーマンスが低下します。マトリックスとネイティブ コード内のインターリーブされていないメモリのチャンクにより、ハードウェアを追加しなくても、ほとんどの速度が向上します。

于 2009-06-15T17:33:26.703 に答える