Přiložený program porovnává rychlost zpracování skalárního součinu a součtu dvou vektorů s použitím SSE a bez něj. Implementace SSE funkcí je psaná v assembleru (Intel syntax). Program alokuje dvě pole o n floatech a poté k-krát spočte jejich skalární součin a součet. Zároveň vypíše dobu výpočtu s použitím SSE a bez něj. Pro vyšší n si můžeme všimnout, že oproti běžnému C++ kódu nemusí docházet téměř k žádnému zrychlení. Tento jev je způsoben rychlostí paměti - prostě data potřebujeme tak ryhcle, že je paměť nestačí dodávat. Pokud n snížíme, aby se oba vektory (v případě součtu všechny tři - ještě jeden pro výsledek) vešly do vyrovnávací paměti procesoru, začneme pozorovat slušné zrychlení. Výpočetní časy pro různá n a pevné k jsou v následující tabulce (pro výpočet byl použit jednojádrový procesor AMD Sempron 1.58 GHz).
Skalární součin
Délka vektoru | SSE | Bez SSE | Urychlení |
512 | 0.016000 | 0.031000 s | 1.937500 |
1024 | 0.016000 | 0.046000 s | 2.875000 |
2048 | 0.047000 | 0.110000 s | 2.340426 |
4096 | 0.093000 | 0.204000 s | 2.193548 |
8192 | 0.203000 | 0.406000 s | 2.000000 |
16384 | 0.594000 | 0.906000 s | 1.525253 |
32768 | 1.187000 | 1.922000 s | 1.619208 |
65536 | 3.578000 | 4.172000 s | 1.166015 |
Součet
Délka vektoru | SSE | Bez SSE | Urychlení |
512 | 0.047000 | 0.063000 s | 1.340426 |
1024 | 0.093000 | 0.141000 s | 1.516129 |
2048 | 0.172000 | 0.281000 s | 1.633721 |
4096 | 0.360000 | 0.562000 s | 1.561111 |
8192 | 0.719000 | 1.328000 s | 1.847010 |
16384 | 1.781000 | 2.344000 s | 1.316115 |
32768 | 3.187000 | 5.235000 s | 1.642611 |
65536 | 8.969000 | 12.250000 s | 1.365816 |
Je vidět, že pro délku vektoru 16384 jsou časy pro SSE podstatně více než dvakrát delší oproti délce 8192. Je to způsobeno právě tím, že dva vektory o délce 32768 bytů (8192 floatů po čtyřech bytech) se vejdou do 64 kB velké vyrovnávací paměti použitého procesoru, zatímco delší už ne a musejí se načítat z běžné paměti.