Ostatnio natknąłem się na wikipedi na taką ciekawostek i od kilku dni mnie nortuje. Od czego do zależy ?
"Wydajność procesora nie zawsze idzie w parze z jego taktowaniem, np. procesor PA-RISC 8600 przy taktowaniu 552 MHz jest blisko dwukrotnie wydajniejszy w obliczeniach zmiennoprzecinkowych od procesora Pentium III 800 MHz."
Oj panie, temat jest tak złożony, że nie da się tego dobrze i krótko opisać.
Generalnie jak porównasz np procesor Atom pierwszej generacji oraz Intel Core i7 najnowszej generacji dając im takie samo taktowanie to zauważysz, że Core i7 działa wielokrotnie szybciej, nawet jeśli obliczenia są jednowątkowe i nie wykorzystują więcej pamięci podręcznej niż ta w Atomie.
W zasadzie od czasów Pentium (pierwszego) wszystkie procesory x86 Intela potrafią czasami wykonać więcej niż jedną instrukcję na takt. Najnowsze generacje procków potrafią zdekodować 4 instrukcje w cyklu (do tego mają pamięć podręczną na zdekodowane instrukcje) do tak zwanych mikrooperacji, potrafią wykonać chyba do 8 mikrooperacji na takt (na jednym rdzeniu), mają wielopoziomowe przewidywanie skoków (źle przewidziany skok oznacza konieczność zresetowania całego potoku wykonawczego, co może trwać nawet dziesiątki taktów) oraz dostępu do pamięci z wyprzedzeniem (dostęp do pamięci RAM to czasem setki taktów, warto je robić z wyprzedzeniem, dzięki czemu CPU się nie nudzi), robią wykonywanie spekulatywne (co chyba omija problem źle przewidzianych skoków dla prostych rozgałęzień), mają bufor dla zapisu do pamięci (tzn to jest coś w stylu asynchronicznego zapisu do RAMu, ale są dodatkowe układy, które gwarantują spójność pamięci poprzez komunikację między różnymi poziomami pamięci podręcznych), itp itd
Jeśli chodzi o obliczenia zmiennoprzecinkowe to tutaj jest nieco inaczej, bo np skoki czy dostęp do pamięci nie zaliczają sie do operacji zmiennoprzecinkowych. Za to bardzo często operacje zmiennoprzecinkowe są robione na małych wektorach danych, np 4 x 32-bitowy float, co w sprzyjających warunkach daje 4x kopa wydajnościowego. Najnowsze rozszerzenia AVX od Intela pozwalają chyba na wektory 16 x 32-bit float (albo coś w ten deseń, efektywnie mamy więc procesor 512-bitowy, pod pewnym względem). Obliczenia na wektorach też mogą być superskalarne, czyli np procesor może mieć możliwość wykonywania operacji na więcej niż jednym wektorze naraz.
Niektóre instrukcje zajmują dużo więcej niż jeden takt. Są to np liczenia sinusów, dzielenie, pierwiastkowanie, etc Zależnie od implementacji taka instrukcja może zabierać więcej taktów albo mniej. Generalnie jak się ma większy budżet tranzystorów to można zaszaleć z szybszym algorytmem, mając mniejszy budżet trzeba wymyślić coś sprytnego, ale jednocześnie lekkiego. Budżet tranzystorów determinuje także obecność wszystkich trików, które opisałem powyżej. Im więcej tranzystorów, tym układ droższy w produkcji i wydzielający więcej ciepła (choć z tym to nie do końca prawda, bo ciepło jest wprost proporcjonalne do mocy, a ta od kwadratu napięcia i wprost od taktowania; maksymalne stabilne taktowanie zależy od napięcia i chłodzenia, więc małe zmiany taktowania mogą skutkować dużymi zmianami w poborze prądu; można zrobić sprytniejszy układ i go niżej taktować, dostając lepszą wydajność i mniejszy pobór prądu).
Warto poczytać to: http://agner.org/optimize/