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

C Discussion :

[SSE] Pourquoi est-ce plus lent?


Sujet :

C

  1. #1
    Membre éprouvé
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Juillet 2009
    Messages
    122
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Enseignant Chercheur

    Informations forums :
    Inscription : Juillet 2009
    Messages : 122
    Par défaut [SSE] Pourquoi est-ce plus lent?
    Salut à tous,

    j'ai voulu essayer les instructions SSE et mes essais ont étrangement donné un résultat plus lent pour le code soi-disant optimisé que pour le code de base.

    Voici le code de base (test01_wo_simd.c):
    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
    int main()
    {
      float a[4];
      float b[4];
      float c[4];
     
      unsigned int i;
     
      a[0] = 1; a[1] = 2; a[2] = 3; a[3] = 4;
      b[0] = 5; b[1] = 6; b[2] = 7; b[3] = 8;
     
      for (i = 0; i < 100000000; ++i)
      {
        c[0] = a[0] + b[0];
        c[1] = a[1] + b[1];
        c[2] = a[2] + b[2];
        c[3] = a[3] + b[3];
      }
     
      return 0;
    }
    Et voici le code avec SSE (test01.c):
    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
    #include <xmmintrin.h>
     
    int main()
    {
      float a[4] __attribute__ ((aligned (16)));
      float b[4] __attribute__ ((aligned (16)));
      float c[4] __attribute__ ((aligned (16)));
     
      __m128 v1, v2, v3;
     
      unsigned int i;
     
      a[0] = 1; a[1] = 2; a[2] = 3; a[3] = 4;
      b[0] = 5; b[1] = 6; b[2] = 7; b[3] = 8;
      v1 = _mm_load_ps(a);
      v2 = _mm_load_ps(b);
     
      for (i = 0; i < 100000000; ++i)
      {
        v3 = _mm_add_ps(v1, v2);
        _mm_store_ps(c, v3);
      }
     
      return 0;
    }
    Je compile ces deux fichiers sans optimisation et j'obtiens les temps suivants:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    $ gcc -c test01_wo_simd.c -O0
    $ gcc -o test01_wo_simd test01_wo_simd.o
    $ time ./test01_wo_simd
     
    real	0m0.342s
    user	0m0.344s
    sys	0m0.000s
    $ gcc -c test01.c -msse -O0
    $ gcc -o test01 test01.o
    $ time ./test01
     
    real	0m0.770s
    user	0m0.768s
    sys	0m0.000s
    Conclusion, le code avec les instructions SSE est environ deux fois plus lent Comment cela se fait-il? Qu'est-ce que je ne fais pas correctement? Peut-être que j'oublie de passer une option particulière à gcc?

    Merci pour tout éclaircissement.

  2. #2
    Membre émérite

    Homme Profil pro
    Directeur des systèmes d'information
    Inscrit en
    Septembre 2010
    Messages
    450
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val d'Oise (Île de France)

    Informations professionnelles :
    Activité : Directeur des systèmes d'information

    Informations forums :
    Inscription : Septembre 2010
    Messages : 450
    Par défaut
    Que donne chacun de ces programmes en O2 et O3?
    Si vous moinsez, merci de répondre pour argumenter!
    Ma présentation

  3. #3
    Membre éprouvé
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Juillet 2009
    Messages
    122
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Enseignant Chercheur

    Informations forums :
    Inscription : Juillet 2009
    Messages : 122
    Par défaut
    Voici les résultats en O2 et en O3 (je donne aussi ceux en O0 sur la machine où je suis actuellement, elle est à peu près équivalente à la précédente):
    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
    $ gcc -c test01_wo_simd.c -O0
    $ gcc -o test01_wo_simd test01_wo_simd.o
    $ time ./test01_wo_simd
     
    real	0m0.390s
    user	0m0.388s
    sys	0m0.000s
    $ gcc -c test01_wo_simd.c -O2
    $ gcc -o test01_wo_simd test01_wo_simd.o
    $ time ./test01_wo_simd
     
    real	0m0.001s
    user	0m0.000s
    sys	0m0.004s
    $ gcc -c test01_wo_simd.c -O3
    $ gcc -o test01_wo_simd test01_wo_simd.o
    $ time ./test01_wo_simd
     
    real	0m0.001s
    user	0m0.000s
    sys	0m0.000s
    $ gcc -c test01.c -msse -O0
    $ gcc -o test01 test01.o
    $ time ./test01
     
    real	0m0.801s
    user	0m0.796s
    sys	0m0.000s
    $ gcc -c test01.c -msse -O2
    $ gcc -o test01 test01.o
    $ time ./test01
     
    real	0m0.001s
    user	0m0.000s
    sys	0m0.000s
    $ gcc -c test01.c -msse -O3
    $ gcc -o test01 test01.o
    $ time ./test01
     
    real	0m0.001s
    user	0m0.000s
    sys	0m0.000s
    Avec l'optimisation, gcc découvre naturellement que la boucle ne sert à rien et le temps devient presque nul.

    Par contre, juste une remarque: pour faire un essai, j'ai supprimé la ligne contenant le _mm_store_ps. Vu qu'il n'y a plus de transfert entre __m128 et float *, le code est plus rapide (environ 0.5 s) mais reste supérieur au code de base...

  4. #4
    Membre éprouvé
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Juillet 2009
    Messages
    122
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Enseignant Chercheur

    Informations forums :
    Inscription : Juillet 2009
    Messages : 122
    Par défaut
    C'est bon, j'ai trouvé beaucoup d'informations sur le site:
    http://www.formboss.net/blog/2010/10...sics-tutorial/

    Les exemples de ce site se comportent comme attendu et il y a des explications sur les différences de vitesse entre un code de base et un code utilisant les instructions SSE.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [RAM] la vitesse de ma mémoire est incorrecte, plus lente que avant.
    Par clavier12AZQSWX dans le forum Composants
    Réponses: 3
    Dernier message: 24/02/2013, 10h02
  2. Réponses: 76
    Dernier message: 29/03/2011, 16h15
  3. Pourquoi est ce plus efficace ?
    Par alex_pi dans le forum Haskell
    Réponses: 19
    Dernier message: 24/08/2008, 19h00
  4. Un ordinateur avec deux OS est-il plus lent ?
    Par HAL 9000 dans le forum Administration système
    Réponses: 2
    Dernier message: 27/12/2006, 10h19
  5. Pourquoi surfer sous linux est plus lent sous suse
    Par spiwis dans le forum Applications et environnements graphiques
    Réponses: 5
    Dernier message: 12/12/2005, 12h21

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