Ukázkový program

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.