Instrukcja Wikipedii na sekundę mówi, że i7 3630QM zapewnia ~ 110 000 MIPS przy częstotliwości 3,2 GHz; byłoby to (instrukcje 110 / 3.2) / 4 rdzenie = ~ 8,6 instrukcji na cykl na rdzeń ?! Jak pojedynczy rdzeń może dostarczyć więcej niż jedną instrukcję na cykl?
W moim rozumieniu potok powinien być w stanie dostarczyć tylko jeden wynik na zegar.
Oto moje myśli:
- Częstotliwość wewnętrzna jest w rzeczywistości wyższa niż 3,2 GHz
- Niektóre części procesora są asynchroniczne w sposób, którego tak skromny człowiek jak ja nie może zrozumieć
- Istnieje wiele współbieżnych potoków na rdzeń
- Potok może dostarczyć więcej niż wynik na zegar, instrukcja może pominąć etapy potoku i istnieje wiele preselektorów, aby nadążyć
- Coś mi brakuje
microprocessor
cpu
computer-architecture
Pracuj mniej
źródło
źródło
Odpowiedzi:
Po pierwsze, jak zauważają komentarze Keelana i odpowiedź Turbo J , pomiar wynosił 113 093 Dhrystone MIPS, a nie rodzimy MIPS.
Mikroarchitektura Ivy Bridge w i7 3630QM może zatwierdzić tylko 4 stopione µops na cykl, choć może rozpocząć wykonywanie 6 µops na cykl. (Liczba stopionych mikroprocesorów w śladzie kodu jest w przybliżeniu równa liczbie instrukcji; niektóre złożone instrukcje są dekodowane w wiele mikroprocesorów, które nie są stopione, a niektóre pary instrukcji mogą zostać połączone w pojedynczy mikroprocesor, np. Natychmiastowe porównanie a następnie skok warunkowy.)
Dwie twoje spekulacje na temat tego, w jaki sposób można wykonać wiele instrukcji w jednym cyklu, są dość aktualne i zostały wykorzystane w rzeczywistych procesorach. Twoja pierwsza spekulacja, że używany jest szybszy zegar wewnętrzny, została wykorzystana w oryginalnych ALU „ognistej kuli” Pentium 4. Te ALU były taktowane dwukrotnie większą częstotliwością niż reszta rdzenia, która była już stosunkowo wysoka.
(Osiągnięto to poprzez zastosowanie przesuniętej ALU, w której dolna połowa dodawania została wykonana w jednym cyklu, umożliwiając zależnej operacji wykorzystanie dolnej połowy wyniku w następnym cyklu. W przypadku operacji takich jak dodawanie, xor lub lewe przesunięcie które potrzebują tylko dolnej połowy argumentów, aby uzyskać pełną dolną połowę wyniku, takie przesunięcie - znane również jako potokowanie szerokości - pozwala na opóźnienie wyniku pojedynczego cyklu, a także przepustowość pojedynczego cyklu).
HyperSPARC wykorzystał nieco pokrewną technikę, kaskadowe ALU. HyperSPARC wprowadził wyniki z dwóch ALU do trzeciej ALU. Umożliwiło to wykonanie dwóch niezależnych i trzeciej zależnej operacji w jednym cyklu.
Twoja spekulacja, że „istnieje wiele równoległych potoków na rdzeń” to inna technika, która została zastosowana. Ten typ konstrukcji jest nazywany superskalarnym i jest zdecydowanie najczęstszym sposobem na zwiększenie liczby operacji wykonywanych w jednym cyklu.
Warto również zwrócić uwagę na kilka innych szans i zakończeń wykonywania instrukcji. Niektóre operacje można wydajniej wykonywać poza zwykłymi jednostkami wykonawczymi. Technika eliminacji przenoszenia wykorzystuje wykorzystanie zmiany nazwy rejestru w procesorach poza kolejnością do wykonywania operacji przenoszenia podczas zmiany nazwy rejestru; ruch po prostu kopiuje numer rejestru fizycznego z jednej pozycji w tabeli zmiany nazwy (zwanej tabelą aliasów rejestru) do innej. To nie tylko skutecznie zwiększa szerokość wykonania, ale także usuwa zależność. Technikę tę stosowano wcześniej w x87 opartej na stosie, ale obecnie jest szeroko stosowana w wysokowydajnych procesorach x86 Intela. (Zastosowanie destrukcyjnych instrukcji z dwoma argumentami w x86 sprawia, że eliminacja ruchu jest bardziej pomocna niż w typowym RISC.)
Techniką podobną do eliminacji ruchu jest obsługa instrukcji zerowania rejestru podczas zmiany nazwy. Podając nazwę rejestru, która podaje wartość zerową, instrukcja kasowania rejestru (np. Xor lub odejmij, przy czym oba operandy są tym samym rejestrem) może po prostu wstawić tę nazwę do tabeli zmiany nazwy (RAT).
Inna technika stosowana przez niektóre procesory x86 zmniejsza koszty operacji push i pop. Zwykle instrukcja wykorzystująca wskaźnik stosu musiałaby czekać pełny cykl na poprzednie wypychanie lub pop, aby zaktualizować wartość wskaźnika stosu. Uznając, że push i pop tylko dodają lub odejmują niewielką wartość wskaźnika stosu, można obliczyć wyniki wielu dodań / poddziałań równolegle. Głównym opóźnieniem dodawania jest propagacja przenoszenia, ale przy małych wartościach bardziej znaczące bity wartości podstawowej - w tym przypadku wskaźnika stosu - będą miały najwyżej jedno przeniesienie. Pozwala to zastosować optymalizację podobną do optymalizacji sumy „carry-select” w przypadku wielu dodatków o małych wartościach. Ponadto, ponieważ wskaźnik stosu jest zwykle aktualizowany tylko przez stałe,
Możliwe jest również scalenie instrukcji w jedną, bardziej złożoną operację. Podczas gdy odwrotny proces dzielenia instrukcji na wiele, prostsze operacje są starą techniką, łączenie instrukcji (które Intel określa jako fuzja makrooperacji) może umożliwić implementacji obsługę operacji bardziej złożonych niż te ujawnione w zestawie instrukcji.
Od strony teoretycznej zaproponowano inne techniki. Małe stałe inne niż zero mogą być obsługiwane w RAT, a niektóre proste operacje, które wykorzystują lub niezawodnie wytwarzają tak małe wartości, mogą być obsługiwane wcześniej. („Inlining rejestru fizycznego”, Mikko H. Lipasti i in., 2004, zasugerowali użycie RAT jako sposobu zmniejszenia liczby rejestrów, ale pomysł można rozszerzyć, aby obsługiwał ładowanie małych natychmiastowych i prostych operacji na małych liczbach.)
W przypadku pamięci podręcznych śledzenia (które przechowują sekwencje instrukcji przy określonych założeniach przepływu sterowania) mogą istnieć możliwości scalenia operacji oddzielonych gałęziami i usunięcia operacji, które powodują niewykorzystane wyniki śledzenia. Buforowanie optymalizacji w pamięci podręcznej śledzenia może również zachęcać do przeprowadzania optymalizacji, takich jak łączenie instrukcji, co może nie być opłacalne, jeśli trzeba je wykonać przy każdym pobieraniu strumienia instrukcji.
Prognozowania wartości można użyć do zwiększenia liczby operacji, które można wykonać równolegle poprzez usunięcie zależności. Predyktor wartości oparty na krokach jest podobny do wspomnianej wcześniej optymalizacji pop / push wyspecjalizowanego silnika stosu. Może obliczać wiele dodatków głównie równolegle, usuwając serializację. Ogólna koncepcja przewidywania wartości polega na tym, że przy przewidywanej wartości operacje zależne mogą przebiegać bezzwłocznie. (Kierunek rozgałęzienia i przewidywanie celu jest w rzeczywistości bardzo ograniczoną formą przewidywania wartości, umożliwiającą pobranie następujących instrukcji, które zależą od „wartości” rozgałęzienia - wziętej lub nie - oraz adresu następnej instrukcji, innej wartości.)
źródło
Pewna mroczna magia dzieje się w nowoczesnych procesorach, ale twoje myśli są zdecydowanie właściwe.
Kluczem do zrozumienia wydajności współczesnych procesorów jest uświadomienie sobie, że są one superskalarne . Z Wikipedii (moje podkreślenie):
Te nowoczesne procesory mają wiele jednostek wykonawczych na rdzeń, jak się domyślacie. Interesujące jest hiperwątkowanie , niektóre części potoku są zduplikowane, a niektóre nie.
Wykonanie poza kolejnością jest również interesujące, o którym można przeczytać, ale nie odpowiada bezpośrednio na twoje pytanie. Zmniejsza to jednak liczbę „zmarnowanych” cykli procesora.
Na efektywność ma również wpływ wiele innych rzeczy, które mogą powodować blokadę wewnątrz procesora, w tym (ale zdecydowanie nie tylko):
Nowoczesne kompilatory próbują pomóc w wielu z powyższych elementów, a następnie procesor przejmuje kontrolę. Dla dobrego przykładu zobacz to pytanie w innym miejscu na Stackexchange, który podkreśla istotną różnicę między dwiema instrukcjami, które mogą zrobić to samo (w niektórych okolicznościach). Jednak na niektórych procesorach jeden może być „szybszy” niż drugi ze względu na używaną jednostkę wykonawczą.
Aby zapoznać się z czytelnym dla człowieka objaśnieniem współczesnego potoku procesora, zobacz Podróż przez potok procesora . Aby uzyskać nieco bardziej techniczne wyjaśnienie, zobacz dokument Microarchitecture Agner Fog .
źródło
Jak myślisz, co się stało: wszyscy inżynierowie z Intela, AMD i IBM przeczytali, że potok może dostarczyć tylko jeden wynik na cykl, i powiedzieli „no cóż, więc to nie może przyspieszyć tych procesorów”. Czy też przeczytali to i powiedzieli: „Nie można dostarczyć więcej niż jednego wyniku na cykl? Zobaczymy o tym!”.
Aby na przykład zapoznać się z architekturą Haswell, możesz skorzystać z tego linku http://www.realworldtech.com/haswell-cpu/ lub po prostu przejść na stronę Intela, gdzie znajdziesz trochę dokumentacji.
Każdy rdzeń procesora Haswell ma ogromną liczbę jednostek wykonawczych, które mogą wykonywać operacje niezależnie od siebie, dzięki czemu wiele operacji może być wykonywanych równolegle. Następnie procesor Haswell ma kilka jednostek wykonawczych, które obsługują operacje wektorowe o wielkości do 256 bitów. Operacja wektorowa może na przykład wykonywać cztery operacje zmiennoprzecinkowe podwójnej precyzji lub osiem operacji zmiennoprzecinkowych pojedynczej precyzji w jednej operacji wektorowej. I na koniec procesor Haswella obsługuje „łączone wielokrotne dodawanie”, co oznacza, że obliczenie razy b plus c jest tylko pojedynczą operacją.
Teoretyczne maksimum, ponieważ Haswell ma dwie jednostki zdolne do stopionego dodawania wielokrotnego dodawania, to dwie stopione operacje wielokrotnego dodawania na cykl, każda operacja wykonuje osiem pojedynczych precyzji mnożenia i dodawania lub 32 pojedyncze precyzyjne operacje zmiennoprzecinkowe.
Procesor 3630 nie znajduje się w najnowszym cenniku Intela, ale istnieją modele takie jak 3740QM z czterema rdzeniami. Zamiast 32 możesz uzyskać 128 operacji zmiennoprzecinkowych na cykl zegara. To teoretyczne maksimum. Osiągnięcie połowy tego w prawdziwym życiu jest wyzwaniem, ale nie jest niemożliwe do wykonania odpowiednich zadań. Istnieją inne procesory dostępne z maksymalnie 15 rdzeniami (w cenach, które nie zapłacą nawet najbardziej fanatyczni fanatycy gier).
Masz więc kombinację kilku mnożników:
8,6 operacji na cykl nie jest zbyt trudne do osiągnięcia. Nawet 8,6 operacji na cykl na rdzeń nie jest zbyt trudne.
źródło
ADD
instrukcji oparte na tym, czy przepełnienie powinno pozostać niezmienione, czy też należy je ustawić, gdy nastąpi przepełnienie (i pozostawić ustawione, jeśli tak nie jest).Benchmark Drystone pochodzi z 1984 roku, a odpowiadająca mu nominalna maszyna 1 MIPS VAX nie jest bardzo wydajna pod względem nowoczesnym. Nawet Cortex M3 zapewnia 1,25 DMPIS / MHz.
Procesory achitecture Intel Core mogą rzeczywiście uruchamiać wiele instrukcji równolegle w jednym rdzeniu, ponieważ obecnych jest wiele jednostek obliczeniowych.
źródło
Nauczyłem się bardzo dużo od Jona „Hannibala” Stssa z Ars Technica doskonałych i obszernych artykułów na temat architektury mikroprocesorów. Artykuły są nieco przestarzałe (wydaje się, że pochodzą z około 2004 roku), ale nadal są bardzo aktualne.
Niektóre linki do następnej części artykułu są zepsute, jednak wydaje się, że możesz je naprawić samodzielnie, ostrożnie porównując adres URL pierwszej części i uszkodzony adres URL następnej strony (np. Dodając
m-
gdzieś w adresie URL).(tak, to jest chwalebna odpowiedź tylko za pośrednictwem linku, przepraszam; artykuły są zbyt piękne, aby o nich nie wspomnieć)
źródło