IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Langage C++ Discussion :

Utilisation de boost::chrono::process_user_cpu_clock


Sujet :

Langage C++

  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Avril 2012
    Messages
    96
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2012
    Messages : 96
    Par défaut Utilisation de boost::chrono::process_user_cpu_clock
    Bonjour
    Pour faire un test de benchmark j'ai pensé utiliser boost::chrono::process_user_cpu_clock.
    J'ai la dernière version de boost mais apparemment cela ne suffit pas. Voici un petit programme qui ne compile plus si on décommente le bloc.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    #include <iostream>
    #include <boost/chrono/include.hpp>
     
    using namespace std;
    using namespace boost;
    using namespace boost::chrono;
     
     
    int main()
    {
        cout << "Hello world!" << endl;
     
    #ifdef BOOST_CHRONO_HAS_CLOCK_STEADY
      cout<<"\n YES 1";
    #endif
     
    #ifdef BOOST_CHRONO_HAS_PROCESS_CLOCKS
      cout<<"\n YES 2";
    #endif
     
    #ifdef BOOST_CHRONO_HAS_THREAD_CLOCK
     cout<<"\n YES 3";
    #endif
     
    /*
    std::cout << system_clock::now() << '\n';
     
    #ifdef BOOST_CHRONO_HAS_CLOCK_STEADY
      std::cout << steady_clock::now() << '\n';
    #endif
     
    std::cout << high_resolution_clock::now() << '\n';
     
    #ifdef BOOST_CHRONO_HAS_PROCESS_CLOCKS
      std::cout << process_real_cpu_clock::now() << '\n';
      std::cout << process_user_cpu_clock::now() << '\n';
      std::cout << process_system_cpu_clock::now() << '\n';
      std::cout << process_cpu_clock::now() << '\n';
    #endif
     
    #ifdef BOOST_CHRONO_HAS_THREAD_CLOCK
      std::cout << thread_clock::now() << '\n';
    #endif
     
    */
        return 0;
    }
    J'ai droit au message d'erreur
    ... undefined reference to `boost::chrono::system_clock::now()'
    Idem pour les autres.

    Il faut sans doute faire quelque chose en plus mais quoi ? Merci d'avance pour vos réponses.

    PS : je sais qu'il y a un forum spécial pour boost mais la dernière question date du 08/07/2024 et est restée sans réponse depuis. En outre le fil [Actualité] date de ... 2012 !
    Ne m'en veuillez pas de poser ma question ici.

  2. #2
    Membre Expert
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2011
    Messages
    771
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Juin 2011
    Messages : 771
    Par défaut
    Et comment compiles-tu ? Il semble manquer la lib pendant la phase de link. Au pif, libbost_chrono.

  3. #3
    Membre confirmé
    Profil pro
    Inscrit en
    Avril 2012
    Messages
    96
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2012
    Messages : 96
    Par défaut
    En fait, d'après 'The Boost C++ Libraries' https://theboostcpplibraries.com/boost.timer
    j'ai besoin de Boost.chrono et de Boost.timer

    Ces deux librairies doivent être compilées séparément.
    Dans 'Getting Started on Windows' https://www.boost.org/doc/libs/lates...d/windows.html
    il est indiqué
    The only Boost libraries that must be built separately are:
    Boost.Chrono
    ....
    Boost.Timer
    ...
    Mon problème a donc évolué
    1) comment les télécharger
    2) comment les compiler
    3) où les placer

  4. #4
    Membre confirmé
    Profil pro
    Inscrit en
    Avril 2012
    Messages
    96
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2012
    Messages : 96
    Par défaut
    Merci jo_link_noir
    J'ai vu ta réponse après avoir reposté. Oui, c'est là le problème.
    J'ai été voir https://github.com/boostorg/timer/tree/boost-1.90.0
    mais je ne sais pas quoi en faire.

  5. #5
    Rédacteur/Modérateur


    Homme Profil pro
    Network game programmer
    Inscrit en
    Juin 2010
    Messages
    7 168
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : Canada

    Informations professionnelles :
    Activité : Network game programmer

    Informations forums :
    Inscription : Juin 2010
    Messages : 7 168
    Billets dans le blog
    4
    Par défaut
    steady clock et sa clique sont dans la std depuis C++11
    Pensez à consulter la FAQ ou les cours et tutoriels de la section C++.
    Un peu de programmation réseau ?
    Aucune aide via MP ne sera dispensée. Merci d'utiliser les forums prévus à cet effet.

  6. #6
    Membre confirmé
    Profil pro
    Inscrit en
    Avril 2012
    Messages
    96
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2012
    Messages : 96
    Par défaut
    Merci Bousk

    Effectivement il y a std::chrono mais ici on parle de boost::chrono.
    Dans le standard il y a une 'wall clock' mais rien qui permet d'avoir le 'user time'.
    Je crois que le 'user time' est accessible en standard sous Linux mais je n'en suis pas sûr.

    PS : je travaille sous Windows avec Code::Blocks

  7. #7
    Rédacteur/Modérateur


    Homme Profil pro
    Network game programmer
    Inscrit en
    Juin 2010
    Messages
    7 168
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : Canada

    Informations professionnelles :
    Activité : Network game programmer

    Informations forums :
    Inscription : Juin 2010
    Messages : 7 168
    Billets dans le blog
    4
    Par défaut
    Et l'implémentation std est utilisable sans avoir besoin d'ajouter aucune dépendance, surtout vu que tu ne sembles pas capable d'ajouter celle à Boost qui sont parfois bien lourdes, à fortiori quand elles ne sont pas header-only.
    Choisis ta clock.
    Pensez à consulter la FAQ ou les cours et tutoriels de la section C++.
    Un peu de programmation réseau ?
    Aucune aide via MP ne sera dispensée. Merci d'utiliser les forums prévus à cet effet.

  8. #8
    Membre confirmé
    Profil pro
    Inscrit en
    Avril 2012
    Messages
    96
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2012
    Messages : 96
    Par défaut
    @Bousk
    Que boost soit parfois un peu lourd, j'en conviens.
    Mais, en ce qui concerne mon problème, 'Boost.Chrono' fournit le 'wall time, le 'user time' (et même le 'system time' dont je n'ai pas besoin).
    Sauf erreur de ma part, le standard ne fournit que le 'wall time' avec divers degrés de précision mais pas le 'user time'.
    surtout vu que tu ne sembles pas capable d'ajouter celle à Boost
    Bien vu : mais c'est pourquoi je suis là !

  9. #9
    Membre Expert
    Femme Profil pro
    ..
    Inscrit en
    Décembre 2019
    Messages
    747
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 96
    Localisation : Autre

    Informations professionnelles :
    Activité : ..

    Informations forums :
    Inscription : Décembre 2019
    Messages : 747
    Par défaut
    Salut,

    Il me sermble que STL (Stephan Lavavej) propose toujours les binaires de boost, y compris les scripts de compilations, conf. Ming Distro sur nuwen.net, quelque chose comme ça.

  10. #10
    Modérateur

    Avatar de Bktero
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2009
    Messages
    4 499
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Juin 2009
    Messages : 4 499
    Billets dans le blog
    1
    Par défaut
    Pour faire un test de benchmark
    Je sors du cadre de la question sur Boost pour rebondir sur ça.

    Ecrire un bon benchmark est loin d'être facile. As-tu pensé à essayer des bibliothèques dédiées, comme https://github.com/google/benchmark ?

  11. #11
    Membre confirmé
    Profil pro
    Inscrit en
    Avril 2012
    Messages
    96
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2012
    Messages : 96
    Par défaut
    Merci Bktero

    Ecrire un bon benchmark est loin d'être facile.
    J'en suis bien conscient et je me passerais bien volontiers d'en bricoler un !
    En ligne, j'ai essayé 'Quick C++ Benchmark' (https://quick-bench.com/) qui, je crois, s'appuie sur celui de Google.
    Sauf erreur, il ne supporte pas boost dont j'ai besoin pour des calculs en 128 bits.

    J'ai bricolé un test en utilisant __rdtsc(). Sous Windows, il y a tellement d'opérations système que le temps d'exécution du programme est quasi aléatoire..
    En répétant 1000000 de fois (par exemple) le programme avec les mêmes données, je calcule le minimum, le maximum et la valeur moyenne.
    Des résultats typiques sont : min = 142, moyenne = 175, max = 145624.
    Et même ainsi, le minimum et la moyenne ne sont stables qu'à 10% près. C'est pour cela que je m'intéresse au temps utilisateur (le 'user time') qui est le temps réel (le 'wall time') diminué du temps système (le 'system time').

    Mais bien entendu, si je trouve un benchmark tout fait qui supporte boost, je suis preneur !

  12. #12
    Membre Expert
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2011
    Messages
    771
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Juin 2011
    Messages : 771
    Par défaut
    Je ne vois pas le rapport entre google benchmark et des calculs 128 bits. Se sont 2 choses totalement différentes.

    Quick bench est juste une interface par-dessus google benchmark sans aucune autre dépendance. Si tu veux faire des benchs avec tes propres bibliothèques, rien ne t'empêche d'utiliser google-benchmark directement et configurer ton environnement comme tu le souhaites. De toute manière, à part si c'est pour partager vite fait des petites fonctions, quick bench est tout sauf pratique: uniquement la stl et trop d'attente pour avoir un résultat, si cela ne part pas sur un timeout.

    Comme framwork de bench, je préfère nanobench que je trouve plus stable sur les temps d’exécution. Et aussi plus rapide à lancer.

    Sinon, pour avoir des temps stables sur des benchs, il vaut mieux fixer la fréquence du CPU. Nanobench le détecte et propose un script python (en tout cas sur Linux, mais je suppose que c'est la même sur Windows).

    EDIT: je viens de vérifier vite fait pour boost, mais la seule référence à wall time que je vois concerne boost::chrono::process_times qui passe par times (linux) / GetProcessTimes (Windows). Ce n'est pas le même que la stl qui est le temps écoulé indépendamment du nombre de thread. boost::chrono::process_times cumule le temps de tous les CPU, c’est-à-dire qu'un programme qui prend 1 seconde avec 10 threads qui tourne en même temps donne une durée de 10 seconde.

  13. #13
    Membre confirmé
    Profil pro
    Inscrit en
    Avril 2012
    Messages
    96
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2012
    Messages : 96
    Par défaut
    @jo_link_noir
    Je ne vois pas le rapport entre google benchmark et des calculs 128 bits.
    Je ne comprenais pas ce que tu voulais dire parce que, comme je le disais, 'Quick bench' ne reconnaît pas 'uint128_t' (entre autre) et par conséquent ne compile pas. Mais comme tu utilises nanobench (que j'ai téléchargé et qui compile parfaitement) tu ne pouvais pas comprendre ma situation.

    J'ai donc maintenant un benchmark que je peux utiliser avec boost. Cela devrait me suffire mais (par curiosité) j'aimerais bien quand même tester le 'user time' de boost.

Discussions similaires

  1. Utilisation de Boost avec MinGW sous Eclipse
    Par kimlee dans le forum Eclipse C & C++
    Réponses: 2
    Dernier message: 21/11/2008, 18h04
  2. Utilisation de Boost::Graph
    Par dj_benz dans le forum Boost
    Réponses: 6
    Dernier message: 01/10/2008, 10h56
  3. Utilisation de Boost
    Par delire8 dans le forum Boost
    Réponses: 4
    Dernier message: 01/04/2008, 23h27
  4. Utilisation de Boost.Lambda
    Par Biozic dans le forum Boost
    Réponses: 9
    Dernier message: 25/02/2008, 01h10
  5. [BOOST] utilisation de boost uBLAS non compile avec visual c++
    Par le_voisin dans le forum Autres éditeurs
    Réponses: 5
    Dernier message: 06/09/2006, 23h03

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo