Frage

Intel Threading Building Blocks (TBB) Open-Source-Bibliothek sieht wirklich interessant. Auch wenn es noch ein O'Reilly Buch über das Thema Ich höre nicht über eine Menge Leute es benutzen. Ich habe Interesse an es für einige Multi-Level-parallele Anwendungen mit (MPI + threads) in Unix (Mac, Linux, etc.) Umgebungen. Für das, was es wert ist, ich habe Interesse an High Performance Computing / numerische Methoden Arten von Anwendungen.

Hat jemand Erfahrungen mit TBB? Ist es gut? Ist es ziemlich portable (einschließlich GCC und anderen Compilern)? Funktioniert das Paradigma auch für Programme, die Sie geschrieben haben? Gibt es noch andere Bibliotheken Ich sehe in sollte?

War es hilfreich?

Lösung

Ich habe es in unserem Code-Basis eingeführt, weil wir eine bettor malloc zu verwenden benötigt, wenn wir auf eine 16-Core-Maschine bewegt. Mit 8 und darunter war kein großes Problem. Es hat gut funktioniert für uns. Wir planen als nächste den feinkörnigen gleichzeitigen Behälter zur Verwendung. Im Idealfall können wir die Verwendung des realen Fleisches des Produkts machen, aber das erfordert ein Umdenken, wie wir unseren Code zu bauen. Ich mag wirklich die Ideen in TBB, aber es ist nicht leicht, auf eine Code-Basis nachzurüsten.

Sie können nicht als eine andere Threading-Bibliothek von TBB denken. Sie haben ein ganz neues Modell, das wirklich auf den Fäden sitzt und abstrahiert die Fäden entfernt. Sie lernen in Aufgabe zu denken, parallel_for Typ Operationen und Pipelines. Wenn ich ein neues Projekt bauen wäre, würde ich wahrscheinlich versuchen, es auf diese Weise zu modellieren.

Wir arbeiten in Visual Studio und es funktioniert gut. Es wurde ursprünglich geschrieben für Linux / pThreads so ist es auch ganz gut da drüben läuft.

Andere Tipps

Ich mache nicht numerische Berechnungen, aber ich mit Data-Mining-Arbeit (man denke Clustering und Klassifikation), und unsere Workloads sind wahrscheinlich ähnlich: alle Daten statisch ist, und Sie haben es am Anfang des Programms. Ich habe untersucht, kurz Intel TBB und fand sie viel des Guten für meine Bedürfnisse. mit rohem pthread-basierten Code Nach dem Start wechselte ich zu OpenMP und bekam die richtige Mischung zwischen Lesbarkeit und Leistung.

Portabilität

TBB ist tragbar. Es unterstützt Intel und AMD (d x86) Prozessoren, IBM PowerPC und POWER-Prozessoren, ARM-Prozessoren und möglicherweise andere. Wenn Sie in der Verzeichnis zu bauen, können Sie alle Konfigurationen der Build sehen Systemunterstützung, die eine breite Palette von Betriebssystemen (Linux, Windows, Android, MacOS, iOS, FreeBSD, AIX, etc.) umfassen und Compiler (GCC, Intel, Clang / LLVM, IBM XL, etc.). Ich habe nicht TBB mit dem PGI C ++ Compiler versucht, und weiß, dass es nicht mit der Cray C ++ Compiler (Stand 2017) nicht funktioniert.

Vor ein paar Jahren war ich Teil der Bemühungen um Port TBB zu IBM Blue Gene-Systemen. Statisches Linken war eine Herausforderung, aber wird jetzt von der big_iron. inc System Helfer bauen. Die anderen Fragen stützen relativ alte Versionen von GCC (4.1 und 4.4) und der Gewährleistung der PowerPC atomics arbeitet. Ich gehe davon aus, dass auf Plattformen wäre relativ einfach zu jeder Zeit nicht unterstützt Architektur zu portieren, die zur Verfügung stellen oder sind kompatibel mit GCC und POSIX.

Verwendung in Community-Codes

Ich bin mindestens zwei HPC-Applikations-Frameworks bekannt, die TBB verwendet:

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

Performance im Vergleich zu anderen Threading-Modellen

Ich habe persönlich TBB in der Parallel, in dem ich habe im Vergleich zu TBB OpenMP, OpenCL, Kokkos, RAJA, C ++ 17 parallel STL und andere Modelle. Sehen Sie sich das C ++ Unterverzeichnis .

Die folgende Abbildung zeigt die relative Performance der oben genannten Modelle auf einem Intel Xeon Phi 7250 Prozessor zeigt (die Details sind nicht wichtig - alle Modelle die gleichen Einstellungen verwendet). Wie man sehen kann, tut TBB recht gut, außer für kleinere Problemgrößen, wo der Aufwand für adaptive Zeitplanung relevanter ist. TBB hat -drehknöpfe, dass diese Ergebnisse beeinflussen wird.

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

.

Ich habe TBB kurz verwendet, und es wird wahrscheinlich in Zukunft noch mehr nutzen. Ich mochte es verwendet wird, vor allem, weil Sie mit Makros / Erweiterungen von C ++ zu tun haben nicht, sondern bleiben in der Sprache. Auch seine ziemlich tragbar. Ich habe es beide verwendet auf Windows und Linux. Eine Sache aber: es schwierig ist, mit einem Gewinde arbeiten TBB verwenden, würden Sie im Hinblick auf die Aufgaben denken (das ist eigentlich eine gute Sache). Intel TBB würde die Nutzung von nackten Sperren nicht unterstützen (es wird diese mühsame machen). Aber alles in allem, dies ist meine erste Erfahrungen.

Ich würde auch empfehlen, einen Blick auf OpenMP 3 zu haben.

ZThread ist LGPL, Sie sind begrenzt, die Bibliothek in dynamischer Verknüpfung zu verwenden, wenn nicht in einem Open-Source-Projekt arbeiten.

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

Ich schreibe dies nur, weil ich die Möglichkeit, nahm die Bibliotheken Lizenzen zu prüfen und diese sollen auch auf der Grundlage der Verwendung eine Überlegung für die Auswahl sein, einer will ihnen geben.


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

Ich habe in TBB gesucht, aber nie benutzt es in einem Projekt. Ich sah keine Vorteile (für meine Zwecke) über ZThread . Eine kurze und etwas veraltet Übersicht finden Sie hier zu finden .

Es ist ziemlich komplett mit mehreren Fadenversandoptionen, alle üblichen Synchronisationsklassen und eine sehr praktische Ausnahme basiert thread „Interrupt“ -Mechanismus. Es ist leicht erweiterbar, gut geschrieben und dokumentiert. Ich habe es auf mehr als 20 Projekten.
Es spielt auch schön mit jedem * NIX, die POSIX-Threads sowie Windows unterstützt.

Ein Blick wert.

Ich verwende TBB in einem Projekt. Es schien leichter zu sein, es als Threads zu verwenden. Es gibt Aufgaben, die parallel ausgeführt werden können. Eine Aufgabe ist nur ein Anruf zu Ihrem parallelisierten Unterprogramm. Der Lastenausgleich erfolgt automatisch. Deshalb habe ich es als eine höhere Ebene parallelisiert Bibliothek akzeptieren. Ich erreichte 2,5x auf einem 4-Kern-Intel-Prozessor ohne viel Arbeit zu beschleunigen. Es gibt Beispiele, beantworten sie Fragen über Foren und es aufrechterhalten wird, und es ist kostenlos.

Es lohnt sich ist klar, welche TBB (Threading Building Blocks), um mit anderen Alternativen (zum Beispiel C ++ 11x Gleichzeitigkeit Funktionen), um den Kontrast ist. TBB ist eine tragbare und skalierbare Bibliothek (keine Compiler-Erweiterung) mit dem Sie Ihren Code in Form von leichten Aufgaben zu schreiben, die TBB zur Verfügung, so schnell wie möglich auf den CPU-Ressourcen laufen plant. Es ist nicht die Unterstützung für andere Zwecke entwickelt Threading (z Vorkaufsrecht).

I TBB habe verwendet zu beschleunigen bestehende Bildverarbeitung für die Schleifen über Bildabtastlinien in parallel_for Schleifen (ein Minimum von 2-4 Abtastzeilen als ‚Korn‘ size). Dies war sehr erfolgreich. Es erfordert die Schleife Körper (re) geschrieben ist, eine beliebige Index anstatt unter der Annahme, jeder Schleifenkörper sequentiell (z.B. Zeigern, die zwischen jeder Schleifeniteration inkrementiert werden) verarbeitet wird, zu verarbeiten.

Dies war ein ziemlich trivialer Fall, da es kein gemeinsam genutzten Speicher war zu aktualisieren. Mit den leistungsfähigeren Funktionen (z Pipeline) wird erhebliches reimagining erfordern und / oder Umschreiben von vorhandenen Code so ist vielleicht besser geeignet, um neuen Code.

Es ist ein leistungsfähiger Vorteil, dass dieser TBB-basierte Code tragbar bleibt, scheint nicht mit anderem Code an anderer Stelle im gleichen Prozess zu stören gleichzeitig andere Threading-Strategien und später mit einer höheren oder niedrigeren Ebenen mit Multiprozessing Strategien kombiniert werden (zB der TBB parallel_for Code aus einem Filter in einer TBB Multiprozessing Pipeline bezeichnet werden könnte).

Haben Sie unter Bibliothek mit Thread API ?

  

Die Threading Building Blocks (TBB) in   die Open-Source-Version, (es gibt eine   neue kommerzielle Version, $ 299, nicht   kennen die Unterschiede noch) ist GNU   General Public License Version 2 mit   ein sogenannter „Runtime Exception“ (das   gilt nur für den Einsatz auf   freie Software zu schaffen.) Ich habe gesehen,   Ausnahmen andere Runtime, die versuchen,   zu nähern LGPL aber ermöglichen   Kommerzielles Nutzung und statische Linken diese   ist nicht der Fall.

Nach dieser Frage Threading Building Blocks ohne Kopie links Einschränkungen mit kommerziellen Gebrauch verwendbar ist.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top