Przetwarzanie potokowe
Uzywanie w celu zwiększenia wydajności. Strategia potoku - na jednym końcu są przyjmowane nowe elementy wejściowe zanim jeszcze elementy poprzednio przyjęte ukażą sie na wyjściu. Podczas wykonywania jednego rozkazu istnieją takie przedziały czasowe, kiedy nienastępują odniesienia do pamięci głównej. Wówczas mozna pobrać następny rozkaz róznolegle z wykonywaniem bieżącego.
--Rozkaz-->[ Pobieranie ]--Rozkaz-->[ Wykonywanie ]--Wynik-->
Potok przebiega w dwóch niezależnych etapach. W pierwszym nastepuje pobranie i zbuforowanie rozkazu. Gdy drugi etap jest wolny, następuje przekazanie do niego zbuforowanego rozkazu. Podczas gdy w drugim etapie wykonywany jest rozkaz, w pierwszym wykorzystuje sie jeden z nieuzywanych cykli pamięci w celu pobrania i zbuforowania następnego rozkazu. Nazywa sie to pobieraniem rozkazu z wyprzedzeniem (ang. instruction prefetch) lub pobieraniem na zakładkę (ang. fetch overlap)
Jeżeli etapy pobierania i wykonywania zajmowałyby tyle samo czasu, cały proces skróciłby się 2x. Jednak wykonywanie jest na ogół dłuższe niż pobieranie, więc etap pobierania musi zawierać pewien czas oczekiwania na opróznienie bufora. Poza tym rozkaz skoku warunkowego powoduje, że adres następnego rozkazu przewidzianego do pobrania jest nieznany. Wobec tego realizacja pobierania może nastąpic dopiero po otrzymaniu adresu następnego rozkazu, który zostanie określony po zakończeniu wykonywania. Natomiast na etapie wykonywania następuje oczekiwanie na pobranie kolejnego rozkazu.
Strata czasu może byc zmniejszona przez zgadywanie. Gdy rozkaz rozgałęzienia warunkowego przechodzi z etapu pobierania do wykonywania na etapie pobierania następuje pobranie następnego rozkazu po rozkazie rozgałęzienia. (Rozkaz jest pobierany, niezależnie czy jego warunek jest spełniony. Tego narazie nie wiemy, ale jeśli się okaże, że warunek spełniony, to niestrracilismy czasu i "obrabiamy" ten rozkaz dalej. Jeśli się okaże, że warunek nie jest spełniony, to wyrzucamy ten rozkaz i pobieramy nowy)
Aby jeszcze zwiększyć tempo potok musi mieć więcej etapów:
pobranie rozkazu - wczytanie nastepnego spodziewanego rozkazu do bufora
dekodowanie rozkazu - okreslenie kodu operacji i specyfikatorów argumentu
obliczanie argumentów - obliczanie efektywnego adresu każdego argumentu źródłowego. Może to obejmować obliczanie adresu z przesunięciem adresu rejestrowego pośredniego, adresu pośredniego lub innych form
pobieranie argumentów - pobranie każdego argumentu z pamięci. Argumenty w rejestrach nie muszą byc pobierane.
wykonywanie rozkazu - przeprowadzenie wskazanej operacji i przechowanie wyniku (jeśli jest) w ustalonej lokacji docelowej
zapisanie argumentu - zapisanie wyniku w pamięci
Przy założeniu, że czasy trwania poszczególnych etapów sa równe, czas wykonania rozkazów zmniejsza się z 54 do 14 jednostek czasu. Dla uproszczenia zakładamy, że każdy rokaz przechodzi przez wszytkie etapy potoku i że wszystkieetapy mogą być realizowane równolegle - nie ma konfliktów dostępu do pamięci.
Ograniczenia poprawy wydajności:
jesli czasy trwania 6 etapów nie są równe występuje oczekiwanie
możliwość unieważnienia przez rozkaz rozgałęźienia wartości kilku pobranych rozkazów
nieprzewidywalność przerwań
konflikty rejestrów i pamięci
Sześcioetapowy potok rozkazów procesora
Mogłoby się wydawać, że im więcej etapów tym szybsze wykonywanie rokazów. Są jednak czynniki, które zaburzają ten sposób zwiększania wydajności:
Na każdym etapie potoku występuje pewien narzut związany z przenoszeniem danych z bufora oraz z wykonywaniem różnych działań przygotowawczych, co może wydłuzyć całkowity czas wykonania rokazu, szczególnie jeśli rozkazy sekwencyjne sa logicznie zależne albo przez częste rozgałęzianie, albo przez uzależniony dostęp do pamięci.
Wraz z liczbą etapów wzrasta znacząco liczba układów logicznych potrzebnych do zapobieagania konfliktom rejetrów i pamięci - może się zdarzyć, że układy logiczne sterujace przejściami między etapami sa bardziej złożone niż same etapy.
Metody postępowania z rozgałęziami warunkowaymi
Rozgałęzienie warunkowejest zasadnicza przeszkoda dla stałego napływu rozkazów do początkowych etapów potoku - aż do zakończenia wykonywania tego rozkazu nie jest mozliwe stwierdzenie, czy rozgałęźienie nastapi, czy nie.
Istenieją różne sposoby postępowania:
zwielokrotenie strumienia - powielanie początkowych części potoku i umozliwianie równoczesnego pobrania obu rozkazów za pomocą dwóch strumieni np. IBM 370/168, IBM 3033
pobieranie docelowego rozkazu z wyprzedzeniem - gdy rozpoznawany jest rozkaz rozgałęzienia warunkowego, nastepuje wyprzedzające pobranie rozkazu docelowego razem z rozkazem następującym po rozgałęzieniu. Rozkaz docelowy jest następnie zachowywany, aż do czasu wykonania rozkazu rozgałęźienia. W momencie rozgałęzienia rozkaz docelowy jest juz pobrany np. IBM 360/91
buform pętli - mała, bardzo szybka pamięć związana z etapem pobierania, zawiera kolejno n ostatnio pobranych rozkazów. Jeśli ma nastapić rozgałęzienie, sprawdza się najpierw, czy cel rozgałęzienia znajduje sie wenątrz bufora. Jesli tak, następny rozkaz jest pobierany z bufora.
przewidywania rozgałęzień - mozna np. zakładać zawsze, że rozgałęzienie nie nastapi i kontynuować kolejne pobieranie rozkazów, albo zakładać zawsze, że rozgałęzienie nastąpi i pobierać rozkaz w celu rozgałęzienia. Można tez podejmować decyzję na podstawie kodu operacji rozkazu rozgałęzienia. Procesor zakłada, że rozgałęzienie nastapi w przypadku pewnych kodów operacji, a w przypadku innych nie. Mozna też rejestrować historię rozkazów względem warunku. W programie i na podstawie juz przebytych rozkazów wyciągnąć wnioski w powtarzających sie przypadakach (tzw przełączniknastąpiło/nienastąpiło lub tablica historii rozgałęzień)
opóźnione rozgałęzienie - automatyczna zmiana porządku rozkazu wewnątrz programu, tak żeby rozkazy rozgałęzienia występowały później