web-dev-qa-db-fra.com

Comment utiliser les nouvelles règles d'exécution C++ 17?

Je lisais la documentation std :: algorithm sur (cppreference.com } _ et j'ai remarqué une balise C++ 17 sur beaucoup de choses intéressantes que je n'avais pas encore utilisées. Ce qui a le plus attiré mon attention, c’est les nouvelles règles d’exécution. Ce que j’ai compris à leur sujet, c’est que je peux créer une boucle for_each que je veux créer en multitâche en spécifiant simplement une règle d’exécution.

Par exemple, j'ai un programme qui sort une image avec un graphique 2D.

int main(){
    std::for_each(
        img.buffer().begin(),
        img.buffer().end(),
        renderer(
            {-0.5, 0.0, 2.666, 2.0, M_PI / 2.0, 0.0},
            img,
            16
        )
    );
    fout << img;
}

Si je veux rendre ce programme multithread, je devrais pouvoir le faire avec une seule ligne.

int main(){
    std::for_each(
        std::execution::par_unseq, // c++17 feature
        img.buffer().begin(),
        img.buffer().end(),
        renderer(
            {-0.5, 0.0, 2.666, 2.0, M_PI / 2.0, 0.0},
            img,
            16
        )
    );
    fout << img;
}

Cependant, quand j'ai essayé pour la première fois (avec g++ -std=c++17), j'ai eu une erreur qui me disait que ‘std::execution’ has not been declared, alors j'ai essayé d'ajouter #include <execution> mais il y est écrit execution: No such file or directory. J'ai aussi essayé #include<experimental/algorithm> au lieu de #include<algorithm> mais j'obtiens le même résultat. Comment utiliser cette nouvelle fonctionnalité?

14
Willy Goat

c ++ 17 n'était pas encore finalisé. Et divers compilateurs ne l’ont pas encore complètement implémentée.

-std=c++17 signifie "donnez-moi tout le C++ 17 que vous avez terminé" et non "soyez un compilateur C++ 17 parfaitement valide".

Cette fonctionnalité n'est pas prise en charge par votre compilateur et/ou la bibliothèque standard à ce stade. Revenez dans quelques semaines/mois/années.

Il n’existe pas de drapeau généralement accepté "donnez-moi s'il vous plaît C++ 17 si vous le supportez entièrement, sinon donnez-moi une erreur", vous pouvez le transmettre à un compilateur; en partie parce que son utilisation est peu pratique. Si le sous-ensemble de C++ 17 fourni est suffisant, vous gagnez. Et si vous avez besoin d'un compilateur entièrement compatible, certaines versions des compilateurs ne savent pas s'ils ont des bogues, vous ne pouvez donc pas faire confiance au drapeau de toute façon et vous devrez le tester par rapport aux versions du compilateur. Et si vous savez déjà quelles versions du compilateur ont suffisamment de C++ 17 valide, vous n'avez pas besoin d'indicateur pour vous le dire.

10

D'après ce que j'ai compris de cppreference , Cette fonctionnalité est définie dans le document P0024R2 et elle n'est encore prise en charge par aucun compilateur.

1
Vladimir Nechaev

Pour le compilateur Microsoft: voir C++ 17 Progression dans VS 2017 15.5 et 15.6 où vous trouverez:

Status  Std   Paper   Title
Partial C++17 P0024R2 Parallel Algorithms

Pour GCC, Fanael a écrit dans son commentaire , voir Tableau 1.5. État d'implémentation C++ 2017 à https://gcc.gnu.org/onlinedocs/libstdc++/manual/status.html#status.iso.2017 où vous trouverez

Library Feature                             Proposal    Status
The Parallelism TS Should be Standardized   P0024R2     No
0

Si vous utilisez g ++, vous pouvez essayer l'extension non standard:

https://gcc.gnu.org/onlinedocs/libstdc++/manual/parallel_mode.html

0
sashang