instrukcje mogą wymagać różnej liczby etapów. Trzeba też uwzględnić obsługę sytuacji wyjątkowych. Czas wykonania instrukcji przy przetwarzaniu potokowym jest dłuższy niż przy jej wykonaniu w sposób sekwencyjny, ale średni czas wykonania jednej instrukcji przy wykonywaniu dostatecznie długiego ciągu instrukcji jest krótszy. Rozróżniamy następujące typy zależności między danymi:
define-use add eax, 3 mul ebx
• RAW - odczyt po zapisie
load-use
add ebx, eax
• WAR - zapis po odczycie
add eax, ebx
• WAW - zapis po zapisie
push eax , tym przykładzie występuje też zależność RAW) sub esp, lo
Zależności typu RAW usuwa się przez data bypassing i data forwarding. Zależności typu WAR i WAW są zależnościami fałszywymi. Usuwa się je przez przemianowanie rejestrów. Fizycznych rejestrów jest więcej, niż widzi programista i są one przydzielane w miarę potrzeby.
Zależności sterowania rozwiązuje się przez:
• pobieranie docelowego rozkazu z wyprzedzeniem;
• równoległe przetwarzanie obu gałęzi programu;
• predykcja skoków (przewidywanie rozgałęzień):
— zawsze następuje skok,
— nigdy nie następuje skok,
— decyduje kod instrukcji (kompilator),
— jak przy ostatnim wykonaniu,
— tablica historii skoków;
• bufor pętli;
• opóźnione rozgałęzianie.
Przy przetwarzaniu potokowym stosuje się podział skomplikowanych instrukcji na mikrooperacje (ang. pops). Mikroperacje jest łatwiej potokować.
Przetwarzanie potokowe umożliwia zbliżenie się do granicy wykonywania średnio jednej (prostej) instrukcji (mikrooperacji) w jednym cyklu zegara. Dalsze przyspieszenie możliwe jest przez zrównoleglenie wykonywania instrukcji. Zrównoleglenie wymaga zwiększenia liczby potoków i jednostek wykonawczych (ALU - arithmetic-logic unit, AGU - address generator unit, FPU - floating point unit, LSU - load-store unit itp.). Poszczególne potoki mogą być specjalizowane. Można wyróżnić następujące sposoby wykorzystania tej równoległości (wielo-potokowości):
• architektura superskalarna - zrównoleglenie na poziomie wykonania - układy wewnątrz procesora decydują o zrównolegleniu (hyper threading też tu podpada);
• architektura wektorowa (znana też jako SIMD - single instruction multiple data) - zrównoleglenie na poziomie algorytmu - nie wszystkie algorytmy dają się efektywnie zwektoryzować;
• procesory z bardzo długim słowem instrukcji (VLIW - very long instruction word) - zrównoleglenie na poziomie kompilatora - pojedyncza instrukcja opisuje, co mają robić poszczególne jednostki wykonawcze.