2008-09-20 6 views
24

Intels Threading Building Blocks (TBB) Open-Source-Bibliothek sieht wirklich interessant aus. Obwohl es sogar ein O'Reilly Book über das Thema gibt, höre ich nicht über viele Leute, die es benutzen. Ich bin daran interessiert, es für einige parallele Multi-Level-Anwendungen (MPI + -Threads) in Unix-Umgebungen (Mac, Linux usw.) zu verwenden. Für das, was es wert ist, interessiere ich mich für Hochleistungsrechnen/numerische Methoden Arten von Anwendungen.Irgendwelche Erfahrungen mit den Threading-Bausteinen von Intel?

Hat jemand Erfahrungen mit TBB? Funktioniert es gut? Ist es ziemlich portabel (einschließlich GCC und andere Compiler)? Funktioniert das Paradigma gut für Programme, die Sie geschrieben haben? Gibt es andere Bibliotheken, die ich untersuchen sollte?

+0

Ich wünschte, ich hätte etwas Zeit, um mit diesen alleine herumzuspielen, aber bis dahin würde ich wirklich daran interessiert sein, von den Erfahrungen mit TBB zu hören. – tgamblin

Antwort

12

Ich habe es in unsere Code-Basis eingeführt, weil wir einen Wetter-Malloc brauchten, wenn wir auf eine 16-Core-Maschine umstellten. Mit 8 und unter war es kein bedeutendes Problem. Es hat gut für uns gearbeitet. Wir planen die Verwendung der feinkörnigen gleichzeitigen Container als nächstes. Idealerweise können wir das echte Fleisch des Produkts nutzen, aber das erfordert ein Umdenken bei der Erstellung unseres Codes.Ich mag die Ideen in TBB sehr, aber es ist nicht einfach, sie auf eine Codebasis umzurüsten.

Sie können sich TBB nicht als eine andere Threading-Bibliothek vorstellen. Sie haben ein ganz neues Modell, das wirklich auf Fäden sitzt und die Fäden abstrahiert. Sie lernen in der Task parallel_for type operations und pipelines zu denken. Wenn ich ein neues Projekt aufbauen würde, würde ich wahrscheinlich versuchen, es auf diese Weise zu modellieren.

Wir arbeiten in Visual Studio und es funktioniert gut. Es wurde ursprünglich für linux/pthreads geschrieben, also läuft es auch gut dort drüben.

2

Ich habe in TBB untersucht, aber nie in einem Projekt verwendet. Ich sah keine Vorteile (für meine Zwecke) über ZThread. Eine kurze und etwas veraltete Übersicht finden Sie unter here.

Es ist ziemlich komplett mit mehreren Thread-Versandoptionen, allen üblichen Synchronisationsklassen und einem sehr praktischen ausnahmebasierten Thread- "Interrupt" -Mechanismus. Es ist leicht erweiterbar, gut geschrieben und dokumentiert. Ich habe es in mehr als 20 Projekten verwendet.
Es spielt auch nett mit jedem * NIX, der sowohl POSIX-Threads als auch Windows unterstützt.

Einen Blick wert.

3

ZThread ist LGPL, Sie können die Bibliothek nur in dynamischer Verknüpfung verwenden, wenn Sie nicht in einem Open Source-Projekt arbeiten.

Die Threading Building Blocks (TBB) in der Open-Source-Version (es gibt eine neue kommerzielle Version, $ 299, kenne die Unterschiede noch nicht) ist GNU General Public License Version 2 mit einer sogenannten "Runtime Exception" “ (dh sich auf die Verwendung nur auf freie Software zu schaffen.) ich habe andere Runtime Ausnahmen gesehen, die versuchen, LGPL zu nähern, sondern ermöglicht die kommerzielle Nutzung und statische Verknüpfung dieser ist nichtjetzt der Fall.

Ich schreibe dies nur, weil ich die Chance nutzte, um die Bibliotheken Lizenzen zu prüfen, und diese sollten auch eine Überlegung für die Auswahl basierend auf der Verwendung sein, die man ihnen geben will.


Txs, Jihn für dieses Update den Hinweis auf ...

+0

TBB verwendet Apache 2.0 jetzt als Open-Source-Lizenz (https://www.threadingbuildingblocks.org/faq/10). – Jeff

3

ich TBB kurz verwendet haben, und es wird wahrscheinlich in Zukunft noch mehr nutzen. Ich mochte es, es zu verwenden, am wichtigsten, weil Sie sich nicht mit Makros/Erweiterungen von C++ beschäftigen müssen, sondern in der Sprache bleiben. Auch ist es ziemlich tragbar. Ich habe es sowohl auf Windows als auch auf Linux verwendet. Eine Sache jedoch: Es ist schwierig, mit Threads mit TBB zu arbeiten, man müsste in Aufgaben denken (was eigentlich eine gute Sache ist). Intel TBB würde die Verwendung von blanken Sperren nicht unterstützen (es wird dies langwierig machen). Aber insgesamt ist das meine vorläufige Erfahrung.

Ich würde auch empfehlen, sich auch openMP 3 anzusehen.

5

Ich mache keine numerischen Berechnungen, aber ich arbeite mit Data Mining (Think Clustering und Klassifizierung), und unsere Arbeitslasten sind wahrscheinlich ähnlich: Alle Daten sind statisch und Sie haben es am Anfang des Programms. Ich habe kurz Intels TBB untersucht und festgestellt, dass sie für meine Bedürfnisse übertrieben sind. Nachdem ich mit rohem Pthread-basierten Code begonnen hatte, wechselte ich zu OPENMP und fand die richtige Mischung zwischen Lesbarkeit und Leistung.

1

Die Threading Building Blocks (TBB) in die Open-Source-Version, (es gibt eine neue kommerzielle Version ist, wissen $ 299, nicht die Unterschiede noch) ist GNU General Public License Version 2 mit ein sogenannter „Runtime Exception“ (die gilt nur für die Verwendung auf freie Software zu schaffen.) ich habe andere Runtime Ausnahmen gesehen, die versuchen LGPL zu nähern, sondern ermöglichen comercial Nutzung und statische Verknüpfung diesen nicht ist der Fall.

Nach diesem question Threading Building Blocks ist ohne Kopier-Links Einschränkungen mit kommerzieller Nutzung verwendbar.

2

Ich benutze TBB in einem Projekt. Es schien einfacher zu sein, es als Threads zu verwenden. Es gibt Aufgaben, die parallel ausgeführt werden können. Eine Aufgabe ist nur ein Aufruf Ihrer parallelisierten Subroutine. Load Balancing erfolgt automatisch. Deshalb akzeptiere ich es als eine höhere Parallelisierungsbibliothek. Ich habe 2.5x Geschwindigkeit ohne viel Arbeit auf einem 4-Kern-Intel-Prozessor erreicht. Es gibt Beispiele, sie beantworten Fragen in Foren und es wird gepflegt und es ist kostenlos.

2

Portabilität

TBB ist tragbar. Es unterstützt Intel- und AMD- (d. H. X86) Prozessoren, IBM PowerPC- und POWER-Prozessoren, ARM-Prozessoren und möglicherweise andere. Wenn Sie in der build directory suchen, können Sie alle Konfigurationen sehen, die das Build-System unterstützt, die eine breite Palette von Betriebssystemen (Linux, Windows, Android, MacOS, iOS, FreeBSD, AIX usw.) und Compiler (GCC, Intel , Clang/LLVM, IBM XL usw.). Ich habe TBB nicht mit dem PGI C++ Compiler probiert und weiß, dass es nicht mit dem Cray C++ Compiler funktioniert (Stand 2017).

Vor ein paar Jahren war ich Teil der Bemühungen, TBB zu IBM Blue Gene-Systemen zu portieren. Die statische Verbindung war eine Herausforderung, wird aber jetzt von dem big_iron.inc Build-System-Helfer behoben. Die anderen Probleme waren die Unterstützung relativ alter Versionen von GCC (4.1 und 4.4) und die Sicherstellung, dass die PowerPC-Atomics funktionierten. Ich erwarte, dass die Portierung auf eine derzeit nicht unterstützte Architektur auf Plattformen, die GCC und POSIX bereitstellen oder damit kompatibel sind, relativ einfach ist.

Verwendung in Gemeinschaftskodizes

Ich bin von mindestens zwei HPC-Applikations-Frameworks bewusst, dass TBB verwendet:

Ich weiß nicht, wie ELCH Anwendungen TBB, aber MADNESS verwendet TBB für seine Aufgabenwarteschlange und seinen Speicherzuordner.

Leistung im Vergleich zu anderen Threading-Modelle

ich persönlich TBB im Parallel Research Kernels Projekt verwendet haben, in dem ich TBB zu OpenMP verglichen haben, OpenCL, Kokkos, RAJA, 17 ++ C Parallel STL und andere Modelle. Details finden Sie unter C++ subdirectory.

Die folgende Abbildung zeigt die relative Leistung der oben genannten Modelle auf einem Intel Xeon Phi 7250 Prozessor (die Details sind nicht wichtig - alle Modelle verwenden die gleichen Einstellungen). Wie Sie sehen können, ist TBB recht gut, mit Ausnahme von kleineren Problemgrößen, bei denen der Aufwand für die adaptive Planung wichtiger ist. TBB hat Einstellknöpfe, die diese Ergebnisse beeinflussen.

PRK stencil

Vollständige Offenlegung: Ich arbeite für Intel in einem Forschungs/Wegfindung Kapazität.

1

Es lohnt sich klar zu sein, was TBB (Threading Building Blocks) mit anderen Alternativen (z. B. C++ 11x Concurrency Features) kontrastieren soll. TBB ist eine portable und skalierbare Bibliothek (keine Compiler-Erweiterung), mit der Sie Ihren Code in Form von leichtgewichtigen Tasks schreiben können, die TBB so schnell wie möglich auf den verfügbaren CPU-Ressourcen laufen lässt. Es ist kein Support-Threading für andere Zwecke (z. B. Vorkaufsrecht) konzipiert.

Ich habe TBB verwendet, um die bestehende Bildverarbeitung von for-Schleifen über Bildabtastzeilen in parallel_for-Schleifen zu beschleunigen (ein Minimum von 2-4 Abtastzeilen als Korngröße). Dies war sehr erfolgreich. Es erfordert, dass Ihr Schleifenkörper (neu) geschrieben wird, um einen willkürlichen Index zu verarbeiten, anstatt anzunehmen, dass jeder Schleifenkörper sequenziell verarbeitet wird (z. B. Zeiger, die zwischen jeder Schleifeniteration inkrementiert werden).

Dies war ein ziemlich trivialer Fall, da kein freigegebener Speicher zum Aktualisieren vorhanden war. Die Verwendung der leistungsstärkeren Merkmale (z. B. Pipeline) erfordert eine wesentliche Neubemalung und/oder Neuschreibung von existierendem Code, so dass sie vielleicht besser für neuen Code geeignet ist.

Es ist ein großer Vorteil, dass dieser TBB-basierte Code portabel bleibt, anderen Codes im selben Prozess nicht mit anderen Threading-Strategien interferiert und später mit Multiprocessing-Strategien höherer oder niedrigerer Ebenen kombiniert werden kann (zB könnte der TBB-parallel_for-Code von einem Filter in einer TBB-Multiprocessing-Pipeline aufgerufen werden).

Verwandte Themen