BT

最新技術を追い求めるデベロッパのための情報コミュニティ

寄稿

Topics

地域を選ぶ

InfoQ ホームページ ニュース Java 7におけるFork/Joinとの並列性

Java 7におけるFork/Joinとの並列性

最新のハードウェア上で利用可能なプロセッサコアの数が増えるにつれて、新しいハードウェアを最大限活用するような方法で開発者が開発することが一層重要になっている。IBM Developerworks(source)はFork-Join並列処理ライブラリ上に複数部分からなるシリーズを公表したが、来たるJava 7リリースの一部としての出荷になる。InfoQでは以前に、Java 7の最初のfork/join提案(参考記事・英語)を、元々の作者であるDoug Leaのフィードバックを交えて取り扱った。Javaに関するfork/joinの概念は、元々Lea(source)が自身の論文「Fork/Join Parallelism in Java」(Javaにおけるfork/joinの並列性)(source)の中で紹介したものである。Leaのutil.concurrent パッケージはJSR-166(source)の基礎であり、Java 5でリリースされたjava.util.concurrentライブラリであった。fork/joinは単に、このJSRの修正である。

シリーズのPart 1(source)ではfork/joinライブラリの中心概念と、解決しようとしている問題を詳説している。
前進するという、ハードウェアの傾向は明確です。ムーアの法則のより高いクロックレートは実現していないでしょうが、代わりにチップ毎のコア数増加は実現しているでしょう。ユーザー要求のような粒度の粗いタスク境界を使用することにより、1ダースのプロセッサをビジー状態にし続ける様子は想像に難くありませんが、このテクニックは何千個というプロセッサにはスケールしないので、トラフィックが短時間、急激にスケールすることがあっても、最終的にはハードウェア的傾向が勝利を収めるでしょう。多コアの時代に突入すると、よりきめの細かい並行性を見つけ出す必要があり、そうしないと、やるべき仕事はたくさんあっても、プロセッサがアイドル状態を保っているというリスクを冒すことになってしまうでしょう。遅れをとりたくないならば、優勢なハードウェアプラットフォームが移行すると同時に、ソフトウェアプラットフォームも同様に移行させなければなりません。この目的を達するために、Java 7には、特定クラスのより粒度の細かい並行アルゴリズムに相当するフレームワーク、fork-join フレームワークが含まれることになります。
Part 2(source)では、分割統治プログラミング・テクニックを参照し、Part 1で定義した概念を拡大する。:
fork/joinには分割統治テクニックが含まれています。問題を1つ選び、連続してより効果的に解決できるような大きさになるまで、その問題を小さなサブ問題に再帰的に分割します。再帰的なステップには、問題を2つ、もしくは3つ以上のサブ問題に分けて、サブ問題を解決するために待ち行列させ(fork ステップ)、サブ問題の結果を待ち(join ステップ)、そして結果を統合することを伴います。
記事ではその後、fork/joinを使った併合整列アルゴリズム(source)を紹介している。

このシリーズで扱っている最後の構成要素はParallelArrayクラスである。ParallelArrayは、高度に並行なやり方でデータセットの検索やフィルタリング、変換を実行する汎用APIを提供する、fork/join使用可能なデータ構造である。

Java向けBGGAクロージャ提案(source) に取り組んでいるチームは、クロージャを扱うためにfork/joinフレームワークを改造し、自分たちの提案サイト上に実用実装版(source)を置いている。このDeveloperworks記事シリーズではParallelArrayクラスの使用例2つを紹介している。1つはクロージャ提案つきで、もう1つはクロージャ提案なしの例である。:

現行のJava 7のfork/join提案を使用して、学生グループ内の最大成績平均点(GPA)を検索する例は以下のとおりである。
ParallelArray students = new ParallelArray(fjPool, data);
double bestGpa = students.withFilter(isSenior)
.withMapping(selectGpa)
.max();

public class Student {
String name;
int graduationYear;
double gpa;
}

static final Ops.Predicate isSenior = new Ops.Predicate() {
public boolean op(Student s) {
return s.graduationYear == Student.THIS_YEAR;
}
};

static final Ops.ObjectToDouble selectGpa = new Ops.ObjectToDouble() {
public double op(Student student) {
return student.gpa;
}
};


以下は、同じ例にBGGAクロージャ提案を使った場合である。
double bestGpa = students.withFilter({Student s => (s.graduationYear == THIS_YEAR) })
.withMapping({ Student s => s.gpa })
.max();
現在のところ、Java 7は2009年始め頃のリリース予定になっている。

原文はこちらです:http://www.infoq.com/news/2008/03/fork_join

この記事に星をつける

おすすめ度
スタイル

BT