J'utilise std::for_each
avec std::execution::par
pour effectuer des calculs complexes sur une énorme entrée représentée comme vecteur de structures. Le calcul ne nécessite aucun délai lié au matériel (réseau ou disque IO par exemple), il s'agit d'un calcul "juste CPU". Pour moi, il semble logique qu'il n'y ait aucun sens à créer plus de threads d'OS que nous en avons de matériels; cependant, Visual C ++ 2019 crée en moyenne 50 threads, et parfois jusqu'à 500, même s'il n'y a que 12 threads matériels.
Existe-t-il un moyen de limiter le nombre de threads parallèles à hardware_concurrency
avec std::for_each
et std::execution::par
, ou la seule façon de créer un nombre de threads raisonnable est d'utiliser du code personnalisé avec std::thread
?
c++
multithreading
Vitalii
la source
la source
std::for_each
autres algorithmes de l'en-<algorithm>
tête. L'idée principalestd::execution::par
est de rendre le code parallèle presque aussi simple que séquentiel et de paralléliser les algorithmes existants avec un minimum de changements de code et de sémantique.Réponses:
Non, du moins pas en C ++ 17. Cependant, il existe une proposition pour
executors
une norme à venir, qui vous donne essentiellement la possibilité d'influencer le contexte d'exécution (en termes de lieu et de temps) pour l'interface de l'algorithme STL de haut niveau:Jusqu'à alors, vous devez soit votre fournisseur de confiance du compilateur qu'il sait ce qui est le mieux pour la performance globale, comme par exemple les développeurs de Visual Studio Etat :
L'autre option serait de renoncer à se fier uniquement à la bibliothèque standard et d'utiliser les implémentations STL qui présentent déjà la nouvelle proposition.
la source