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.