Co to jest potok instrukcji?

click fraud protection

Każda instrukcja procesora ma wiele etapów działania. Każdy z tych etapów zajmuje jeden cykl procesora. Te etapy to pobieranie instrukcji, dekodowanie instrukcji, wykonywanie, dostęp do pamięci i zapisywanie zwrotne. Odpowiednio otrzymują one instrukcję, którą należy wykonać, oddziel operację od obsługiwanych wartości włącz, wykonaj proces, otwórz rejestr, w którym zostanie zapisany wynik, i zapisz wynik do otwartego Zarejestruj się.

Historyczne procesory w kolejności

We wczesnych komputerach procesor nie używał potoku instrukcji. W tych procesorach każda operacja w pojedynczym cyklu musiała nastąpić dla każdej instrukcji. Oznaczało to, że przeciętna instrukcja została przetworzona w całości, zanim mogła zostać uruchomiona następna. Niektóre operacje mogą nie wymagać wypisywania wyników do rejestru, co oznacza, że ​​można pominąć etapy dostępu do pamięci i zapisu zwrotnego.

W procesorze podskalarnym bez potoku każda część każdej instrukcji jest wykonywana w kolejności.

Pojawia się jednak problem, gdy uruchamiasz pełną instrukcję w kolejności, zanim będziesz mógł przejść do następnej instrukcji. Problemem jest brak pamięci podręcznej. CPU przechowuje dane, które aktywnie przetwarza w rejestrze. Dostęp do tego można uzyskać z opóźnieniem jednego cyklu. Problem polega na tym, że rejestr jest mały, ponieważ jest wbudowany w rdzeń procesora. Procesor musi przejść do większej, ale wolniejszej pamięci podręcznej L1, jeśli dane nie zostały jeszcze załadowane. Jeśli go tam nie ma, musi ponownie przejść do większej i wolniejszej pamięci podręcznej L2. Następnym krokiem jest pamięć podręczna L3; ostatnią opcją jest systemowa pamięć RAM. Każda z tych opcji wymaga coraz większej liczby cykli procesora do sprawdzenia.

Teraz ta dodatkowa dodatkowa latencja może być dużym problemem w systemie, który musi ukończyć każdą instrukcję w pełnej kolejności przed rozpoczęciem następnej instrukcji. To, co było 5-cyklowym procesorem na instrukcję, może nagle zawiesić się na jednej instrukcji na dziesiątki lub setki cykli zegara. Przez cały czas nic innego nie może się zdarzyć na komputerze. Technicznie można to nieco złagodzić, mając dwa niezależne rdzenie. Nic jednak nie powstrzymuje ich przed zrobieniem tego samego, potencjalnie jednocześnie. Więc przejście wielordzeniową trasą tego nie naprawi.

Klasyczny potok RISC

RISC oznacza komputer z ograniczonym zestawem instrukcji. Jest to styl konstrukcji procesora, który optymalizuje wydajność, ułatwiając dekodowanie każdej instrukcji. Jest to w porównaniu z komputerem CISC lub złożonym zestawem instrukcji, który projektuje bardziej złożone zestawy instrukcji, dzięki czemu do wykonania tych samych zadań potrzeba mniej instrukcji.

Klasyczny projekt RISC zawiera potok instrukcji. Zamiast uruchamiania dowolnego z pięciu etapów instrukcji w dowolnym cyklu, potok umożliwia wykonanie wszystkich pięciu etapów. Oczywiście nie można uruchomić wszystkich pięciu etapów jednej instrukcji w cyklu. Ale możesz ustawić w kolejce pięć kolejnych instrukcji z przesunięciem o jeden etap każda. W ten sposób w każdym cyklu zegara można wykonać nową instrukcję. Oferując potencjalny 5-krotny wzrost wydajności przy stosunkowo niskim wzroście złożoności rdzenia.

W skalarnym procesorze potokowym każdy etap wykonywania instrukcji może być wykonywany raz na cykl zegara. Pozwala to na maksymalną przepustowość jednej kompletnej instrukcji na cykl.

Procesory, które nie mają potoku, mogą być tylko podskalarne, ponieważ nie mogą wykonać jednej kompletnej instrukcji na cykl. Za pomocą tego podstawowego pięciostopniowego potoku można stworzyć skalarny procesor, który może wykonać instrukcję dla każdego procesu. Tworząc jeszcze bardziej dalekosiężne potoki, można stworzyć superskalarne procesory, które mogą wykonywać więcej niż jedną instrukcję na cykl zegara. Oczywiście nadal istnieją potencjalne problemy.

Ciągle sekwencyjny

Żadne z tych rozwiązań nie rozwiązuje problemu oczekiwania przez wiele cykli na odpowiedź, gdy trzeba zapytać o różne poziomy pamięci podręcznej i pamięci RAM. Wprowadza też nowy problem. Co się stanie, jeśli jedna instrukcja opiera się na wyniku poprzedniej instrukcji? Problemy te są samodzielnie rozwiązywane za pomocą zaawansowanego dyspozytora. Starannie planuje kolejność wykonywania, aby żadne instrukcje, które opierają się na wynikach innego, nie były zbyt blisko siebie. Obsługuje również chybienia w pamięci podręcznej, parkując instrukcję i zamieniając ją w potoku na inne instrukcje, które są gotowe do uruchomienia i nie wymagają jego wyniku, wznawianie instrukcji, gdy jest gotowy.

Rozwiązania te mogą działać na procesorach niepotokowych, ale są wymagane w przypadku procesora superskalarnego, który wykonuje więcej niż jedną instrukcję na zegar. Predyktor rozgałęzień jest również bardzo przydatny, ponieważ może próbować przewidzieć wynik instrukcji z więcej niż jednym potencjalnym wynikiem i nadal zakładać, że jest poprawny, chyba że zostanie udowodnione inaczej.

Wniosek

Potok umożliwia wykorzystanie wszystkich odrębnych możliwości procesora w każdym cyklu. Robi to, uruchamiając jednocześnie różne etapy różnych instrukcji. To nawet nie zwiększa złożoności projektu procesora. To również toruje drogę do umożliwienia więcej niż jednej instrukcji wykonywania jednego etapu na cykl.