Dlaczego nie możesz mieć zarówno wysokich instrukcji na cykl, jak i wysokiej częstotliwości zegara?

37

Megahertz Myth stał się taktyką promocyjną ze względu na różnice między procesorem INTEL 8086 na PC a procesorem Rockwell 6502 firmy Apple. 8086 działał z częstotliwością 4,77 MHz, podczas gdy 6502 działał z częstotliwością 1 MHz. Jednak instrukcje dotyczące 6502 wymagały mniejszej liczby cykli; tak wiele mniej, że działał szybciej niż 8086. Dlaczego niektóre instrukcje wymagają mniejszej liczby cykli? I dlaczego instrukcje 6502, wymagające mniejszej liczby cykli, nie mogą być łączone z szybkim procesorem cyklicznym 8086?

Artykuł Wikipedii z instrukcjami na cykl (IPC) mówi

Czynniki rządzące IPC
Dany poziom instrukcji na sekundę można osiągnąć przy wysokim IPC i niskiej częstotliwości zegara ... lub przy niskim IPC i wysokiej częstotliwości zegara.

Dlaczego nie możesz mieć zarówno wysokich instrukcji na cykl, jak i wysokiej częstotliwości zegara?

Może ma to związek z tym, czym jest cykl zegara? Wikipedia wspomina o synchronizacji obwodów? Nie jestem pewna co to oznacza.

A może ma to związek z tym, jak działa rurociąg? Nie jestem pewien, dlaczego instrukcje w krótkim potoku różnią się od instrukcji w długim potoku.

Każdy wgląd byłby świetny! Próbuję zrozumieć architekturę mitu. Dzięki!

Referencje:

Instrukcja na cykl w porównaniu ze zwiększoną liczbą cykli

http://en.wikipedia.org/wiki/Instructions_per_cycle

http://en.wikipedia.org/wiki/Clock_cycle

dobus
źródło
1
> Dlaczego niektóre instrukcje wymagają mniejszej liczby cykli? RISC / CISC (cóż, w pewnym sensie ). I dlaczego instrukcje 6502, wymagające mniejszej liczby cykli, nie mogą być łączone z szybkim procesorem cyklicznym 8086? Mogą i mają. Problem polega na tym, że gdy już utworzysz bazę, trudno jest rzucić wszystko i rozpocząć kolejny model od zera.
Synetech,
@Synetech, intel kinda sorta zrobił to, prezentując programistom zestaw instrukcji CISC, a następnie konwertując go na instrukcje RISCier na chipie
soandos
Cóż, kiedy powiedziałem, że oba zostały połączone, miałem na myśli zupełnie innych twórców układów. Nie mam pod ręką żadnej listy, ale były takie (nie Intel / AMD), które zrobiły takie rzeczy. (Większość ludzi zapomina, że ​​jest wielu producentów układów, ponieważ Intel i AMD dominują teraz na rynku komputerów stacjonarnych.)
Synetech

Odpowiedzi:

21

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:

  1. Nie wszystkie instrukcje zajmują tyle samo czasu
  2. 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:

wprowadź opis zdjęcia tutaj

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ę).

soandos
źródło
3
Krótkie rurociągi oznaczają wolniejsze prędkości zegara! Pentium 4 miał wysokie zegary z powodu długich potoków, oto WP: „NetBurst różnił się od P6 (Pentium III, II itd.), Oferując bardzo głęboki potok instrukcji, aby osiągnąć bardzo wysokie częstotliwości taktowania”. Chodzi o to, że niewiele robisz na etapie, aby osiągnąć wysokie prędkości. Nie okazało się to jednak wykonalne i Intel stracił z tego powodu ogromny impet dla AMD. Wrócili do architektury Pentium 3 i wymyślili „Core”.
stolsvik
@stolsvik, możesz to wyjaśnić? To nie ma dla mnie sensu (mniej etapów pełnoekranowych oznacza, że ​​wszystkie pozostałe są równe, cykle zegara będą krótsze, co da wyższą częstotliwość zegara)
soandos
4
Jeden etap rurociągu jest wykonywany na cykl zegara ; Cały potok przesuwa się o krok do przodu - pobieranie nowych instrukcji u dołu, „wysyłanie” gotowych instrukcji u góry. Dlatego pomysł z Pentium4 polegał na wykonaniu bardzo małych kroków, które były szybkie do wykonania, dając wysokie zegary, ale tym samym wymagające długiego rurociągu. Wskazówka z potokiem (wszystkie procesory używają jednego) polega na tym, że w każdej chwili przetwarzanych jest kilka instrukcji. Długi rurociąg oznacza, że ​​wiele instrukcji jest w toku - a jeśli przewidywanie rozgałęzienia się nie powiedzie, będziesz musiał przepłukać całą rurę.
stolsvik
W przypadku odpowiedzi nr 2 procesor uzyskuje dostęp do danych tylko przez pamięć podręczną (dostęp do pamięci jest zazwyczaj przezroczysty z perspektywy instrukcji). Spowolnienie częstotliwości zegara nie wpłynie na to, jak długo dane będą przychodzić z pamięci RAM (jeśli nie ma ich w pamięci podręcznej). Ponadto szerokość magistrali wpływa tylko na szybkość operacji SIMD w stosunku do wielkości operandów (tzn. Mogę załadować 8 argumentów 8-bitowych na 64-bitową magistralę na raz, ale nadal muszę ręcznie załadować 8 wartości 64-bitowych jeśli mam 64-bitowe operandy).
Przełom
2
Również dla odpowiedzi nr 1, kiedy powiesz „jeśli istnieje instrukcja, która nie korzysta z etapu mem w tym cyklu, to mogę zrobić kolejny dodatek”, jest to nieprawda. Realizacja poza kolejnością jest stosowana na poziomie instrukcji, a nie na poziomie mikrooperacji. Jeśli instrukcja wymagała dwóch uruchomień w potoku, spowodowałoby to powstanie bańki w potoku . Wreszcie architektura x86 ma osobne ALU do obliczania adresów pamięci w locie podczas odczytu / zapisu pamięci (pozwala na [EBX+ECX*4+100]adresowanie stylu).
Przełom
8

Upraszczam to bardzo, ale ważne jest, aby pamiętać, że te terminy porównują jabłka do pomarańczy. „Cykl” nie jest pojedynczą zunifikowaną jednostką miary, która jest taka sama dla wszystkich procesorów, tak jak „sekunda” jest zunifikowanym pomiarem czasu. Zamiast tego cykl reprezentuje pewną jednostkę pracy, która jest definiowana nieco arbitralnie, ale ograniczona złożonością projektu rurociągu i oczywiście fizyką.

W wielu przypadkach wykonanie dużej ilości pracy w jednym cyklu może umożliwić wyczyszczenie całego rurociągu. Jeśli się powiedzie, oznacza to, że następny cykl nie zostanie zoptymalizowany, ponieważ musisz ponownie wypełnić rurociąg, co może zająć trochę czasu.

Mógłbym zaprojektować bardzo uproszczony procesor, który przetwarza jeden etap jednej instrukcji RISC w każdym cyklu, a gdyby to była podstawa mojego procesora, prawdopodobnie mógłbym osiągnąć bardzo, bardzo wysokie cykle na sekundę ze względu na zmniejszoną złożoność tego, co stanowi „ cykl".

Szczegóły dotyczą wielu zagadnień z fizyki i elektrotechniki, których tak naprawdę nie rozumiem, ale pamiętaj, że taktowania nie osiąga się po prostu naiwnie dodając napięcie wejściowe do procesora i mając nadzieję na najlepsze. Przynajmniej profil termiczny jest kolejnym niezbędnym problemem.

allquixotic
źródło
To tak naprawdę nie odpowiada na jego pytanie (które nie ma nic wspólnego z tym, dlaczego rzeczy nie można po prostu przyspieszyć).
Pyta,
Ta odpowiedź dotyczy jednak problemu, którego nie widziałem w innych odpowiedziach, tj. Mówi o włączeniu określonych zestawów instrukcji, które wykonują operacje przy mniejszej liczbie cykli zegara, oraz o możliwości pomiaru cykli zegarowych w oparciu o najwolniejsze zestawy instrukcji, które mogą nie być tak wydajnym. (Mogę się bardzo mylić ... Uważam, że architektura jest fascynująca, ale w żadnym wypadku nie uważam się za eksperta)
Stephen R
5

Oto bardzo proste (być może rażąco uproszczone) wyjaśnienie: powiedzmy, że masz szczególne zadanie do wykonania, na przykład dodaj dwie liczby 32-bitowe. Możesz zastosować dwa podejścia. Możesz podzielić go na bardzo dużą liczbę bardzo małych kroków lub możesz podzielić go na niewielką liczbę bardzo dużych kroków.

Na przykład możesz po prostu powiedzieć „dodaj dwie liczby”. Teraz masz tylko jeden krok. Ale ten krok składa się z wielu części i potrwa dłużej. Masz więc wysoką liczbę instrukcji na cykl - w tym przypadku jedną. Ale twoja prędkość zegara nie może być wysoka, ponieważ masz wiele do zrobienia w tym cyklu.

Możesz też powiedzieć: „Pobierz pierwszą liczbę do rejestru. Następnie pobierz drugą liczbę. Następnie dodaj najmniej znaczące bity. Następnie dodaj drugi najmniej znaczący bit z przeniesieniem z wcześniej. Następnie dodaj trzeci najmniej ... Następnie dodaj najbardziej znaczące bity. Jeśli było przeniesienie, ustaw flagę przepełnienia. Następnie zapisz wynik w pamięci. " Teraz masz ogromną liczbę kroków. Ale każdy krok może być absurdalnie szybki. Masz więc małą liczbę instrukcji na cykl (w tym przypadku około 1/36). Ale twoja prędkość zegara może być bardzo wysoka, ponieważ każdy cykl ma tylko bardzo mały do ​​zrobienia.

Aby mieć zarówno wysoką liczbę instrukcji na cykl, jak i wysoką częstotliwość zegara, należy podzielić złożoną instrukcję na bardzo małą liczbę bardzo prostych kroków. Ale nie można tego zrobić, ponieważ instrukcja jest złożona.

Rzeczywiste konkretne kompromisy i liczby cykli są bardzo różne, ponieważ nowoczesne procesory są przetwarzane potokowo i nakładają się na siebie instrukcje. Ale podstawowa idea jest poprawna.

David Schwartz
źródło
2

Państwo może mieć zarówno wysokie instrukcji na cykl i wysoką prędkość zegara. Tam, gdzie napotykasz limity, opóźnienie propagacji obwodu cyfrowego przekracza szerokość impulsu pojedynczego cyklu zegara. Można temu zaradzić, zwiększając napięcie procesora, ale należy zauważyć, że zwiększy to zużycie energii (a tym samym rozproszenie ciepła).

Jeśli więc chcesz uzyskać wyższą prędkość zegara, musisz zwiększyć napięcie (zwiększenie prędkości dryfu elektronu ), aby zmniejszyć opóźnienie propagacji. Jeśli to opóźnienie przekroczy cykl zegara, procesor najprawdopodobniej nie będzie zachowywał się zgodnie z oczekiwaniami, a uruchomione na nim oprogramowanie ulegnie awarii lub zgłosi wyjątek. Oczywiście istnieje ograniczenie napięcia, które można przepuszczać przez procesor, a jest to podyktowane samą konstrukcją procesora - głównie zdolnością przenoszenia prądu wewnętrznych ścieżek elektrycznych.


Potokowanie pozwala w niektórych przypadkach na wyższe częstotliwości taktowania, ponieważ każda instrukcja jest podzielona na kilka mniejszych „mikrooperacji”. Te mikrooperacje są bardzo prostymi operacjami, wykorzystującymi znacznie mniejsze obwody połączone w łańcuch (w sensie fizycznym, ponieważ im mniejsza odległość elektrony muszą przebyć, tym krótsze opóźnienie propagacji przez określoną podjednostkę).

Dodatkową zaletą procesora potokowego jest to, że można znacznie zwiększyć liczbę instrukcji wykonywanych w jednostce czasu, kosztem bardziej złożonego projektu.

To, dlaczego niektóre instrukcje wymagają mniej lub więcej cykli, zależy od tego, jakie instrukcje wykonujesz. Na przykład w zestawie instrukcji x86 znajduje się MOVSinstrukcja, która może przenosić cały łańcuch w pamięci z jednego miejsca do drugiego. Oczywiście nie można natychmiast skopiować długiego łańcucha, ale można to zrobić, kopiując słowo po słowie, biorąc wiele cykli zegara. Dlatego MOVSinstrukcja zajmuje zmienną ilość czasu (w zależności od ilości znaków do skopiowania).

Wpływ operacji wielocyklowych jest mniej zauważalny na projekt RISC (tj. ARM) w przeciwieństwie do projektu CISC (tj. X86). Wynika to z faktu, że projekty oparte na RISC będą miały tylko najczęściej używane operacje elementarne i są znacznie łatwiejsze do potokowania w taki sposób, aby uzyskać przepustowość jednej instrukcji na cykl.

Przełom
źródło
1

Czas, jaki zajmuje komputer do ukończenia określonego zadania, nie zależy od szybkości zegara komputera ... zależy od tego, w jaki sposób jednostki obliczeniowe są projektowane i konstruowane.

Szybkość zegara jest w rzeczywistości (mniej lub bardziej) arbitralną decyzją projektanta procesora, czasem z dobrych powodów (wydajność), a czasem dla słabych (reklama).

Powiedzmy, że dany procesor ma mieszankę instrukcji, których ukończenie zajmuje od 1 do 100 nanosekund (ns). Możesz ustawić częstotliwość tak, aby 1 „tik” wynosił 100 ns (10 MHz), co oznacza, że ​​każda instrukcja kończy się dokładnie 1 tikiem. Jeśli jednak czas wykonania instrukcji jest równomiernie rozłożony, oznacza to, że twoje jednostki obliczeniowe byłyby bezczynne w 50% czasu (średnia prędkość wykonania wynosiłaby 50ns, pozostawiając pozostałe 50ns z tykania bezczynności). Z drugiej strony, jeśli ustawisz tik na 10ns, instrukcje będą w zakresie od 1 do 10 tików, ale jednostka nigdy nie będzie bezczynna dłużej niż 9ns przed rozpoczęciem kolejnej instrukcji, a średnia bezczynność wyniesie 5ns.

Podczas projektowania procesor zostanie zaprojektowany tak, aby działał z określoną prędkością w zależności od tego, ile pracy procesor jest w stanie faktycznie wykonać. Jeśli zwiększysz lub zmniejszysz częstotliwość taktowania, tak naprawdę nie zmienisz ilości pracy, jaką procesor może wykonać, po prostu zadzierasz ze współczynnikiem wydajności.

(I zanim zaczniesz płakać z powodu podkręcania procesorów: daje to dwie korzyści, które powodują rzeczywiste zwiększenie prędkości: szybkie wykonywanie instrukcji (które zajmują mniej niż 1 cykl) skutkuje szybszymi czasami wykonania, a wszystkie instrukcje mają mniej czasu bezczynności. Oba z nich może w rzeczywistości zwiększyć ilość pracy, jaką może wykonać komputer, ale przekonasz się, że podkręcenie procesora o X% nie zawsze równa się X% wzrostu pracy wykonanej podczas jego testowania).

TL; DR

Procesor może wykonać pracę X w ciągu sekundy. Jeśli używasz częstotliwości zegara H i I IPC, mamy I = X / H. Zmiana H nie zmienia X, ale odwrotnie wpływa na I.

Benjamin Chambers
źródło
1
Szybkość zegara jest daleka od arbitralnej decyzji. Należy go starannie wybrać w zależności od napięcia zasilania procesora, a także długości śladu IC (aby uniknąć nadmiernych opóźnień propagacji).
Przełom
Myślę, że przegapiłeś fakt, że procesor to synchroniczny obwód cyfrowy . Instrukcje nie biorą X nanosekund (zakładając, że twój cykl zegara jest krótszy niż opóźnienie propagacji), wszystko dzieje się na rosnącym lub malejącym zboczu zegara - lub na obu. Instrukcje zajmują X cykli, a nie X jednostek czasu. Tak, możesz zmienić długość cyklu, ale rozróżnia się to, co się dzieje, kiedy. I wreszcie, ilość pracy, jaką procesor może wykonać w ciągu sekundy, jest funkcją szybkości zegara, więc twoja formuła tak naprawdę nie sprawdza się tutaj.
cp2141
CPU to synchroniczne połączenie kilku jednostek asynchronicznych. Tiki zegara są używane do ładnego wyrównania, ale nie określają, jak długo zajmuje wykonanie ... Na przykład dodanie liczby całkowitej zajmie pewien czas w zależności od tego, jak daleko prąd musi przejść przez procesor i jak szybko tranzystory zmieni stany. Wynik jest ODCZYTYWANY przy następnym takcie zegara, ale rzeczywiste obliczenia są wykonywane asynchronicznie w całym takcie.
Benjamin Chambers
0

Nie można mieć zarówno wysokich instrukcji na cykl, jak i dużej częstotliwości taktowania, ponieważ wymagania są sprzeczne.

Można pokazać, że w pierwszym przybliżeniu IPC zależy od złożoności (A) projektu jako

IPC = sqrt (A)

mając na uwadze, że maksymalna częstotliwość (F) osiągalna przez skale projektowe to [1]

F = 1 / {b + c sqrt (A)}

z parametrami a, b i c.

Tak więc zwiększenie złożoności muarcha zwiększa IPC kosztem zmniejszenia częstotliwości roboczej, podczas gdy zmniejszenie złożoności zwiększa częstotliwość kosztem IPC. Odpowiada to dwóm skrajnym przypadkom wspomnianym w artykule na Wikipedii, ale wikipedia nie wymienia nazw: Brainiac i Speed-Demon.

  • Konstrukcja Brainiac: Wysoka IPC i niska częstotliwość
  • Speed-demon desing: Wysoka częstotliwość i niski IPC.

[1] Niektórzy autorzy twierdzą, że zamiast tego wyrażeniem częstotliwości jest „1 / {b + c A}”, ale w obu przypadkach zwiększenie złożoności zmniejsza maksymalną osiągalną częstotliwość.

juanrga
źródło