Potokowość – Wikipedia, wolna encyklopedia
Potokowość – technika budowy procesorów polegająca na podziale logiki procesora odpowiedzialnej za proces wykonywania programu (rozkazów procesora) na specjalizowane grupy w taki sposób, aby każda z grup wykonywała część pracy związanej z wykonaniem rozkazu. Grupy te są połączone sekwencyjnie – w potok (ang. pipe) – i wykonują pracę równocześnie, pobierając dane od poprzedniego elementu w sekwencji. W każdej z tych grup rozkaz jest na innym stadium wykonania. Można to porównać do taśmy produkcyjnej. W uproszczeniu potok wykonania instrukcji procesora może wyglądać następująco:
- pobranie instrukcji z pamięci – ang. instruction fetch (IF)
- zdekodowanie instrukcji – ang. instruction decode (ID)
- wykonanie instrukcji – ang. execute (EX)
- dostęp do pamięci – ang. memory access (MEM)
- zapisanie wyników działania instrukcji – ang. store; write back (WB).
W powyższym pięciostopniowym potoku przejście przez wszystkie stopnie potoku (wykonanie jednej instrukcji) zabiera co najmniej pięć cykli zegarowych. Jednak ze względu na równoczesną pracę wszystkich stopni potoku, jednocześnie wykonywanych jest pięć rozkazów procesora, każdy w innym stadium wykonania. Oznacza to, że taki procesor w każdym cyklu zegara rozpoczyna i kończy wykonanie jednej instrukcji i statystycznie wykonuje rozkaz w jednym cyklu zegara. Każdy ze stopni potoku wykonuje mniej pracy w porównaniu do pojedynczej logiki, dzięki czemu może wykonać ją szybciej – z większą częstotliwością – tak więc dodatkowe zwiększenie liczby stopni umożliwia osiągnięcie coraz wyższych częstotliwości pracy.
Podstawowym mankamentem techniki potoku są rozkazy skoku, powodujące w najgorszym wypadku potrzebę przeczyszczenia całego potoku i wycofania rozkazów, które następowały zaraz po instrukcji skoku i rozpoczęcie zapełniania potoku od początku od adresu, do którego następował skok. Taki rozkaz skoku może powodować ogromne opóźnienia w wykonywaniu programu – tym większe, im większa jest długość potoku. Dodatkowo szacuje się, że dla modelu programowego x86 taki skok występuje co kilkanaście rozkazów. Z tego powodu niektóre architektury programowe (np. SPARC) zakładały zawsze wykonanie jednego lub większej liczby rozkazów następujących po rozkazie skoku, tak zwany skok opóźniony. Stosuje się także skomplikowane metody predykcji skoku lub metody programowania bez użycia skoków.