Ich verwende std::for_each
mit 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_concurrency
mit std::for_each
und 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
?
quelle
std::for_each
andere Algorithmen aus dem<algorithm>
Header. Die Hauptidee dahinterstd::execution::par
besteht darin, parallelen Code so einfach wie sequentiellen Code zu machen und vorhandene Algorithmen mit minimalen Code- und Semantikänderungen zu parallelisieren.Antworten:
Nein, zumindest nicht in C ++ 17. Es gibt jedoch einen Vorschlag für
executors
einen 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: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 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.
quelle