並列処理をサポートする Java の Intel TBB のようなライブラリはありますか。
6 に答える
おそらく、あなたが探しているものを正確に明確にすることができます
インテル® スレッディング・ビルディング・ブロック (インテル TBB) は、C++ プログラムで並列処理を表現するための豊富で完全なアプローチを提供します。これは、スレッドの専門家でなくても、マルチコア プロセッサのパフォーマンスを活用できるようにするライブラリです。Intel TBB は単なるスレッド置換ライブラリではありません。これは、スケーラビリティとパフォーマンスのためにプラットフォームの詳細とスレッド化メカニズムを抽象化する、高レベルのタスクベースの並列処理を表します。
これは、1998 年以来並行処理ライブラリーが行ってきたことであり、2004 年に Java 5.0 の一部になりました。
編集: システム上のすべての論理プロセッサを使用できるスレッド プールが必要だとします。
ExecutorService es = Executors.newFixedThreadPool(
Runtime.getRuntime().availableProcessors);
// to add a number of tasks
for(int i=0; i<numberOfTasks; i++) {
es.submit(new Callable<ResultType>() {
public ResultType call() {
return doWork(i);
}
}
}
これにより、空きスレッドごとに doWork が実行されます。
その機能を見ると、彼らは非常によく知られているように見えます。
スレッド対応のメモリ割り当てなどの低レベルの最適化のいくつかを調べました。Java では、これは TLAB (Thread Local Allocation Buffers) と呼ばれ、透過的です。ほとんどの Java 開発者は、それらが存在することさえ知らないと思います。
結果と例外は、後で調べることができる Future オブジェクトにキャプチャされます。
CountdownLatch や CyclicBarrier などの「条件変数」を使用できます
C++ 0x unordered_map を模倣し、Intel (TBB 3.0) と Microsoft (Visual Studio 2010) の両方によって実装された共同仕様に基づく新しいコンテナー。以前の concurrent_hash_map よりも 3 つの利点があります。
- C++0x unordered_map によく似たインターフェース
- これにより、同時挿入とトラバーサルが可能になります。
- インターフェイスによって公開されるロックはありません。実装は内部でロックを使用する場合がありますが、デッドロックの原因となるような方法でロックが公開されることはありません。内部でロックを保持する場合がありますが、ユーザー定義コードの呼び出し中は保持されません。
Java の ConcurrentHashMap は、ConcurrentMap および Map インターフェイスをサポートし、同時挿入およびトラバーサルを許可し、ロックを公開しません。;) 少なくとも 9 年前のものなので、堅牢で安定しているはずです。
必要に応じてスレッドプールで使用できる PriorityQueue があります。
このトピックに関する良い本があります:
Java Concurrency in Practice
java.util.concurrent
Java5以降、パッケージで利用できます。
その版には、並行プログラミングの基礎を強化し、既知の問題を修正するために、Java メモリ モデルの大幅なオーバーホールが含まれていました。Java では、並行性は最初から言語に組み込まれるように設計されており、後でライブラリに単純に追加されるわけではありません。
アクターとソフトウェア トランザクション メモリを使用して同時実行フレームワークを提供するakkaを見てみましょう。もちろん、これは構成要素を提供するだけであり、並行コードを記述できる必要がありますが、少し簡単になります。
並行性と並列性の違いについて質問されている方もいらっしゃいます。同時実行とは、同時に実行されることをシミュレートするさまざまなプログラムを意味し、スケジューラーは誰が実行されているかを決定します。並列処理とは、1つのプログラムをタスクに分割し、それらのタスクを異なるコアで同時に実行して問題を解決することを意味します。このタスクが他のプログラムとリソースを奪い合う場合(利用可能なコアよりも多くのタスクがあります)、並行性と並列性が同時に得られます。競合状態を回避することは、並列処理ではそれほど難しい部分ではありません。大きな問題は、タスクを適切に分解して良好な結果を得る良い方法を見つけることです。非常に細かい分解には欠点(オーバーヘッド)がありますが、粗い並列処理(モノタスク)にも欠点があります(コンピューターで使用可能なすべての処理能力を使用しているわけではありません)。
java.util.concurrent
パッケージをチェックしてください。並列プログラミングに役立つクラスがたくさんあります。
ところで、いくつかの回答を受け入れることを検討する必要があります。受け入れられた回答がない 15 の質問は、人々があなたの質問に回答するのを思いとどまらせます。