Hodně záleží na tom, jak přistupujete do paměti (a jak často se netrefíte do obsahu, který není v Lx cache) a jak moc náročné je nastrkat data to vektorů, se kterými pak provedete dané operace.
Pokud provádíte náhodné přístupy do paměti, data pravděpodobně nebudou v cache, takže budete ztrácet výkon na čekání, než se natáhnou z hlavní paměti. Dobré je snažit se shlukovat přístupy do blízkých míst k sobě, případně se snažit do paměti přistupovat lineárně (procesor pak přístupy umí předvídat).
Pokud spotřebujete příliš času na to, abyste data dostal do vektorů, samotné urychlení vektorových operací se nemusí projevit. Málokdy se podaří zrychlení shodné s délkou vektorů (např. 8 pro práci s 32bitovými celými čísly na AVX, 4 pro SSE). Dobré je také vektorový a nevektorový kód příliš do sebe nemíchat, ať se nemusí data přenášet mezi vektorovými a obecnými registry. Také může pomoci vyhnout se podmínkám (někdy to lze zařídit pomocí série ANDů, NOTů a podobných operací). Jestli ale pracujete z floaty/doubly, bude to o dost horší.
Pokud je vaše aplikace vícevláknová a běží na NUMA stroji, je tu opět další zdroj problémů – přístup do různých částí paměti není stejně drahý.