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):
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 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; }
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
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; }
Conclusion, le code avec les instructions SSE est environ deux fois plus lent
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.000sComment 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.
Partager