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
etmemory
: (... 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à?
Intel a publié une bibliothèque STL Parallel qui respecte le standard C++ 17:
C'est en train de fusionner dans GCC .
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;
}
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.