web-dev-qa-db-fra.com

Les algorithmes parallèles C++ 17 sont-ils déjà implémentés?

J'essayais de jouer avec les nouvelles fonctionnalités de bibliothèque parallèle proposées dans la norme C++ 17, mais je ne pouvais pas le faire fonctionner. J'ai essayé de compiler avec les versions à jour de g++ 8.1.1 et clang++-6.0 et -std=c++17, mais ni l'une ni l'autre ne semblait prendre en charge #include <execution>, std::execution::par ou quelque chose de similaire. 

Quand on regarde le cppreference pour les algorithmes parallèles, il existe une longue liste d’algorithmes, affirmant 

Les spécifications techniques fournissent des versions parallélisées des 69 algorithmes suivants de algorithm, numeric et memory: (... longue liste ...)

qui sonne comme si les algorithmes sont prêts 'sur papier', mais pas encore prêts à être utilisés?

Dans cette SO question d'il y a plus d'un an, les réponses prétendent que ces fonctionnalités n'avaient pas encore été mises en œuvre. Mais à ce stade, je me serais attendu à une sorte de mise en œuvre. Y a-t-il quelque chose que nous pouvons utiliser déjà?

13
Romeo Valentin

Intel a publié une bibliothèque STL Parallel qui respecte le standard C++ 17:

C'est en train de fusionner dans GCC .

11
Florian Weimer

Gcc n'implémente pas encore le TS Parallelism (voir https://gcc.gnu.org/onlinedocs/libstdc++/manual/status.html#status.iso.2017 )

Cependant, libstdc ++ (avec gcc) a un mode expérimental pour certains algorithmes parallèles équivalents. Voir https://gcc.gnu.org/onlinedocs/libstdc++/manual/parallel_mode.html

Le faire fonctionner:

Toute utilisation de la fonctionnalité parallèle nécessite un compilateur supplémentaire et support d'exécution, en particulier support pour OpenMP. Ajout de ce support n’est pas difficile: il suffit de compiler votre application avec le drapeau de compilation -fopenmp. Ceci reliera dans libgomp la bibliothèque d'exécution GNU Déchargement et traitement multiple, dont la présence est obligatoire.

Exemple de code

#include <vector>
#include <parallel/algorithm>

int main()
{
  std::vector<int> v(100);

  // ...

  // Explicitly force a call to parallel sort.
  __gnu_parallel::sort(v.begin(), v.end());
  return 0;
}
3
KarlM

Vous pouvez consulter https://en.cppreference.com/w/cpp/compiler_support pour vérifier le statut d'implémentation de la fonctionnalité C++. Dans votre cas, recherchez simplement "Standardization of Parallelism TS" et vous ne trouverez que les compilateurs MSVC et Intel C++ qui prennent en charge cette fonctionnalité maintenant.

0
Nan Xiao