Open Source im professionellen Einsatz
Linux-Magazin 05/2011
© Leonid Shcheglov, 123RF.com

© Leonid Shcheglov, 123RF.com

Intel Threading Building Blocks 3.0

Besser parallelisiert

Intels Bibliothek Threading Building Blocks hilft dem C++-Programmierer, die Rechenarbeit parallel auf die vielen Prozessoren oder Kerne moderner Computer zu verteilen. Dabei ersetzt das elegante Task-Konzept die leidige Verwaltung von Threads.

459

Die Threading Building Blocks (TBB) von Intel helfen bereits seit 2006 bei der Programmierung für Multicore- und SMP-Systeme. Die Bibliothek enthält eine Sammlung verschiedener Mechanismen zum Schreiben paralleler Programme in der Programmiersprache C++. Die TBB orientieren sich in vielen Konzepten an der Standard Template Library (STL). Sie sind inzwischen in Version 3.0 und auch als GPLv2-lizenzierte Ausgabe erhältlich, die funktional identisch zur kommerziellen Version ist [1]. Als Plattformen unterstützt die Bibliothek Linux, Windows und Mac OS X.

Die aktuelle TBB-Version 3.0 berücksichtigt die Erfahrungen der vergangenen Jahre, orientiert sich insbesondere am kommenden C++0x-Standard [2] und unterstützt beispielsweise die dort eingeführten Lambda-Funktionen. Dieser Artikel stellt die Neuerungen seit dem Linux-Magazin-Beitrag zu Version 1 [3] vor und vertieft einige der Konzepte, die dem Entwickler dabei helfen, skalierbaren Code für Mehrprozessor- und Mehrkern-Computer zu schreiben.

Abstraktion

Die zugrunde liegende Philosophie der Bibliothek ist es, dem Programmierer eine abstraktere Schnittstelle als beispielsweise die Pthreads von Linux bereitzustellen und ihn von sehr Betriebssystem-naher Programmierung zu befreien. Die Template-Funktionen zum Parallelisieren von Schleifen hat Intel um »parallel_invoke()« erweitert, das im Unterschied zu den Varianten von »parallel_for()« auch verschiedene Funktionen parallel ausführt, nicht immer nur dieselbe.

Wenn parallele Threads sich gegenseitig ihren Cache zerstören, obwohl sie auf unterschiedlichen Daten arbeiten, bezeichnet man das als False Sharing. Mit Hilfe von Allokatoren-Klassen zur Cache-sensitiven Reservierung des Hauptspeichers lässt sich dieses Phänomen vermeiden. Die Containerklassen der STL sind nicht gegen einen gleichzeitigen Zugriff paralleler Threads geschützt. Die TBB führen daher Containerklassen für Vektoren, Hashtabellen und Warteschlangen ein, die Thread-safe sind. Deren Umfang ist stark gewachsen und umfasst jetzt auch »concurrent_unordered_map« und »concurrent_bounded_queue« . Der Programmierer muss aber bei der Verwendung im Kleingedruckten lesen, was Thread-safe im Einzelfall bedeutet.

Zum Synchronisieren von parallel arbeitenden Threads stellen die TBB beim Zugriff auf gemeinsame Objekte eine Reihe von Mutex-Klassen zur Verfügung. Für einige Anwendungen sind atomare Operationen wie Compare and Swap, bei der Operationen zum Vergleichen und Vertauschen unteilbar ausgeführt werden, wesentlicher schneller.

Tausende Tasks

Insbesondere das Task-Konzept der TBB bietet im Gegensatz zu Threads eine einfache Möglichkeit, ein Programm skalierbar zu machen – unabhängig von der tatsächlichen Anzahl physikalischer Rechenkerne. Eine Task ist eine parallele Aufgabe, die den Vorteil hat, dass sie sich im Gegensatz zu den Threads des Betriebssystems effizient erzeugen und löschen lässt. So sind sehr viele Tasks – Tausende bis Hunderttausende – in der eigenen Anwendung einsetzbar. Dieser Artikel zeigt am Beispiel eines Sudoku-Lösers, wie das geht.

Des Weiteren sind einige Klassen für eine einfache Zeitmessung, beispielsweise »tick_count« , jetzt Bestandteil der TBB. Darüber hinaus ermöglicht es die aktuelle Version, Thread-lokalen Speicher zu verwenden.

Diesen Artikel als PDF kaufen

Express-Kauf als PDF

Umfang: 6 Heftseiten

Preis € 0,99
(inkl. 19% MwSt.)

Linux-Magazin kaufen

Einzelne Ausgabe
 
Abonnements
 
TABLET & SMARTPHONE APPS
Bald erhältlich
Get it on Google Play

Deutschland

Ähnliche Artikel

  • Baukasten

    Mit den Threading Buildings Blocks 1.0 bietet Intel für Parallelprogrammierung ein C++-Template-basiertes kommerzielles Framework an. Zwei Intel-Entwickler führen in das komplexe Konzept ein, das sich für alle Multicore- und SMP-Systeme eignet, und stellen wichtige Features vor.

  • Sauber eingefädelt

    Der Standard für Threads unter Linux ist heute die Native Posix Threads Library (NPTL). Die Bibliothek überzeugt durch große Kompatibilität zum Standard und hohe Performance. Dieser Artikel untersucht die neue Threading-Engine und zeigt, wie Benutzeranwendungen davon profitieren.

  • Doppel-Herz

    Die einen lieben, die anderen hassen sie: die flexible, aber komplexe C++-Standardbibliothek STL. Entwickler des zweiten Lagers können ihren Quellcode nun fast umsonst parallelisieren. Den Werkzeugkasten dazu liefert OMPTL - vorausgesetzt der Compiler beherrscht den OpenMP-Standard.

  • Java-Threads

    Seit der ersten Version von Java sind Threads ein fester Bestandteil der Sprache. Das macht vieles einfacher als in anderen Programmiersprachen. Neuere Versionen der Java-Bibliothek bieten darüber hinaus viele nützliche Klassen für Locking und Synchronisierung.

  • C++

    Beim deklarativen Programmieren drückt der C++-Programmierer unter anderem mit Hilfe von Schlüsselwörtern aus, was er erreichen möchte. Der Compiler kümmert sich dann um den weiteren Weg.

comments powered by Disqus

Stellenmarkt

Artikelserien und interessante Workshops aus dem Magazin können Sie hier als Bundle erwerben.