Kontrollieren Sie den Grad der Parallelität mit std :: async

8

Gibt es eine Möglichkeit, den Grad der Parallelität (= die Anzahl der separaten Threads), der von std::async und verwandten Klassen verwendet wird, explizit festzulegen / einzuschränken?

Durch die Verwendung der Thread-Support-Bibliothek wurde nichts vielversprechendes gefunden.

Soweit ich herausfinden konnte, verwenden std::async Implementierungen (normalerweise?) intern einen Thread-Pool. Gibt es standardisierte API, um dies zu kontrollieren?

Für Hintergrund: Ich bin in einer Einstellung (geteilter Cluster), wo ich die Anzahl der verwendeten Kerne manuell begrenzen muss. Wenn ich dies nicht schaffe, löst der Lastverteilungsplaner eine Anpassung aus, und ich werde bestraft. Insbesondere enthält std::thread::hardware_concurrency() keine nützlichen Informationen, da die Anzahl der physischen Kerne für die Einschränkungen, unter denen ich mich befinde, irrelevant ist.

Hier ist ein relevanter Codeabschnitt (der in C ++ 17 mit Parallelismus TS wahrscheinlich mit geschrieben würde parallel std::transform ):

%Vor%

Vom Standpunkt des Designs aus hätte ich erwartet, dass die Klasse std::execution::parallel_policy (aus dem Parallelismus TS) das Spezifizieren erlaubt (genau so habe ich es in dem Rahmen gemacht, den ich für meine Masterarbeit entworfen habe). Aber das scheint nicht der Fall zu sein.

Idealerweise möchte ich eine Lösung für C ++ 11, aber wenn es eine für spätere Versionen gibt, würde ich immer noch gerne darüber wissen (obwohl ich es nicht benutzen kann).

    
Konrad Rudolph 14.07.2017, 15:26
quelle

2 Antworten

4

Nein. std::async ist undurchsichtig und Sie haben keine Kontrolle über die Verwendung von Threads, Thread-Pools oder irgendetwas anderem. Tatsächlich haben Sie nicht einmal die Garantie, dass es überhaupt einen Thread verwenden würde - es könnte genauso gut in demselben Thread ausgeführt werden (möglicherweise, beachten Sie den @TC-Kommentar unten), und eine solche Implementierung wäre immer noch konform.

Die C ++ - Threading-Bibliothek sollte niemals die Feinabstimmung der OS / Hardware-spezifischen Eigenschaften der Thread-Verwaltung übernehmen. Daher muss ich in Ihrem Fall die richtige Unterstützung für die eigentliche Unterstützung codieren, möglicherweise unter Verwendung der von OS bereitgestellten Thread-Steuerelemente .

    
SergeyA 14.07.2017, 15:37
quelle
2

Wie andere Leute bemerkt haben, lässt std::async das nicht zu.

Noch

Sie beschreiben einen der einfacheren Anwendungsfälle von Executors , die derzeit noch im Design-Space von C ++ Standardization herumspringen. gerade jetzt in Studiengruppe 1: Parallelität .

Da das Lesen von Vorschlägen für WG21-Standards ein Schlag sein kann, haben die Autoren hilfreich mit beiden Prototypen Referenzimplementierung nur für Header und Beispielcode .

Es enthält sogar einen statischen Thread-Pool und ein Beispiel für fast genau das, was Sie wollen: async_1.cpp

%Vor%

Vielen Dank an @ jared-hoberock, dass er mich auf P0668R0 aufmerksam gemacht hat, da er viel einfacher ist als P0443R1 , auf die ich in einer früheren Version dieser Antwort verwiesen habe.

Diese Vereinfachung wurde angewandt, und jetzt gibt es sowohl eine Beschreibung der Gründe ( P0761R0 ) als auch eine viel einfachere Version des Standards Formulierung in P0443R2 .

Ab Juli 2017 ist die einzige tatsächliche Vermutung, die ich bei der Lieferung dieses gesehen habe,: Michael Wong, Herausgeber der Nebenläufigkeit TS --- das Standardisierungsvehikel für Executors --- fühlt sich " zuversichtlich, dass es in C ++ 20 geht .

    
TBBle 16.07.2017 10:10
quelle