超高速である必要があるスプレッドシートのようなエンジンを構築する必要があるとします。各セルの依存関係は並列計算ブランチにある可能性があります。並列分岐ごとにスレッドを作成できますか? スレッドはメモリの面で高価ではありませんか。1000 個の数式行または 100 万個の数式行で、同じ数のスレッドを作成する必要があると簡単に考えることができますが、それは現実的ですか?
現実的でない場合、この種のシナリオのスレッドに代わるものはありますか?
超高速である必要があるスプレッドシートのようなエンジンを構築する必要があるとします。各セルの依存関係は並列計算ブランチにある可能性があります。並列分岐ごとにスレッドを作成できますか? スレッドはメモリの面で高価ではありませんか。1000 個の数式行または 100 万個の数式行で、同じ数のスレッドを作成する必要があると簡単に考えることができますが、それは現実的ですか?
現実的でない場合、この種のシナリオのスレッドに代わるものはありますか?
CPU を集中的に使用するタスクの場合、最適なスレッド数は通常、同じ数の CPU です。スレッドを作成するオーバーヘッドは、注意しないと、スレッドが行う作業よりもはるかに高くなる可能性があります。
多くの場合、CPU が主な問題ではないことは何の価値もありません。多くの場合、メモリ帯域幅またはキャッシュの使用率がより問題になります。この場合、1 つのスレッドを効率的に書き込むと、多くのスレッドに作業を分散しようとしてパフォーマンスが低下する可能性があります。各スレッドが実行する作業が CPU を集中的に使用し、使用するメモリ帯域幅が比較的少ない場合は、複数のスレッドが役立つことがあります。
最新の Java プログラミングでは、スレッドを完全に避け、代わりにエグゼキューターを使用する必要があります。世界の他の地域では、これらをワーキング キューと呼んでいます。Joshua Bloch 著『 Effective Java』の項目 68 を参照してください。
個人的には、Grand Central Dispatch の API を強く好みます。Java バージョンはHawtDispatchと呼ばれます。その API はより単純で、そのまま機能します。
あなたの最善の策は、Java のTask Parallel Libraryまたは Fork/Join Framework です。それらはスレッドを使用しますが、スレッドの数を最適化し、作業項目を作業キューに入れます。彼らは非常に巧妙な方法で多くの低レベルの最適化問題を処理します。Parallel.For などの構造を使用するだけです。
タスク並列ライブラリは、CPUを可能な限り活用するのに役立ち、スレッド作成の面倒な作業のほとんどを実行します。
非常に多くの(非常に)並列化可能な計算があり、可能な限り最高のパフォーマンスが必要な場合は、CPUを超えて検討する必要があります。LINQ/TPLとMSなどのGPUを組み合わせた代替手段があります。加速器と梵天。たとえば、C#でGPUを利用するを参照してください。
頭に浮かぶスレッド以外の唯一のものはSIMDコマンドです(特別なハードウェアを使用したい場合を除きます。これは、より低いレベルの言語を使用する必要があることを意味します)。プロセッサ/Gaphic カード機能にアクセスするには、外部ライブラリを使用する必要があります。また、CUDA または OpenCL にも興味があるかもしれません。一方、通常、説明したほど多くのスレッドを作成したくない場合は、作成されるスレッドの数を管理し、キューからタスクを実行する、固定または動的な量のスレッドでスレッド プールを使用できます。また、Java 7 には、スレッド管理に役立つ Fork/Join 機能があります。
スレッドプールを見てください。これらを使用すると、スレッドが多すぎることで生じるオーバーヘッドのバランスを取ることができます。
情報を探しているので、これはスレッドにも少し役立つかもしれません。
あてじPXも是非ご覧ください。これは、並列化のための Java 言語の拡張機能であり、役立つ場合があります。商用製品でしたが、無料で利用できるようになりました。