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