Wir überlegen, welches parallele Framework für C/C++
verwendet werden soll. Wir haben einige sehr spezielle Bedingungen und sind nicht 100% sicher, dass z.B. TBB
kann etwas "more" hinzufügen.
N
laufende Threads und eine synchronisierte Arbeitswarteschlange (mit pthread
mutex). int
). Dies wird wiederholt, bis die Warteschlange leer ist.
Nun, und jetzt würde ich gerne wissen, ob ein Framework wie TBB
(Thread Building Blocks) mehr für dieses spezielle Szenario von algorithmic anbieten kann Standpunkt?? (Also, Interna ...)
Meiner Meinung nach könntest du gewinnen, indem du den schweren Mutex durch etwas robusteres ersetzt, wie den spin_rw_mutex: Ссылка . Da die Einfüge- / Entfernungsoperationen höchstwahrscheinlich schnell sind, könnten Sie mehr von einer nicht blockierenden Sperre profitieren.
TBB 4 bietet eine concurrent_priority_queue (Suche 'Priorität' im Referenzhandbuch ). Darüber hinaus ist die Verwendung von TBB nett, wenn Sie Ihr Programm mit Aufgaben statt mit Threads entwerfen können. Tatsächlich bietet es eine Menge Zeug, um Abhängigkeiten zwischen Aufgaben zu beschreiben. Außerdem scheint TBB ziemlich portabel zu sein, wenn es für Sie wichtig ist.
Ich würde vorschlagen, dass Sie sich die TBB-Modul-Übersichtsseiten ansehen und nachsehen, ob da etwas ist ist nützlich für dich.
Im Abschnitt Container zum Beispiel gibt es kein concurrent_queue< T, A >
, "Eine Hochleistung Thread-sichere nicht blockierende gleichzeitige Warteschlange. " Es handelt sich nicht um eine Prioritätswarteschlange, daher müssten Sie diese auch selbst erstellen.
Auf der anderen Seite gibt es unter Synchronisation einige Mutex-Varianten, die Ihnen das Leben erleichtern könnten.
Bottom line: TBB ist nicht wirklich diese Magie, aber es kann hilfreich sein.
TBB kann Ihnen Folgendes bieten:
Bitte beachten Sie, dass Sie selbst dann, wenn Sie alles richtig und intensiv mit TBB tun, keinen Leistungsgewinn im Vergleich zu Ihrer eigenen Leistung bemerken. Es hängt stark von Ihrem System ab, insbesondere wenn die Kommunikation zwischen den Threads und insbesondere die Synchronisation ein Engpass ist. Es ist normalerweise, wenn Ihre Aufgaben klein sind und es viele von ihnen gibt.
Ich habe mit einem Parallelisierungsframework einschließlich OpenMP, Cilk gearbeitet. Das ergibt eine schöne Abstraktion und macht das Parallelisieren vergleichsweise einfach. Ich bezweifle jedoch, ob diese Prioritätswarteschlangen direkt unterstützen oder sogar, wenn Sie ihre Task Queue ändern können.
Sie können prioritätsbasierte Warteschlangen verwenden, indem Sie dies angepasste TaskQueue.
Wenn Sie TBB verwenden wollen, habe ich es mit OpenMP verwendet und es scheint sich sehr gut zu integrieren. Außerdem müssen Sie sich keine Gedanken über gleichzeitige Container machen. Und es ist sehr zuverlässig im Vergleich zu anderen Implementierungen von Menschen.
Hoffe, das hilft.
Tags und Links c c++ multithreading gcc tbb