Nevýhody SSE

Základní nevýhodou SSE instrukcí je, že pokud chceme mít jistotu, že překladač opravdu použije SSE, musíme si vše nakódovat přímo v assembleru. Dnešní překladače jsou na tom s optimalizací velmi dobře, přesto se ale může stát, že možnost použití neuvidí. Může to být způsobeno i tím, že jsme algoritmus zformulovali pro SSE nešťastným způsobem. K tomu může velice jednoduše dojít například pokud nevíme, že nějaké SSE instrukce existují a že bychom na ně při psaní kódu mohli brát ohled.

Pokud nechceme používat přímo assembler a máme rádi C++, existuje ještě jedna možnost: tzv. intrinsic funkce. Jsou to v podstatě aliasy SSE instrukcí v C++ a jsou podporovány přinejmenším v MSVC a gcc. Tento přístup kombinuje výhody SSE paralelizace s přehledností a jednoduchostí C++ kódu. Díky tomu, že se nepracuje přímo se SSE registry ale s pojmenovanými proměnnými, nemáme ovšem tak absolutní kontrolu nad tím, jak se kód přeloží, a můžou vznikat zbytečná čtení z paměti a zápisy do ní.

Více o SSE intrinsic funkcích naleznete např. na www.codeproject.com.

Dalším specifikem instrukční sady SSE jsou dvě instrukce pro načtení 128 bitů do SSE registru a dvě instrukce pro zápis. Díky architektuře procesoru je rychlejší a jednodušší načítat blok dat, který leží na adrese dělitelné 16 byty (neboli 128 bity - šířkou SSE registru). Pokud jsme si jisti, že načítaná data na takové adrese opravdu leží, použijeme např. k načtení 4 floatů z paměti instrukci MOVAPS (move aligned packed single precision). Pokud si jisti nejsme, musíme použít pomalejší instrukci MOVUPS (move unaligned packed single precision). Proto pokud hodláme využívat služeb instrukční sady SSE, je dobré si připravit funkce, které alokují paměť na adrese dělitelné 16 (v MS Visual C++ jsou tyto funkce už zabudovány - _aligned_malloc a _aligned_free), případně v C++ přetížit operátor new.