Grundlagen der Parallel-Programmierung, Teil 1

James Reinders gibt einen Einblick in die Algorithmen von Threading Building Blocks, einer C++-Template-Bibliothek für Parallel-Programmierung.

[legacyvideo id=88072974]

Hallo, ich bin James Reinders. Heute werde ich Ihnen etwas über Threading Building Blocks erzählen. Dies ist der erste von mehreren Vorträgen über Threading Building Blocks, eine interessante Template-Bibliothek für C++ zur Implementierung von Parallelismus.

Eine Template-Bibliothek für C++ muss eine ganze Menge Funktionen mitbringen, um einen bei der parallelen Programmierung zu unterstützen. Das Feature, das ich hier vorstellen werde, sind die Algorithmen, die den eigentlichen Kern von Threading Building Blocks ausmachen.

Als Beispiel soll eine „for”-Schleife dienen. Dies ist eine extrem einfache „for“-Schleife, aber damit bekommt man eine Vorstellung davon, wie man eine solche Schleife auf mehrere Prozessoren aufteilt. Auf diese Weise in C oder C++ geschrieben, ist dies eine sehr einfache Schleife. Wenn man jetzt einfach „pthreads“ oder etwas Ähnliches verwendet, müsste man eine Menge Codezeilen hinzufügen, um mehrere Threads zu erzeugen, diese zu verwalten, das Problem aufzuteilen usw. Eigentlich würden wir viel lieber etwas schreiben wie hier unten auf der Tafel: Iteriere einfach in einer „parallel_for“-Schleife von 0 bis n und führe die Funktion „mydbl“ aus – und finde heraus, wie dies am besten automatisch aufzuteilen ist.

Das ist das Kernstück, wenn man Code unter Verwendung von Threading Building Blocks schreibt, um diese Schleife parallel auszuführen. Die Schleife selber müssen wir in eine Klasse packen – ich habe sie hier „struct“ genannt. Wir müssen eine Klasse mit einem Operator für diese Klasse erstellen, der die „for“-Schleife enthält. Wenn wir diesen hinzufügen, brauchen wir auch einige Parameter. In diesem Fall brauchen wir zwei Reihen für „input“ und „output“, die wir deklarieren müssen. Und der Bereich („range“) muss hier übergeben werden. Ansonsten bleibt die Schleife im Prinzip unverändert. Da in diesem Fall der Bereich der Schleife als Parameter übergeben wird, brauchen wir „range.begin” und „range.end” um Anfangs- und Endwert für die Iterationen der Schleife zu bestimmen.

Durch Übergeben des Bereichs können Threading-Building-Blocks-Laufzeitsysteme die Schleife auf die Zahl der verfügbaren Prozessoren aufteilen. Wie Sie sehen, versucht der Code an keiner Stelle herauszufinden, wie viele Prozessoren vorhanden sind. Dies geschieht automatisch alles zur Laufzeit.

Wir müssen unsere Funktion in eine Klasse einbinden, aber die Funktion wird einfach kopiert und man muss nur einige Parameter ergänzen, damit das Ganze funktioniert. Am Anfang des Programms gibt es natürlich noch einige „includes“ zum Einbinden von Definitionsdateien, aber ansonsten braucht man im Prinzip nur parallel_for aufzurufen. In diesem Fall habe ich eine Instanz dieser Klasse erzeugt, die entsprechenden Parameter (input und output) übergeben, die ich verwenden will und verwende dann dieses Template. Das Template nutzt äußerst effizienten Code, der automatisch die Möglichkeiten zur parallelen Verarbeitung des Rechners nutzt.

Threading Building Blocks bieten neben parallel_for noch eine Reihe weiterer Algorithmen: Es gibt „parallel_reduce”, „parallel_scan”, „parallel_while”, „parallel_pipeline” und auch „parallel_sort”. Damit hat man im Prinzip alle Templates zur Verfügung, die man benötigt, um die meisten Möglichkeiten für Parallelismus in Programmen zu nutzen. Meiner Erfahrung nach ist parallel_for das wichtigste, gefolgt von parallel_reduce. Die übrigen Templates kommen gelegentlich zur Anwendung, aber mit parallel_for kann man schon eine ganze Menge erreichen. Das parallel_sort-Template von Threading Building Blocks ist auch nur unter Verwendung von parallel_for geschrieben.

Da wären also die Algorithmen von Threading Building Blocks. Weitere Informationen finden Sie unter . Dort kann man sich die Templates herunterladen, die Dokumentation einsehen usw. Im zweiten Teil werden wir uns die übrigen Elemente von Threading Building Blocks anschauen.

Neueste Kommentare 

Noch keine Kommentare zu Grundlagen der Parallel-Programmierung, Teil 1

Hinterlasse eine Antwort

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind markiert *