物理シミュレーションの実行に使用される科学アプリケーションを開発しています。使用されるアルゴリズムは 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 アプリケーションを作成する最善の方法は何ですか?