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

Boost C++ Discussion :

boost::ublas étrangement lent.


Sujet :

Boost C++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Rédacteur
    Avatar de Bakura
    Homme Profil pro
    Étudiant
    Inscrit en
    Septembre 2005
    Messages
    1 386
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Septembre 2005
    Messages : 1 386
    Par défaut boost::ublas étrangement lent.
    Bonjour,

    Je suis en train actuellement de coder une classe vectoriel en utilisant les expressions templates, et histoire de voir ce que ça donnait, j'ai fait quelques comparaisons avec une classe template mais sans expression template (une classe codé plus naïvement on va dire), et avec boost::ublas, parceque j'étais curieux de voir ce que ça allait donner.

    Alors que je m'attendais à ce que ublas ridiculise carrément ma classe, ça a été tout le contraire, et je pense qu'il y a un problème quelque part.

    Mon compilo est la dernière version de GCC (3.4.2 je crois), et l'IDE Code::Blocks. Je compile le programme en mode release, avec les options Optimize Fully (for speed) et Expensive Optimizations et les optimisations de l'architecture CPU Athlon XP d'activées.

    Pour mesurer, j'utilise QueryPerformanceCounter et QueryPerformanceFrequency. Je fais 10 séries de cent mille du calcul v1 = v2 + v3 + v1, et voici ce que j'obtient comme performance :

    boost : 0.888361
    moi : 0.0229465
    classe "naïve" : 0.10339

    En relançant plusieurs fois l'applicaiton j'obtient en gros les mêmes résultats donc il ne doit pas trop y avoir de mises en cache, et sinon l'execution confirme les résultats, lorsqu'il fait les calculs de boost, on voit que c'est plus beaucoup plus lent. J'ai aussi vérifié que les résultats soient identiques à la fin.

    Voici comment j'utilise boost::ublas :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    boost::numeric::ublas::vector <double> A (3);
       A(1) = 1.0, A(2) = 1.0, A(0) = 1.0;
       boost::numeric::ublas::vector <double> B (3);
       B(1) = 2.0, B(2) = 2.0, B(0) = 2.0;
       boost::numeric::ublas::vector <double> C (3);
       C(1) = 3.0, C(2) = 3.0, C(0) = 3.0;
     
       for (size_t i = 0 ; i != 10 ; ++i)
       {
          for (size_t j = 0 ; j != 100000 ; ++j)
          {
             A = C+B+A;
          }
       }
    Donc si quelqu'un s'en serait déjà servi, où si ce n'est pas tellement dans ce genre d'applications que boost::ublas est efficace, j'en sais rien

  2. #2
    Expert confirmé
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Décembre 2003
    Messages
    3 549
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

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

    Informations forums :
    Inscription : Décembre 2003
    Messages : 3 549
    Par défaut
    Mon compilo est la dernière version de GCC (3.4.2 je crois)
    GCC 3.4.2 est vieux, la dernière version c'est la 4.1.0.
    Mais bon pour Windows, c'est compliqué d'avoir des versions plus récentes, en particulier si tu veux garder une ABI compatible avec celui de MSVC++.

    Sinon, à part ça, t'es sûr que tes codes font vraiment la même chose ?

  3. #3
    Rédacteur
    Avatar de Bakura
    Homme Profil pro
    Étudiant
    Inscrit en
    Septembre 2005
    Messages
    1 386
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Septembre 2005
    Messages : 1 386
    Par défaut
    Citation Envoyé par loufoque
    GCC 3.4.2 est vieux, la dernière version c'est la 4.1.0.
    Mais bon pour Windows, c'est compliqué d'avoir des versions plus récentes, en particulier si tu veux garder une ABI compatible avec celui de MSVC++.

    Sinon, à part ça, t'es sûr que tes codes font vraiment la même chose ?
    Oui oui, j'obtient exactement les mêmes résultats à la fin des calculs, donc il font la même chose... Pour GCC, je vais voir si je peux réinstaller une version plus récente.

    EDIT : pourtant sur le site de MinGW, la dernière version en date est la 3.4.5 :p. J'ai vu sur le site de GCC qu'ils en sont à la 4.2.0, et j'ai une question, car j'ai aussi Linux, et de base il y a une version de GCC installée sous Linux ?

  4. #4
    Expert confirmé
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Décembre 2003
    Messages
    3 549
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

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

    Informations forums :
    Inscription : Décembre 2003
    Messages : 3 549
    Par défaut
    Oui oui, j'obtient exactement les mêmes résultats à la fin des calculs, donc il font la même chose...
    C'est pas ça que je veux dire.
    Par exemple, les vecteurs dans ublas utilisent de l'allocation dynamique. Toi peut-être pas.

    J'ai vu sur le site de GCC qu'ils en sont à la 4.2.0, et j'ai une question, car j'ai aussi Linux, et de base il y a une version de GCC installée sous Linux ?
    Ah oui pardon, la c'est la 4.2.0 la dernière, pas la 4.1.0.
    La plupart des distributions ont un système de paquets avec bien sûr GCC, mais pas nécessairement la dernière version, ni nécessairement installé par défaut.
    Par exemple, sur Ubuntu Feisty Fawn y'a GCC 4.1.2 et ce n'est pas installé par défaut.

  5. #5
    Rédacteur
    Avatar de Bakura
    Homme Profil pro
    Étudiant
    Inscrit en
    Septembre 2005
    Messages
    1 386
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Septembre 2005
    Messages : 1 386
    Par défaut
    Ouep, je viens de regarder rapidement les sources, on dirait qu'il y a une allocation dynamique de leur vecteur (ils n'ont pas une taille fixe, alors que moi si), mais quand même, ça peut faire une différence aussi grande ?

  6. #6
    Inactif  
    Profil pro
    Inscrit en
    Mars 2004
    Messages
    743
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2004
    Messages : 743
    Par défaut
    Je vois au moins 2 problèmes possibles:
    -ton bench est très probablement mauvais: trop de boucles sur des vecteurs trop petits. Tu veux pas mesurer le temps d'exexution de tes boucle for. Fais plutôt une seule boucle de calculs, et utilise de grands vecteurs
    -utilise une longueur multiple de 2 pour les doubles, multiple de 4 pour les floats. Car sinon t'as de bonnes chances que les librairies n'utilisent pas les instructions SSE/SSE2

  7. #7
    Expert confirmé
    Avatar de Luc Hermitte
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2003
    Messages
    5 292
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Août 2003
    Messages : 5 292
    Par défaut
    Citation Envoyé par loufoque
    GCC 3.4.2 est vieux, la dernière version c'est la 4.1.0.
    Mais bon pour Windows, c'est compliqué d'avoir des versions plus récentes, en particulier si tu veux garder une ABI compatible avec celui de MSVC++.
    Cette semaine, j'ai vu passer des mails relatifs à un port de GCC 4.3 pour cygwin.
    C'est encore laborieux. Je sens qu'il ne va pas falloir s'attende à une version récente de GCC pour windows (cygwin comme mingw) avant encore un bon moment.
    Blog|FAQ C++|FAQ fclc++|FAQ Comeau|FAQ C++lite|FAQ BS|Bons livres sur le C++
    Les MP ne sont pas une hotline. Je ne réponds à aucune question technique par le biais de ce média. Et de toutes façons, ma BAL sur dvpz est pleine...

  8. #8
    Inactif  
    Profil pro
    Inscrit en
    Mars 2004
    Messages
    743
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2004
    Messages : 743
    Par défaut
    Y'en a qui compilent quand-même sous Windows les versions récentes de GCC.
    http://www.develer.com/oss/GccWinBinaries

    Sous cygwin il suffit de taper une commande du genre, pour compiler avec cette version.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    export PATH="/cygdrive/c/Program Files/MinGW/bin/":$PATH
    Ca compile bien pour moi.
    Par contre je ne sais pas quoi faire pour que le linker marche.

  9. #9
    Expert confirmé
    Avatar de Luc Hermitte
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2003
    Messages
    5 292
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Août 2003
    Messages : 5 292
    Par défaut
    Cela remonte à deux versions de GCC. Et c'est pour du MingW, et non du Cygwin visiblement. (ne pouvant pas avoir de version correcte de mutt avec MingW, je l'ai laissé tomber il y a bien longtemps.)
    Bref, rien d'officiel avant un bon moment -- j'avais oublié une partie des choses que je voulais dire
    Blog|FAQ C++|FAQ fclc++|FAQ Comeau|FAQ C++lite|FAQ BS|Bons livres sur le C++
    Les MP ne sont pas une hotline. Je ne réponds à aucune question technique par le biais de ce média. Et de toutes façons, ma BAL sur dvpz est pleine...

  10. #10
    Inactif  
    Profil pro
    Inscrit en
    Mars 2004
    Messages
    743
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2004
    Messages : 743
    Par défaut
    J'avais bien compris que tu voulais dire: rien "d'officiel" avant longtemps.
    J'ai jamais compris la différence entre Cygwin et MinGW (j'utilise que cygwin), mas en tout cas le compilo lui-même marche bien, mais je ne sais pas comment réparer l'édition de lien.
    Quelqu'un sait?

    Quand j'avais cherché y'a plusieurs mois une version 4 de Gcc sous Windows, j'avais lu qu'ils ne prévoyaient pas faire une version officielle avant la 4.2. Visiblement y'avait trop de problèmes de régression. Mais maintenant tu nous apprends que ça ne sera même pas pour la version 4.3...

Discussions similaires

  1. ublas excessivement lent
    Par Invité dans le forum Boost
    Réponses: 4
    Dernier message: 25/02/2011, 17h30
  2. boost::timer trop lent.
    Par nuKs dans le forum Boost
    Réponses: 13
    Dernier message: 28/01/2011, 10h57
  3. Boost.uBlas et sous-vecteur de matrice
    Par Le Farfadet Spatial dans le forum Boost
    Réponses: 11
    Dernier message: 30/04/2008, 23h25
  4. [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, 22h03
  5. probleme boost::ublas
    Par p_moiret dans le forum Bibliothèques
    Réponses: 4
    Dernier message: 19/12/2005, 16h10

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