Oczywiście warunek jest sprawdzany za każdym razem. Ale do czasu sprawdzenia jest już daleko do potoku procesora. W międzyczasie inne instrukcje również weszły do rurociągu i są na różnych etapach realizacji.
Zwykle po warunku natychmiast następuje warunkowa instrukcja rozgałęzienia, która albo rozgałęzia się, jeśli warunek uzyska wartość PRAWDA, albo przepada, jeśli warunek ma wartość FAŁSZ. Oznacza to, że istnieją dwa różne strumienie instrukcji, które mogą być ładowane do potoku po instrukcji warunku i instrukcji rozgałęzienia, w zależności od tego, czy warunek ma wartość PRAWDA, czy FAŁSZ. Niestety, natychmiast po załadowaniu instrukcji warunku i instrukcji rozgałęzienia, CPU nie wie jeszcze, co oceni warunek, ale nadal musi ładować rzeczy do potoku. Wybiera więc jeden z dwóch zestawów instrukcji na podstawie zgadnięcia, co oceni warunek.
Później, gdy instrukcja warunku przechodzi przez rurociąg, nadszedł czas na ocenę. W tym czasie procesor dowiaduje się, czy jego domysł był właściwy, czy zły.
Jeśli przypuszczenie okaże się słuszne, gałąź poszła we właściwe miejsce, a właściwe instrukcje zostały załadowane do rurociągu. Jeśli okaże się, że zgadywanie było błędne, wówczas wszystkie instrukcje, które zostały załadowane do potoku po instrukcji warunkowej gałęzi były błędne, należy je odrzucić, a pobieranie instrukcji musi rozpocząć się ponownie od właściwego miejsca.
Poprawka
W odpowiedzi na komentarz StarWeaver, aby zorientować się, co CPU musi zrobić, aby wykonać jedną instrukcję:
Rozważmy coś tak prostego, jak to, MOV AX,[SI+10]
co my, ludzie naiwnie myślimy, jako „załaduj AX słowem o SI plus 10”. Z grubsza procesor musi:
- emitować zawartość komputera („rejestr licznika programu”) na magistralę adresową;
- odczytać kod operacji z magistrali danych;
- Przyrost PC;
- zdekoduj kod operacji, aby dowiedzieć się, co z nim zrobić;
- wyślij zawartość komputera na magistralę adresową;
- odczytać operand instrukcji (w tym przypadku 10) z magistrali danych;
- Przyrost PC;
- podaj operand i SI do sumatora;
- wyślij wynik sumatora do magistrali adresowej;
- odczytać AX z magistrali danych.
To aż 10 kroków. Niektóre z tych kroków zostaną zoptymalizowane nawet w procesorach niepotokowych, na przykład procesor prawie zawsze zwiększa PC równolegle z następnym krokiem, co jest łatwe, ponieważ PC jest bardzo specjalnym rejestrem, który jest nigdy nie używane do żadnego innego zadania, więc nie ma możliwości rywalizacji między różnymi częściami procesora o dostęp do tego konkretnego rejestru. Ale wciąż mamy 8 kroków do tak prostej instrukcji i zauważmy, że już zakładam pewien stopień wyrafinowania w imieniu procesora, na przykład zakładam, że nie będzie potrzeby wykonywania całego dodatkowego kroku dla sumator do faktycznego przeprowadzenia dodawania, zanim wynik będzie można odczytać z niego,
Teraz zastanów się, że istnieją bardziej skomplikowane tryby adresowania, takie jak MOV AX, [DX+SI*4+10]
, a nawet znacznie bardziej skomplikowane instrukcje, takie jak MUL AX, operand
które faktycznie wykonują pętle wewnątrz procesora, aby obliczyć ich wynik.
Chodzi mi tutaj o to, że metafora „poziomu atomowego” jest daleka od odpowiedniej dla poziomu instrukcji procesora. Może być odpowiedni dla poziomu kroku potoku, jeśli nie chcesz schodzić zbyt daleko w dół do faktycznego poziomu bramki logicznej.