tl; dr
Krótsze rurociągi oznaczają wyższe częstotliwości taktowania, ale mogą zmniejszyć przepustowość. Zobacz także odpowiedzi nr 2 i 3 na dole (obiecuję, że są krótkie).
Dłuższa wersja:
Jest tu kilka rzeczy do rozważenia:
- Nie wszystkie instrukcje zajmują tyle samo czasu
- Nie wszystkie instrukcje zależą od tego, co zrobiono natychmiast (lub nawet dziesięć lub dwadzieścia) instrukcji wstecz
Bardzo uproszczony potok (to, co dzieje się w nowoczesnych układach Intela, jest bardziej skomplikowane) ma kilka etapów:
Pobierz -> Dekoduj -> Dostęp do pamięci -> Wykonaj -> Zapis zwrotny -> Aktualizacja licznika programu
Przy każdym -> ponoszony jest koszt czasu. Dodatkowo, każdy tik (cykl zegara), wszystko przesuwa się z jednego etapu do następnego, więc twój najwolniejszy etap staje się prędkością WSZYSTKICH etapów (naprawdę opłaca się, aby miały możliwie podobną długość).
Załóżmy, że masz 5 instrukcji i chcesz je wykonać (zdjęcie pochodzi z wikipedii, tutaj aktualizacja komputera nie jest wykonywana). Wyglądałoby to tak:
Mimo że każda instrukcja wymaga 5 cykli zegara, ukończona instrukcja wychodzi z potoku w każdym cyklu. Jeśli czas potrzebny dla każdego etapu wynosi 40 ns, a 15 ns dla bitów pośrednich (używając mojego sześciostopniowego potoku powyżej), zajmie 40 * 6 + 5 * 15 = 315 ns, aby uzyskać pierwszą instrukcję.
W przeciwieństwie do tego, gdybym całkowicie wyeliminował potok (ale utrzymywał wszystko inne bez zmian), wykonanie pierwszej instrukcji zajęłoby zaledwie 240 ns. (Ta różnica prędkości, by uzyskać „pierwszą” instrukcję, nazywa się opóźnieniem. Jest ona na ogół mniej ważna niż przepustowość, czyli liczba instrukcji na sekundę).
Zupełnie inaczej jest w tym, że w przykładzie potokowym otrzymuję nowe instrukcje (po pierwszym) co 60 ns. W przypadku niepotokowym, za każdym razem trwa 240. To pokazuje, że rurociągi dobrze poprawiają przepustowość.
Idąc o krok dalej, wydaje się, że na etapie dostępu do pamięci będę potrzebował jednostki dodatkowej (do obliczeń adresu). Oznacza to, że jeśli istnieje instrukcja, która nie korzysta z etapu mem w tym cyklu, mogę zrobić kolejny dodatek. W ten sposób mogę wykonać dwa etapy wykonania (jeden jest na etapie dostępu do pamięci) na jednym procesorze jednym tikiem (harmonogram jest koszmarem, ale nie idźmy tam. Dodatkowo, etap aktualizacji komputera będzie również wymagał dodatkowej jednostki w przypadek skoku, dzięki czemu mogę wykonać trzy dodatkowe stany wykonania jednym tikiem). Dysponując potokiem, można go zaprojektować tak, aby dwie (lub więcej) instrukcji mogły wykorzystywać różne etapy (lub stopnie skokowe itp.), Oszczędzając cenny czas.
Zauważ, że aby to zrobić, procesory wykonują wiele „magii” (wykonywanie poza kolejnością , przewidywanie rozgałęzień i wiele więcej), ale pozwala to na wiele instrukcji wychodzących szybciej niż bez potoku (zauważ, że potoki są zbyt długie są bardzo trudne w zarządzaniu i wiążą się z wyższymi kosztami tylko przez czekanie między etapami). Drugą stroną jest to, że jeśli zrobisz zbyt długi rurociąg, możesz uzyskać niesamowitą szybkość zegara, ale stracić wiele pierwotnych korzyści (posiadania tego samego rodzaju logiki, który może istnieć w wielu miejscach i być używany w tym samym czasie) ).
Odpowiedź nr 2:
Procesory SIMD (wiele danych z pojedynczą instrukcją) (jak większość procesorów graficznych) wykonują wiele pracy na wielu bitach informacji, ale zajmuje to więcej czasu. Odczyt wszystkich wartości zajmuje więcej czasu (oznacza wolniejszy zegar, choć jest to do pewnego stopnia przesunięcie przez znacznie szerszą magistralę), ale można uzyskać o wiele więcej instrukcji naraz (bardziej efektywne instrukcje na cykl).
Odpowiedź nr 3:
Ponieważ można „oszukiwać” sztucznie wydłużać liczbę cykli, dzięki czemu można wykonać dwie instrukcje w każdym cyklu (wystarczy zmniejszyć o połowę prędkość zegara). Możliwe jest również zrobienie czegoś co dwa tiki w przeciwieństwie do jednego (co daje 2x szybkość zegara, ale nie zmienia instrukcji w sekundę).