2009-03-14 4 views
0

最新のコンピュータには、ますますコアが増えています。これらのコアを使用するために現在の線形アルゴリズムを変更したいと考えています。Javaでマルチコアのアルゴリズムを実装するにはどうしたらいいですか?

異なるスレッドを使用するアルゴリズムを分割すると、空きプロセッサがある場合のみ意味があります。

空きプロセッサがある場合、いくつかの手順を並列化するのに役立つライブラリがありますか?

いくつかの例を挙げます。

  • プロセッサが1つだけの場合は、複数のスレッドを作成する意味がありません。それは速度を低下させるでしょう。
  • コアデュオ上で2つのプロセス(サーバー上の要求)が実行されている場合、スレッドを開始することも意味がありません。
  • コアデュオに1つのプロセスしかないのであれば意味があります。

抽象アルゴリズムは、4つのステップA、B、CおよびDを有する。ステップA、BおよびCは、並列に実行することができる。ステップDは、A、BおよびCからの結果を必要とする。

編集:Iは数学的アルゴリズムを意味する。 IOなし、イベントなしなど

+0

A、BまたはCの内側に発揮することができる、非常に高レベルの図です。だから私はあなたの例があまり良くないと思っています。 – krosenvold

答えて

4

これは必ずしも真実ではありません。

アルゴリズムによっては、使用できるコアが1つだけであっても、複数のスレッドに分割することがよくあります。待っているソケットやIOなどがあれば、これで利益を得ることができます。 2つのプロセスがある場合、「他の」プロセスは他のコアの100%を使用していない可能性があります。この場合、OSを信頼して正しく処理してください。

Runtime.availableProcessors()でプロセッサ数をチェックして、スレッドを別々のスレッドに分割する方法を決めることができます。また、スレッドプールを使用することもできます。スレッドプールは、より多くのプロセッサで正しくスケーリングされる必要があります。

一般に、アルゴリズムが並列化する意味がある場合は、複数のプロセッサを使用するようにアルゴリズムを設計します。ほとんどのシステムでは、より多くのコア/プロセッサが利用できるようになります。必要な場合は、後でいつでも実装を調整することができます。プロセスが長時間実行されている場合、スレッドを生成するオーバーヘッドはそれに見合ったものになります。すでに高速であれば、他の場所を見て最適化するほうが価値があります。

1

いくつかのアイデアについては、JSR166 and JSR166y(仕事盗難(166)と並列アレイ(166y)のfork-joinシステムのようなもの)を見てください。

Javaの将来の方向性についての素晴らしい読解と概要。それほど悪くない(高水準並行プログラミングと並列プログラミングの強力なサポート)。

1

私は多くの場合、プロセッサの数と動的に同じスレッド数を持つ固定スレッドプールを持っています(実行時を参照)。 このスレッドプールにタスクを追加して、使用可能なすべてのプロセッサを使用します。

私はあなたがオペレーティングシステムでプロセススケジューラを再発明しようとするべきではないと思います。それは良い仕事をするので、それがうまくいくようにしましょう。

1

コアより多くのスレッド/プロセスを持つことは、必ずしも悪いことではありません。あなたのコードがI/Oが少なく、副作用がない厳密に数学的なものであれば、コアとスレッドの間に1対1の対応があることが最適です。しかし、これは通常そうではありません。 I/Oはクロックサイクルに比べて時間がかかります。なぜOSが別のスレッドでスワップすることができ、I/Oを待っている間にコアを完全に停止させるのでしょうか?

問題は、並行性の判断を下す言語/コンパイラがあまりないことです。並行性を利用するには、プログラムを設計する必要があります。また、おそらくあなたのコントロール下ではなく、通常は複数のターゲット環境用にプログラムを設計する必要があります。だから、通常、ベストプラクティスは、スレッドスケジューラーが並列化して処理することが意味のあるものをスレッドにすることです。問題の特定のハードウェアで使用するためにスレッドスケジューラをチューニングする必要があります。

1

で見ます。プログラマとして

[ A(); || B(); || C(); ]; D(); 

あなたresponsability:工程Dこれは当て字PX表記、Java言語の拡張を使用して、ワンライナーである

A、B及びCから 結果を必要としますパラレル実行の可能性がある場所を表現することです。これはパラレルバー "||"の役割ですコードでスケジューラは、使用可能なハードウェア、すなわち利用可能な場合はいつでも、3つの異なるコア上でA、B、Cを実行できるようになりました。

これは、より多くの並列処理が可能性も編集を追加した後、あなたのスレッドが中断することができた理由の多くがまだあります

関連する問題