mesure
Projet L3 Informatique 2013-14, implantation de la fonction suivante et comparaison avec une implantation SSE.
float mesure_reference(char *v, char *w, uint size) {
uint i, s, d;
s = d = 0;
for (i = 0; i < size; ++i) {
if (v[i] == w[i]) ++s; else ++d;
}
return ((float) s / (float)(s + d));
}
Les figures qui suivent affichent le temps d'exécution de la fonction
pour différentes longueurs de chaines (16, 255, 511, 1023, 2047, 4095, 8191). On fait figurer :
- en ordonnée : temps en secondes
- en abscisse : la longueur des chaînes
Différentes implémentations sont proposées en fonction des technologies présentes sur le processeur:
- référence : la version de référence présentée ci-dessus
- compiler optimized : optimisée en donnant des directives pragma au compilateur
- sse asm : écrite en assembleur utilisant les instructions SSE2 + popcnt
- sse asm u4 : écrite en assembleur utilisant les instructions SSE2 + popcnt, dépliage de boucle de 4
- sse asm u8 : écrite en assembleur utilisant les instructions SSE2 + popcnt, dépliage de boucle de 8
- sse i : écrite en utilisant les intrinsics SSE2 + popcnt
- sse b : écrite en assembleur + popcnt mais en sommant en [ebp-4]
- avx asm : écrite en assembleur utilisant les instructions AVX + popcnt
- avx asm u4 : écrite en assembleur utilisant les instructions AVX + popcnt, dépliage de boucle de 4
- avx i : écrite en utilisant les intrinsics AVX + popcnt
- avx2 asm : écrite en assembleur utilisant les instructions AVX2 + popcnt
- avx2 asm u4 : écrite en assembleur utilisant les instructions AVX2 + popcnt, dépliage de boucle de 4
- avx2 asm u4 opt : version optimisée de avx2 asm u4
- avx2 asm u8 : écrite en assembleur utilisant les instructions AVX2 + popcnt, dépliage de boucle de 8
- avx2 asm u8 opt : version optimisée de avx2 asm u8
- avx2 i: écrite en utilisant les intrinsics AVX2 + popcnt
Voici quelques valeurs
Intel i5-4570 (AVX2)
i5-4570 |
3.20GHz |
gcc |
64 |
-O2 -mavx2 |
362.66 |
37.33 |
20.84 |
18.90 |
17.28 |
17.70 |
45.66 |
20.37 |
19.03 |
14.53 |
19.31 |
18.56 |
14.96 |
14.60 |
15.68 |
i5-4570 |
3.20GHz |
gcc |
64 |
-O3 -mavx2 |
365.41 |
36.15 |
20.98 |
17.57 |
15.76 |
15.72 |
48.92 |
22.78 |
21.84 |
16.42 |
21.68 |
20.31 |
15.21 |
14.99 |
16.03 |
i5-4570 |
3.20GHz |
icpc |
64 |
-O2 -xCORE-AVX2 |
59.21 |
41.78 |
21.30 |
18.84 |
17.08 |
25.04 |
49.05 |
23.20 |
21.60 |
16.42 |
22.10 |
20.72 |
15.24 |
14.12 |
14.26 |
i5-4570 |
3.20GHz |
icpc |
64 |
-O3 -xCORE-AVX2 |
57.48 |
41.88 |
20.86 |
18.52 |
16.86 |
24.14 |
48.72 |
23.18 |
21.71 |
16.36 |
21.99 |
20.90 |
14.98 |
14.55 |
14.68 |
i5-4570 |
3.20GHz |
gcc |
32 |
-O2 -mavx2 |
924.20 |
33.79 |
18.23 |
16.65 |
14.84 |
14.72 |
45.06 |
20.20 |
18.89 |
14.42 |
10.99 |
10.73 |
10.98 |
10.54 |
17.98 |
i5-4570 |
3.20GHz |
gcc |
32 |
-O3 -mavx2 |
915.57 |
35.56 |
19.12 |
17.17 |
15.25 |
14.86 |
45.48 |
20.39 |
19.05 |
14.41 |
11.38 |
10.74 |
11.56 |
11.05 |
18.97 |
i5-4570 |
3.20GHz |
icpc |
32 |
-O2 -xCORE-AVX2 |
46.04 |
38.46 |
18.25 |
16.64 |
14.93 |
21.11 |
44.77 |
21.22 |
19.45 |
14.59 |
11.07 |
10.46 |
10.90 |
10.43 |
13.16 |
i5-4570 |
3.20GHz |
icpc |
32 |
-O3 -xCORE-AVX2 |
44.86 |
38.41 |
18.26 |
16.56 |
14.84 |
20.94 |
45.09 |
20.73 |
19.40 |
14.52 |
11.19 |
10.54 |
11.31 |
11.45 |
13.88 |
Résultats sur différentes architectures
Intel i5-3570K et i7 2600 (AVX)
i5-3570K |
3.40GHz |
gcc |
32 |
-O2 -mavx |
954.61 |
56.05 |
27.02 |
19.71 |
18.19 |
18.04 |
46.31 |
27.29 |
24.78 |
-- |
-- |
-- |
-- |
-- |
-- |
i5-3570K |
3.40GHz |
icpc |
32 |
-O2 -xAVX |
92.23 |
65.10 |
26.31 |
19.90 |
18.17 |
23.63 |
46.36 |
26.91 |
24.58 |
-- |
-- |
-- |
-- |
-- |
-- |
Résultats i5-3570K
i7-2600 |
3.40GHz |
gcc |
32 |
-O2 -mavx |
923.06 |
56.37 |
27.38 |
20.98 |
19.57 |
18.98 |
45.81 |
28.06 |
26.00 |
-- |
-- |
-- |
-- |
-- |
-- |
i7-2600 |
3.40GHz |
gcc |
32 |
-O3 -mavx |
934.88 |
57.60 |
28.11 |
21.69 |
20.51 |
19.60 |
46.93 |
28.67 |
26.52 |
-- |
-- |
-- |
-- |
-- |
-- |
i7-2600 |
3.40GHz |
icpc |
32 |
-O2 -xAVX |
90.80 |
63.76 |
25.66 |
20.68 |
18.94 |
23.55 |
44.72 |
26.40 |
24.33 |
-- |
-- |
-- |
-- |
-- |
-- |
i7-2600 |
3.40GHz |
icpc |
32 |
-O3 -xAVX |
92.97 |
64.34 |
26.25 |
20.81 |
19.69 |
23.65 |
45.52 |
26.82 |
24.73 |
-- |
-- |
-- |
-- |
-- |
-- |
Résultats i7-2600
AMD Phenom II X6 1090 T
X6 1090T |
3200 |
gcc 4.5.2 |
32 |
-msse4a -msse4.2 |
1005.10 |
275.83 |
38.34 |
35.94 |
36.66 |
35.69 |
55.45 |
-- |
-- |
-- |
-- |
-- |
-- |
-- |
-- |
X6 1090T |
3200 |
gcc 4.6.x |
64 |
-msse4a -msse4.2 |
377.01 |
219.88 |
38.34 |
34.23 |
36.54 |
36.32 |
61.00 |
-- |
-- |
-- |
-- |
-- |
-- |
-- |
-- |
X6 1090T |
3200 |
gcc 4.7.3 |
64 |
-msse4a |
374.18 |
58.92 |
38.28 |
36.20 |
36.80 |
35.93 |
61.23 |
-- |
-- |
-- |
-- |
-- |
-- |
-- |
-- |
Résultats AMD Phenom II X6 1090 T
Autres architectures
i3-2375M |
1.50Ghz |
gcc |
64 |
-O2 -mavx |
909.39 |
124.25 |
60.26 |
47.48 |
47.32 |
62.44 |
57.06 |
-- |
-- |
-- |
-- |
-- |
-- |
-- |
-- |
i7-860 |
2.80GHz |
gcc |
32 |
-O2 -msse4_2 |
937.44 |
65.75 |
28.69 |
24.81 |
24.74 |
21.86 |
45.85 |
-- |
-- |
-- |
-- |
-- |
-- |
-- |
-- |
Xeon E5520 |
2.27GHz |
gcc 4.4.3 |
64 |
-O2 -msse4.2 |
582.44 |
349.74 |
40.80 |
35.89 |
35.18 |
35.18 |
64.93 |
-- |
-- |
-- |
-- |
-- |
-- |
-- |
-- |
Xeon E5520 |
2.27GHz |
gcc 4.7.3 |
64 |
-O2 -msse4.2 |
544.03 |
79.75 |
40.77 |
36.87 |
35.75 |
35.30 |
66.42 |
-- |
-- |
-- |
-- |
-- |
-- |
-- |
-- |
Sempron 3000 |
1.80Ghz |
gcc 4.7.3 |
32 |
-O2 -msse2 |
1630.84 |
321.87 |
357.04 |
361.95 |
357.39 |
640.02 |
373.59 |
-- |
-- |
-- |
-- |
-- |
-- |
-- |
-- |
Pentium M |
2.00Ghz |
gcc 4.6.3 |
32 |
-O2 -msse2 |
1723.38 |
562.37 |
136.64 |
129.97 |
128.87 |
418.21 |
172.12 |
-- |
-- |
-- |
-- |
-- |
-- |
-- |
-- |
Pentium D |
3.00Ghz |
gcc 4.7.3 |
32 |
-O2 -msse2 |
2089.04 |
235.83 |
148.82 |
136.34 |
133.38 |
474.50 |
184.50 |
-- |
-- |
-- |
-- |
-- |
-- |
-- |
-- |
Résultats sur différentes architectures