Wektoryzacja (tak jak termin jest zwykle używany) odnosi się do operacji SIMD (pojedyncza instrukcja, wiele danych).
Oznacza to w istocie, że jedna instrukcja wykonuje tę samą operację na kilku operandach równolegle. Na przykład, dla wielu wektorów o rozmiarze N przez skalar, nazwijmy M liczbą operandów, których rozmiar może działać jednocześnie. Jeśli tak, to liczba instrukcji, które musi wykonać, to w przybliżeniu N/M, gdzie (z czysto skalarnymi operacjami) musiałby wykonać operacje N.
Na przykład obecny zestaw instrukcji Intel AVX 2 wykorzystuje rejestry 256-bitowe. Mogą one służyć do przechowywania (i obsługi) zestawu 4 operandów po 64 bity lub 8 operandów po 32 bity.
Zakładając, że mamy do czynienia z 32-bitowymi, rzeczywistymi liczbami o pojedynczej precyzji, oznacza to, że pojedyncza instrukcja może jednorazowo wykonać 8 operacji (multiplikacji, w twoim przypadku), więc (przynajmniej teoretycznie) możesz zakończyć multiplikację N przy użyciu tylko instrukcji mnożenia N/8. Przynajmniej teoretycznie powinno to pozwolić na zakończenie operacji około 8 razy szybciej niż pozwala na to wykonanie jednej instrukcji na raz.
Oczywiście, dokładne korzyści zależą od tego, ile operandów obsługuje się na podstawie instrukcji. Pierwsze próby Intela obsługiwały tylko rejestry 64-bitowe, więc aby działać na 8 elementach jednocześnie, te elementy mogły mieć tylko 8 bitów na sztukę. Obecnie obsługują rejestry 256-bitowe i ogłosiły wsparcie dla 512-bitów (a mogły nawet wysłać je w kilku wysokiej klasy procesorach, ale jeszcze nie w zwykłych procesorach konsumenckich). Właściwe wykorzystanie tej możliwości może również być nietrywialne, delikatnie mówiąc. Planuj instrukcje, aby faktycznie mieć N operandów i we właściwych miejscach we właściwym czasie niekoniecznie jest to łatwe zadanie (w ogóle).
Aby spojrzeć na to z innej perspektywy, (starożytna) Cray 1 osiągnęła dużą prędkość właśnie w ten sposób.Jego jednostka wektorowa działała na zestawach 64 rejestrów po 64 bity, więc mogła wykonywać 64 operacji podwójnej precyzji na cykl zegara. Na optymalnie wektoryzowanym kodzie był on znacznie bliższy prędkości aktualnego procesora, niż można by oczekiwać, bazując wyłącznie na jego (znacznie niższej) szybkości zegara. Wykorzystanie tego nie zawsze było jednak łatwe (i nadal nie jest łatwe).
Należy jednak pamiętać, że wektoryzacja to , a nie jedyny sposób, w jaki procesor może wykonywać operacje równolegle. Istnieje również możliwość równoległości poziomu instrukcji, która pozwala pojedynczemu procesorowi (lub jednemu rdzeniu procesora) na wykonanie więcej niż jednej instrukcji naraz. Większość nowoczesnych procesorów zawiera sprzęt (teoretycznie) do wykonania około 4 instrukcji na cykl zegara, jeśli instrukcje są mieszanką obciążeń, zapasów i jednostek ALU. Mogą dość rutynowo wykonywać blisko 2 instrukcje na zegar średnio lub więcej w dobrze dostrojonych pętlach, gdy pamięć nie jest wąskim gardłem.
Oczywiście, istnieje wiele wątków - uruchamianie wielu strumieni instrukcji na (przynajmniej logicznie) oddzielnych procesorach/rdzeniach.
Współczesny procesor może mieć, powiedzmy, 4 rdzenie, z których każdy może wykonać 2 mnożenia wektorów na zegar, a każda z tych instrukcji może działać na 8 operandach. Tak więc, przynajmniej teoretycznie, może wykonywać 4 * 2 * 8 = 64 operacji na zegar.
Niektóre instrukcje mają lepszą lub gorszą przepustowość. Na przykład przepustowość dodawania FP jest niższa niż FMA lub mnożenie na Intelu przed Skylake (1 wektor na zegar zamiast 2). Ale logika logiczna, taka jak ORAZ XOR, ma 3 wektory na przepustowość zegara; nie wymaga wielu tranzystorów do zbudowania jednostki wykonawczej AND/XOR/OR, więc procesory je replikują. Wąskie gardła na całej szerokości rurociągu (front-end, który dekoduje i przechodzi do części rdzeniowej poza kolejnością) są powszechne w przypadku stosowania instrukcji o dużej przepustowości, a nie wąskich gardeł w konkretnej jednostce wykonawczej.
Sprzęt może być równoległy. Możesz xorować dwie 32-bitowe liczby w jednym cyklu. Możesz zapisać xor dwie 1048576 bitów w 1 cyklu. Wystarczy wypalić jeszcze kilka przewodów na chipie. – usr
Dzięki nowoczesnemu SIMD z krótkimi wektorem, wektory używają pętli do przetwarzania całej tablicy. Starsze maszyny wektorowe Cray'a mogły być skonfigurowane do dużych operacji, a następnie jedna instrukcja ładowałaby/działała/zapisywała, ale nie tak działa x86 SSE/ARM NEON/PowerPC AltiVec. –