[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:
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:
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:
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 :cry: 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.