Ist es möglich, die Anzahl der Threads für C ++ 17 parallel `for_each` zu begrenzen?

10

Ich verwende std::for_eachmit std::execution::par, um komplexe Berechnungen für große Eingaben durchzuführen, die als Vektor von Strukturen dargestellt werden. Die Berechnung erfordert keine Verzögerungen in Bezug auf Hardware (z. B. Netzwerk- oder Festplatten-E / A), sondern ist "nur CPU" -Berechnung. Für mich sieht es logisch aus, dass es keinen Sinn macht, mehr Betriebssystem-Threads zu erstellen, als wir Hardware-Threads haben. Visual C ++ 2019 erstellt jedoch durchschnittlich 50 Threads, und manchmal bis zu 500, selbst wenn nur 12 Hardware-Threads vorhanden sind.

Gibt es eine Möglichkeit, die Anzahl paralleler Threads auf hardware_concurrencymit std::for_eachund zu beschränken std::execution::par, oder die einzige Möglichkeit, eine angemessene Anzahl von Threads zu erstellen, besteht darin, benutzerdefinierten Code mit zu verwenden std::thread?

Vitalii
quelle
open-std.org/jtc1/sc22/wg21/docs/papers/2016/… - aber ich denke, es ist immer noch ein Vorschlag?
Caramiriel
1
Selbst wenn dies eines Tages zum Standard wird, besteht das Hauptproblem des Thread-Pools darin, dass es viel niedriger ist als std::for_eachandere Algorithmen aus dem <algorithm>Header. Die Hauptidee dahinter std::execution::parbesteht darin, parallelen Code so einfach wie sequentiellen Code zu machen und vorhandene Algorithmen mit minimalen Code- und Semantikänderungen zu parallelisieren.
Vitalii

Antworten:

5

Ist es möglich, die Anzahl der Threads für C ++ 17 parallel zu begrenzen for_each?

Nein, zumindest nicht in C ++ 17. Es gibt jedoch einen Vorschlag für executorseinen kommenden Standard, der Ihnen grundsätzlich die Möglichkeit gibt, den Ausführungskontext (in Bezug auf Ort und Zeit) für die STL-Algorithmusschnittstelle auf hoher Ebene zu beeinflussen:

thread_pool pool{ std::thread::hardware_concurrency() };
auto exec = pool.executor();
std::for_each(std::execution::par.on(exec), begin(data), end(data), some_operation);

Bis dahin müssen Sie entweder das Vertrauen der Compiler - Anbieter , dass er weiß , was für die Gesamtleistung am besten ist, wie zum Beispiel der Entwickler von Visual Studio Zustand :

Die Planung in unserer Implementierung wird vom Windows-System-Thread-Pool übernommen. Der Thread-Pool nutzt Informationen, die der Standardbibliothek nicht zur Verfügung stehen, z. B. was andere Threads auf dem System tun, auf welche Kernel-Ressourcen-Threads warten und ähnliches. Es wird festgelegt, wann weitere Threads erstellt und wann sie beendet werden sollen. Es wird auch mit anderen Systemkomponenten geteilt, einschließlich solchen, die C ++ nicht verwenden.

Die andere Möglichkeit wäre, auf das alleinige Verlassen auf die Standardbibliothek zu verzichten und STL-Implementierungen zu verwenden, die bereits den neuen Vorschlag enthalten.

Jodocus
quelle