Parallel4 ist eine neue kleine Library, die Parallelisierung für Java und weitere Sprachen auf der JVM vereinfachen soll. Ein zentraler Bestandteil sind parallele for-Schleifen, die automatisch so viele Threads verwenden wie CPU Kerne verfügbar sind. Dazu gleich etwas Code aus dem mitgelieferten Mandelbrot-Beispiel (zum Starten einfach die Jar Datei ausführen).

Konventionell, single-threaded:

	for (int y = 0; y < height; y++) {
		calcLine(y);
	}

Dasselbe in der multi-threaded Variante mit Parallel4, die alle vorhandenen CPUs nutzt:

	new ParallelForInt(height).loop(new IterationInt() {
		public void iteration(int y) {
			calcLine(y);
		}
	});

Auf einer Dual-/Quad-Core CPU verdoppelt/vervierfacht sich damit die Geschwindigkeit. Parallel4 versucht dabei den Mehraufwand minimal zu halten und gewohnte Ansätze beizubehalten. Mit Closures, wie sie bei Groovy und hoffentlich in Java 7 zur Verfügung stehen werden, wird die Syntax weiter vereinfacht, da das Interface IterationInt weg fällt und damit mit der original For-Schleife vom der Ausdrucksweise gleichzieht.

Neben der parallelen For-Schleife hat die Version 0.1 auch eine ParallelInputStream Klasse, die asynchron im voraus einen Buffer befüllt. Bei CPU-intensiver Streamverarbeitung wie beispielsweise dem GZIPInputStream kann dies eine Beschleunigung von über 50% bringen. Dazu muss man einfach den ParallelInputStream dazwischenhängen:

in = new ParallelInputStream(in);

Im Gegensatz zur for-Schleife hängen hier die Resultate stark vom Einzelfall ab. Beispielsweise ist bei einfachen FileInputStream Objekten hier kaum eine Verbesserung zu erzielen, da hier bereits intern asynchron die Daten vorbereitet werden. Dennoch ist es schwer Fälle zu finden, die mit ParallelInputStream langsamer arbeiteten als ohne: ParallelInputStream hat schon ein paar Profiler- und Optimierungssessions hinter sich (wie auch ParallelForInt) und verzichtet beispielsweise zu 99,9% auf explizite Synchronisation mit synchronized und stellt die Synchronisation stattdessen algorithmisch sicher.

Für Interessierte gibt es neben den Downloads auch den Source Code. Die Parallel4 Open-Source Seite wird auf Google Code gehostet; die Parallel4 Website ist erst noch am Entstehen.

Auch wenn es sich um eine frühe Version handelt, würde mich Feedback zum Ansatz und zur Umsetzung sehr freuen.

P.S.: Michael hatte letzen Monat mit einer parallelen for-Schleife für Scala herumgespielt. Ein Vergleich zum Overhead wäre interessant…

2 Antworten zu “Parallel4: Parallelisierung einfach”
  1. Markus sagt:

    Ist es jetzt einfach nur ein Zufall das ein thematisch ähnliches Thema gerade am Blog von de Icaza ( http://tirania.org/blog/archive/2008/Jul-26-1.html ) bezüglich Parallelisierung in C# ist?

  2. Markus Junginger sagt:

    Ja, ist Zufall. Die Idee hatte ich schon vor längerer Zeit, aber natürlich hatten diese Idee andere wie z.B. Microsoft mit Parallel FX schon vor mir. Siehe auch mein Kommentar vor einem Monat.