Education
Register
Advertisement

Przetwarzanie potokowe - sposób przetwarzania rozkazów w procesorach, w którym do przetwarzania zastosowano potok podzielony na etapy. W przeciwieństwie do klasycznego (sekwencyjnego) sposobu przetwarzania rozkazów gdzie każdy jest pobierany, dekodowany, wykonywany oddzielnie, w przetwarzaniu potokowym w procesorze następuje jednoczesne przetwarzanie kliku (zależności od głębokości/ilości etapów potoku) rozkazów jednocześnie. Każdy z rozkazów znajduje się w danym cyklu maszynowym w innym etapie przetwarzania i dzięki temu wyniki operacji mogą być produkowane niemal w każdym cyklu.

Główne etapy przetwarzania potokowego to:

  • pobranie kodu rozkazu z pamięci
  • dekodowanie - wytworzenie sygnałów sterujących jednostkami wykonawczymi na podstawie kodu rozkazu
  • wykonanie - właściwa część przetwarzania rozkazu w jednostce wykonawczej
  • zapis wyniku operacji do pamięci

Podział każdego etapu na podetapy umożliwia skrócenie cyklu, a to z kolei pozwala na dalszy wzrost szybkości przetwarzania. Taki mechanizm nazywany jest przetwarzaniem superpotokowym superpipelined pipeline. Liczba podetapów cyklów rozkazów (głębokość potoku) nie może być jednak dowolnie duża, bo podział etapu wymaga zwiększenia liczby buforów separujących, co z kolei powoduje zmniejszenie przepustowości potoku (opóźnienie w układach separujących etapy jest proporcjonalne do ich liczby i jest skutkiem wzrostu narzutu czasu na cele organizacyjne).

W przetwarzaniu potokowym ze względu na narzuty czasowe na wykonanie każdego etapu rozkazu (opóźnienia buforów) i konieczność wpasowania etapów w ramy czasowe potoku (czas przejścia rozkazu przez etap jest równy czasowi cyklu), czas wykonania pojedynczego rozkazu jest dłuższy niż w przetwarzaniu sekwencyjnym. Przy częstych zakłóceniach potoku może się zatem zdarzyć, że czas przetwarzania potokowego będzie porównywalny bądź nawet dłuższy z czasem sekwencyjnego wykonania instrukcji programu.

Na wydajność potoku mają wpływ:

  • konflikty sterowania - zaburzenie sekwencji przetwarzania przy rozgałęzieniu (np. występuje w momencie wykonywania rozkazu skoku warunkowego, zależnego od stanu wskaźników ustalanych przez poprzednie, jeszcze nie zakończone rozkazy). Zmniejszenie uciążliwości tego konfliktu jest osiągane przez zastosowanie prognozy rozgałęzień (skoków). Prognoza może być statyczna (oparta na analizie/identyfikacji kodu rozkazu i rozpoznawaniu skoków bezwarunkowych zwykłych lub skoków bezwarunkowych do podprogramu) lub dynamiczna (oparta na historii przetwarzania – analizie szansy wykonania rozgałęzienia). Straty wywołane przez rozgałęzienia warunkowe można zmniejszyć metodami programowymi (przyspieszenie chwili wytworzenia warunku przez zmianę sekwencji rozkazów) lub sprzętowymi (implementacja układów prognozy rozgałęzień umożliwiających uprzednie przełączanie strumienia rozkazów zanim rozkaz przejdzie do etapu dekodowania – jest powiązany z buforem/kolejką rozkazów).
  • konflikty danych - jednoczesne użycie tej samej danej (gdy wynik 2 instrukcji zależy od wartości wytworzonej przez instrukcję poprzednią). Grupowe przetwarzanie rozkazów (stosowane w procesorach nowszej generacji) umożliwia usunięcie niektórych konfliktów danych i jednocześnie złagodzenie konfliktów dostępu. Nie zawsze bowiem jest konieczne zachowanie porządku wykonania rozkazów ustalonego w programie, a zmiana kolejności może wyeliminować przestoje związane z konfliktem danych i konfliktem dostępu. Metodą zmniejszania strat wywołanych konfliktem dostępu jest stosowanie skrótów (bypass) na ścieżkach przepływu danych. Skróty polegają na tworzeniu bezpośrednich połączeń między stanowiskami etapów wykonania i zapisu wyniku, co umożliwia błyskawiczne dostarczenie wyniku wytworzonego ale nie zapisanego do jednostki wykonawczej (forwarding). Każdy skrót wymaga użycia dodatkowego zatrzasku i pary komparatorów do sprawdzenia, czy sąsiednie instrukcje współdzielą zasób.
  • konflikty zasobów - jednoczesne żądanie dostępu do pamięci lub innego zasobu unikatowego w komputerze (pliku rejestrowego, jednostki zmiennoprzecinkowej FPU spowodowany długim czasem wykonywania działań zmiennoprzecinkowych). W celu wyeliminowania konfliktów do pamięci spowodowanych jednoczesnymi żądaniami pobrania kolejnego rozkazu i przesłania danych, wewnętrzną pamięć podręczną należy rozdzielić na osobne pamięci danych i pamięci kodu (podobnie jak w architekturze harwardzkiej). Rozwiązanie takie nie jest sprzeczne z modelem klasycznym, bo pamięć podręczna jest jedynie buforem pamięci głównej, zawierającym kopie oryginalnej informacji umieszczonej w pamięci głównej lub dane tymczasowe. Takie rozdzielenie umożliwia jednoczesny dostęp do kodu i danych. Potencjalny konflikt dostępu do jednostki adresowej złagodzi też buforowanie instrukcji, podobnie jak konflikt przy konieczności zapisu do pamięci głównej można złagodzić przez stosowanie bufora zapisu. Konflikty dostępu do plików rejestrowych można złagodzić rozbudowując układy dostępu do rejestrów (np. dostęp wieloportowy, umożliwiający jednoczesne użycie różnych rejestrów pliku).


Źródła informacji[]

  • Stallings W. Organizacja i architektura systemu komputerowego. wyd. drugie, Wydawnictwo Naukowo-Techniczne, Warszawa 2003, str. 465-479
  • Biernat J. Architektura komputerów wyd trzecie, Oficyna Wydawnicza PWr, Wrocław 2002, str. 179-200
  • Dobra ilustracja przetwarzania potokowego
Advertisement