Tanpohp

PLinq – und wann man es nicht nutzen sollte

by on Nov.03, 2011, under Snippets

Zur Zeit beschäftige ich mich mit Bildverarbeitung auf der GPU. Dabei muss ich auf eine Reihe von Bildern Faltungen und dergleichen anwenden. Viele Bilder – das schreit nach PLinq, so dachte ich. Aus organisatorischen Gründen habe ich 3 Bildpackte welche jeweils eine List sind. Diese enthalten dann wiederum das Graustufenbild als byte[].

List<List<byte[]>> allImagePackages;

PLinq bietet nun eine ausgesprochen einfache Möglichkeit die Bilder parallel zu bearbeiten. Der Code sieht dann etwa wie folgt aus:

allImagePackages.AsParallel().ForAll(
	imagePackage => imagePackage.AsParallel().ForAll(
		singleImage =>DoSomethingComplex(singleImage)));

Da es sich um verschachtelte Listen handelt kann, kann man auf jeder Ebene AsParallel nutzen um diese parallel zu bearbeiten. Nach einigem experimentiern mit meinen Bildern kam ich dabei auf ein interessantes Phänomen. Mein Bilder sind zu 3 Pakete gebündelt welche jeweils 50 oder 255 Bilder enthalten. Dabei ergaben sich folgende Bearbeitungszeiten:

Modus 50 Bilder 255 Bilder
Ohne AsParallel 30,4sec 140,8sec
AsParallel auf beiden Ebenen 7,1sec 25,4sec
AsParallel auf der untersten Ebene 5,7sec 22,8sec

Es scheint, als bringe das parallele abarbeiten von parallel abzuarbeiten Aufgaben keinen Geschwindigkeitsvorteil, im Gegenzug sogar ein Verwaltungsoverhead. Ich stecke zu wenig in der Materie drin um ein fundiert Erkärung für diese Phänomen zu liefern, aber ich habe eine Theorie: Das äußere AsParallel (im Folgenden AP1) hat lediglich die Aufgabe die Verarbeitung der einzelnen Pakete zu starten.  Das innere AsParallel (im Folgenden AP”) hingegen hat schwer zu tun. Ich meine mal gelesen zu haben, dass PLinq einzelne Threads gleichermaßen zum Zuge kommen lässt.  Das heißt sowohl AP1 als auch AP2 werden vielleicht 100 mal pro Sekunden an die CPU gelassen. Währen AP2 diese Zeit nutzt um die Bildverarbeitung voran zu treiben, stellt AP1 lediglich fest, das AP2 noch nicht fertig ist und gibt die CPU wieder frei. Dieser Overhead bremst dann das ganze Programm, wodurch dann die oben genannten Zahlen zustanden kommen.

:, , ,

Looking for something?

Use the form below to search the site:

Still not finding what you're looking for? Drop a comment on a post or contact us so we can take care of it!

Visit our friends!

A few highly recommended friends...