Javaで物理シミュレーションを実行するためのLinuxクラスターを作成する方法は?

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

質問

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

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

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

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

オプション番号2は比較的簡単に実装できるため、これを実装する方法についての提案はあまり探しません(特定のポートでパラメーターを待機し、値を処理し、結果をシリアル化されたファイルとして返します)。これは、 Grid Computing の良い例です。

しかし、最後のオプションである従来のクラスターの可能性は疑問です。 LinuxグリッドでJavaプログラムを実行するのはどれくらい難しいですか?個別のコンピューターはすべて、複数のコアを持つ単一のコンピューターとして扱われ、プログラムを簡単に適合させることができますか?始めるのに役立つリソースへの良いポインタはありますか?または、これを過度に複雑にして、オプション番号2の方が良いですか?

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

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


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

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

役に立ちましたか?

解決

計算はすでに独立しているため、特にJava並列処理フレームワークを強くお勧めします。私はこの学部生と少し仕事をしましたが、とてもうまくいきました。実装を行う作業は既に完了しているため、「数値2」の目標を達成するための良い方法だと思います

http://www.jppf.org/

他のヒント

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

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

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

Hazelcast 、Java用の最も単純なpeer2peer(集中型サーバーなし)クラスタリングソリューションをご覧ください。 Hazelcast Distributed ExecutorServiceを試して、クラスターでコードを実行してください。

よろしく、

-talip

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

欠点:javaではなくC / C ++になります

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

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

テラコッタを見ましたか?

仕事の分配には、 Master / Workerフレームワーク

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

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

ただし、行列計算を行う場合は、Javaではなくネイティブコードで行います(Javaプリミティブを使用している場合)。特に、キャッシュミスは非常にコストがかかるため、アレイをインターリーブするとパフォーマンスが低下します。マトリックスとネイティブコード内のメモリのインターリーブされていないチャンクにより、ハードウェアを追加せずに速度を最大限に高めることができます。

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