Jednostka centralna - Central processing unit

Intel 80486DX2 CPU, jak wynika z powyżej
Dolna strona Intel 80486DX2 z widocznymi pinami

Jednostki centralnej ( CPU ), zwany także centralny procesor , procesor główny lub tylko procesor , to układ elektroniczny , który wykonuje instrukcje zawierający program komputerowy . Procesor wykonuje podstawowe operacje arytmetyczne , logiczne, sterujące i wejścia/wyjścia (I/O) określone przez instrukcje w programie. Kontrastuje to z komponentami zewnętrznymi, takimi jak pamięć główna i obwody we/wy oraz wyspecjalizowanymi procesorami, takimi jak procesory graficzne (GPU).

Forma, konstrukcja i implementacja procesorów zmieniały się z biegiem czasu, ale ich podstawowe działanie pozostaje prawie niezmienione. Główne elementy procesora obejmują jednostkę arytmetyczno-logiczną (ALU), która wykonuje operacje arytmetyczne i logiczne , rejestry procesora, które dostarczają operandy do jednostki ALU i przechowują wyniki operacji ALU, oraz jednostkę sterującą, która organizuje pobieranie (z pamięci), dekodowanie i wykonywanie instrukcji poprzez kierowanie skoordynowanymi operacjami jednostki ALU, rejestrów i innych komponentów.

Większość nowoczesnych procesorów jest zaimplementowanych na mikroprocesorach z układem scalonym (IC) , z jednym lub większą liczbą procesorów na jednym układzie scalonym z półprzewodnikami metal-tlenek (MOS). Układy mikroprocesorowe z wieloma procesorami to procesory wielordzeniowe . Poszczególne procesory fizyczne, rdzenie procesorów , mogą być również wielowątkowe, aby utworzyć dodatkowe procesory wirtualne lub logiczne.

Układ scalony zawierający procesor może również zawierać pamięć , interfejsy peryferyjne i inne elementy komputera; takie zintegrowane urządzenia są różnie nazywane mikrokontrolerami lub systemami na chipie (SoC).

Procesory macierzowe lub procesory wektorowe mają wiele procesorów, które działają równolegle, przy czym żadna jednostka nie jest uważana za centralną. Wirtualne procesory to abstrakcja dynamicznie zagregowanych zasobów obliczeniowych.

Historia

EDVAC , jeden z pierwszych komputerów z pamięcią programu

Wczesne komputery, takie jak ENIAC, musiały zostać fizycznie zmienione w celu wykonywania różnych zadań, co spowodowało, że komputery te zostały nazwane „komputerami ze stałym programem”. Termin „jednostka centralna” jest używany już w 1955 roku. Ponieważ termin „procesor” jest ogólnie definiowany jako urządzenie do wykonywania oprogramowania (programu komputerowego), najwcześniejsze urządzenia, które słusznie można nazwać procesorami, pojawiły się wraz z nadejściem komputera z zapisanym programem .

Pomysł komputerze przechowywane zakończeniu programu był już obecny w projektowaniu Prespera Eckert i John William Mauchly „s ENIAC , ale początkowo pominięte tak, że może być zakończone wcześniej. 30 czerwca 1945 roku, zanim powstał ENIAC, matematyk John von Neumann rozprowadził artykuł zatytułowany Pierwszy szkic raportu na temat EDVAC . Był to zarys komputera z przechowywanymi programami, który ostatecznie został ukończony w sierpniu 1949 roku. EDVAC został zaprojektowany do wykonywania pewnej liczby instrukcji (lub operacji) różnego typu. Co ważne, programy napisane dla EDVAC miały być przechowywane w szybkiej pamięci komputera, a nie określone przez fizyczne okablowanie komputera. Pozwoliło to przezwyciężyć poważne ograniczenie ENIAC, które wymagało znacznego czasu i wysiłku, aby przekonfigurować komputer w celu wykonania nowego zadania. Dzięki projektowi von Neumanna program, który prowadził EDVAC, można było zmienić po prostu zmieniając zawartość pamięci. EDVAC nie był jednak pierwszym komputerem z programami przechowywanymi w pamięci; Manchester niemowląt , o małej skali eksperymentalny komputer przechowywane-Program, prowadził swój pierwszy program w dniu 21 czerwca 1948 i Manchester Mark 1 prowadził swój pierwszy program w nocy z 16-17 czerwca 1949.

Wczesne procesory były projektami niestandardowymi używanymi jako część większego, a czasem wyróżniającego się komputera. Jednak ta metoda projektowania niestandardowych procesorów dla określonej aplikacji w dużej mierze ustąpiła miejsca rozwojowi procesorów wielozadaniowych produkowanych w dużych ilościach. Ta standaryzacja rozpoczęła się w erze dyskretnych komputerów typu mainframe i minikomputerów z tranzystorami i szybko przyspieszyła wraz z popularyzacją układu scalonego  (IC). Układ scalony umożliwił projektowanie i produkcję coraz bardziej złożonych procesorów z tolerancjami rzędu nanometrów . Zarówno miniaturyzacja, jak i standaryzacja procesorów zwiększyły obecność urządzeń cyfrowych we współczesnym życiu daleko poza ograniczone zastosowanie dedykowanych maszyn obliczeniowych. Nowoczesne mikroprocesory pojawiają się w urządzeniach elektronicznych, od samochodów po telefony komórkowe, a czasem nawet w zabawkach.

Podczas gdy von Neumannowi przypisuje się najczęściej projekt komputera z programami pamięciowymi ze względu na jego projekt EDVAC, a projekt stał się znany jako architektura von Neumanna , inni przed nim, tacy jak Konrad Zuse , sugerowali i wdrażali podobne pomysły. Tzw architektura Harvard z Harvard Mark I , który został zakończony przed edvac, stosowany również projekt przechowywane-program używający dziurkowanej taśmy papierowej , a nie elektronicznej pamięci. Kluczowa różnica między architekturami von Neumanna i Harvarda polega na tym, że ta ostatnia oddziela przechowywanie i przetwarzanie instrukcji i danych procesora, podczas gdy pierwsza wykorzystuje tę samą przestrzeń pamięci dla obu. Większość nowoczesnych procesorów to głównie projekt von Neumanna, ale procesory z architekturą Harvarda są również postrzegane, szczególnie w aplikacjach wbudowanych; na przykład mikrokontrolery Atmel AVR to procesory o architekturze Harvarda.

Przekaźniki i lampy próżniowe ( lampy termoelektryczne) były powszechnie stosowane jako elementy przełączające; użyteczny komputer wymaga tysięcy lub dziesiątek tysięcy urządzeń przełączających. Ogólna prędkość systemu zależy od prędkości przełączników. Komputery z lampą próżniową, takie jak EDVAC, miały tendencję do średnio ośmiu godzin między awariami, podczas gdy komputery przekaźnikowe, takie jak (wolniejszy, ale wcześniej) Harvard Mark I, bardzo rzadko ulegały awarii. W końcu procesory lampowe stały się dominujące, ponieważ znaczne korzyści w zakresie szybkości ogólnie przewyższały problemy z niezawodnością. Większość z tych wczesnych synchronicznych procesorów działała z niskimi częstotliwościami taktowania w porównaniu do nowoczesnych konstrukcji mikroelektronicznych. Częstotliwości sygnału zegarowego w zakresie od 100 kHz do 4 MHz były w tym czasie bardzo powszechne, ograniczone w dużej mierze przez szybkość urządzeń przełączających, z którymi zostały zbudowane.

Procesory tranzystorowe

Procesor IBM PowerPC 604e

Złożoność projektowania procesorów wzrosła, ponieważ różne technologie ułatwiły budowanie mniejszych i bardziej niezawodnych urządzeń elektronicznych. Pierwsze takie ulepszenie pojawiło się wraz z pojawieniem się tranzystora . Tranzystorowe procesory w latach 50. i 60. nie musiały już być budowane z nieporęcznych, zawodnych i delikatnych elementów przełączających, takich jak lampy próżniowe i przekaźniki . Dzięki temu ulepszeniu bardziej złożone i niezawodne procesory zostały zbudowane na jednej lub kilku płytkach drukowanych zawierających dyskretne (indywidualne) komponenty.

W 1964 roku IBM wprowadził architekturę komputerową IBM System/360, która była używana w serii komputerów zdolnych do uruchamiania tych samych programów z różną szybkością i wydajnością. Było to znaczące w czasach, gdy większość komputerów elektronicznych była ze sobą niekompatybilna, nawet te wykonane przez tego samego producenta. Aby ułatwić to ulepszenie, IBM wykorzystał koncepcję mikroprogramu (często nazywanego „mikrokodem”), który wciąż znajduje szerokie zastosowanie w nowoczesnych procesorach. Architektura System/360 była tak popularna, że przez dziesięciolecia dominowała na rynku komputerów mainframe i pozostawiła spuściznę, która jest nadal kontynuowana przez podobne nowoczesne komputery, takie jak IBM zSeries . W 1965 roku firma Digital Equipment Corporation (DEC) wprowadziła na rynek kolejny wpływowy komputer przeznaczony na rynek naukowo-badawczy, PDP-8 .

Płyta Fujitsu z procesorami SPARC64 VIIIfx

Komputery oparte na tranzystorach miały kilka wyraźnych zalet w stosunku do swoich poprzedników. Oprócz ułatwienia zwiększonej niezawodności i mniejszego zużycia energii, tranzystory pozwoliły również procesorom działać ze znacznie wyższymi prędkościami ze względu na krótki czas przełączania tranzystora w porównaniu z lampą lub przekaźnikiem. Zwiększona niezawodność i radykalnie zwiększona prędkość elementów przełączających (które do tego czasu były prawie wyłącznie tranzystorami); W tym okresie z łatwością uzyskano taktowanie procesora w dziesiątkach megaherców. Ponadto, podczas gdy dyskretne procesory tranzystorowe i procesory IC były intensywnie używane, zaczęły pojawiać się nowe, wysokowydajne konstrukcje, takie jak procesory wektorowe SIMD (Single Instruction Multiple Data) . Te projekty eksperymentalne wcześnie później dała początek ery wyspecjalizowane superkomputery jak te wykonane przez Cray Inc i Fujitsu Ltd .

Procesory integracyjne na małą skalę

Procesor, pamięć rdzeniowa i interfejs magistrali zewnętrznej DEC PDP-8 /I, wykonane z układów scalonych średniej skali

W tym okresie opracowano metodę wytwarzania wielu połączonych ze sobą tranzystorów na niewielkiej przestrzeni. Układ scalony (IC), pozwoliła na wiele tranzystorów być wytwarzane w pojedynczym półprzewodnikowego opartym na matrycy , albo „chip”. Początkowo tylko bardzo podstawowe, niewyspecjalizowane układy cyfrowe, takie jak bramki NOR, zostały zminiaturyzowane w układy scalone. Procesory oparte na tych „blokowych” układach scalonych są ogólnie określane jako urządzenia „small-scale integration” (SSI). Układy scalone SSI, takie jak te używane w komputerze Apollo Guidance Computer , zwykle zawierały do ​​kilkudziesięciu tranzystorów. Zbudowanie całego procesora z układów scalonych SSI wymagało tysięcy pojedynczych chipów, ale nadal zużywało znacznie mniej miejsca i energii niż wcześniejsze konstrukcje dyskretnych tranzystorów.

System/370 firmy IBM, następca System/360, wykorzystywał układy scalone SSI zamiast modułów dyskretnych tranzystorów Solid Logic Technology . PDP-8 /I i KI10 PDP-10 firmy DEC również zamieniły się z pojedynczych tranzystorów używanych przez PDP-8 i PDP-10 na układy scalone SSI, a ich niezwykle popularna linia PDP-11 została pierwotnie zbudowana z układów scalonych SSI, ale ostatecznie została wdrożona z Komponenty LSI, gdy stały się praktyczne.

Procesory integracyjne na dużą skalę

Lee Boysel opublikował wpływowe artykuły, w tym „manifest” z 1967 r., w którym opisano, jak zbudować odpowiednik 32-bitowego komputera typu mainframe ze stosunkowo niewielkiej liczby układów scalonych o dużej skali (LSI). Jedynym sposobem budowania wióry LSI, które wiórów z sto lub więcej bramek, do tworzenia się je za pomocą MOS proces produkcji półprzewodników (albo PMOS logikę , logikę NMOS lub CMOS logiki ). Jednak niektóre firmy nadal budowały procesory z bipolarnych układów tranzystorowo-tranzystorowych (TTL), ponieważ tranzystory bipolarne były szybsze niż układy MOS aż do lat 70. (kilka firm, takich jak Datapoint, nadal budowało procesory z układów TTL do wczesnych lat). lata 80.). W latach 60. układy scalone MOS były wolniejsze i początkowo uważano je za przydatne tylko w aplikacjach wymagających małej mocy. Po opracowaniu technologii MOS z bramką krzemową przez Federico Faggina w Fairchild Semiconductor w 1968 roku, układy scalone MOS w dużej mierze zastąpiły bipolarny TTL jako standardową technologię chipową na początku lat 70. XX wieku.

Wraz z postępem technologii mikroelektronicznej na układach scalonych umieszczano coraz większą liczbę tranzystorów, zmniejszając liczbę pojedynczych układów scalonych potrzebnych do kompletnego procesora. Układy scalone MSI i LSI zwiększyły liczbę tranzystorów do setek, a następnie tysięcy. Do 1968 r. liczba układów scalonych wymaganych do zbudowania kompletnego procesora została zmniejszona do 24 układów scalonych ośmiu różnych typów, przy czym każdy układ scalony zawierał około 1000 tranzystorów MOSFET. W przeciwieństwie do poprzedników SSI i MSI, pierwsza implementacja LSI w PDP-11 zawierała procesor składający się tylko z czterech układów scalonych LSI.

Mikroprocesory

Die o Intel 80486DX2 mikroprocesora (rzeczywisty rozmiar 12 x 6,75 mm) w opakowaniu
Procesor Intel Core i5 na płycie głównej laptopa Vaio z serii E (po prawej, pod rurką cieplną )
Wnętrze laptopa, z wyjętym procesorem z gniazda

Postępy w technologii MOS IC doprowadziły do ​​wynalezienia mikroprocesora na początku lat siedemdziesiątych. Od czasu wprowadzenia pierwszego dostępnego na rynku mikroprocesora Intel 4004 w 1971 r. i pierwszego powszechnie używanego mikroprocesora Intel 8080 w 1974 r. ta klasa procesorów prawie całkowicie wyprzedziła wszystkie inne metody implementacji jednostek centralnych. Ówcześni producenci komputerów mainframe i minikomputerów uruchomili własne programy do rozwoju układów scalonych, aby uaktualnić swoje starsze architektury komputerowe , i ostatecznie wyprodukowali mikroprocesory kompatybilne z zestawami instrukcji, które były kompatybilne wstecz ze starszym sprzętem i oprogramowaniem. W połączeniu z pojawieniem się i ostatecznym sukcesem wszechobecnego komputera osobistego , termin CPU jest obecnie stosowany prawie wyłącznie do mikroprocesorów. Kilka procesorów (oznaczonych jako rdzenie ) można połączyć w jednym chipie przetwarzającym.

Poprzednie generacje procesorów zostały zaimplementowane jako elementy dyskretne i liczne małe układy scalone (IC) na jednej lub kilku płytkach drukowanych. Z drugiej strony mikroprocesory to procesory produkowane na bardzo małej liczbie układów scalonych; zwykle tylko jeden. Całkowity mniejszy rozmiar procesora, wynikający z implementacji na jednej kości, oznacza szybszy czas przełączania ze względu na czynniki fizyczne, takie jak zmniejszona pojemność pasożytnicza bramki . Dzięki temu mikroprocesory synchroniczne mogą mieć częstotliwości taktowania od kilkudziesięciu megaherców do kilku gigaherców. Ponadto możliwość konstruowania niezwykle małych tranzystorów w układzie scalonym wielokrotnie zwiększyła złożoność i liczbę tranzystorów w pojedynczym procesorze. Ten szeroko obserwowany trend jest opisany przez prawo Moore'a , które okazało się dość dokładnym predyktorem wzrostu złożoności CPU (i innych układów scalonych) do 2016 roku.

Podczas gdy złożoność, rozmiar, konstrukcja i ogólna forma procesorów zmieniły się ogromnie od 1950 roku, podstawowa konstrukcja i funkcja nie zmieniły się wcale. Prawie wszystkie współczesne procesory można bardzo dokładnie opisać jako maszyny z programami przechowywanymi von Neumanna. Ponieważ prawo Moore'a już nie obowiązuje, pojawiły się obawy dotyczące ograniczeń technologii tranzystorów z układem scalonym. Ekstremalna miniaturyzacja bramek elektronicznych powoduje, że efekty takich zjawisk jak elektromigracja i upływ podprogowy stają się znacznie bardziej znaczące. Te nowsze obawy są jednym z wielu czynników skłaniających badaczy do badania nowych metod obliczeniowych, takich jak komputer kwantowy , a także do rozszerzenia zastosowania paralelizmu i innych metod, które poszerzają użyteczność klasycznego modelu von Neumanna.

Operacja

Podstawową operacją większości procesorów, niezależnie od ich fizycznej formy, jest wykonanie sekwencji zapisanych instrukcji, która nazywa się programem. Rozkazy do wykonania przechowywane są w pewnego rodzaju pamięci komputera . Prawie wszystkie procesory podążają za pobieraniem, dekodowaniem i wykonywaniem kroków w swojej operacji, które są zbiorczo znane jako cykl instrukcji .

Po wykonaniu instrukcji, cały proces się powtarza, przy czym następny cykl instrukcji zwykle pobiera instrukcję następną w kolejności z powodu zwiększonej wartości licznika programu . Jeśli instrukcja skoku została wykonana, licznik programu zostanie zmodyfikowany tak, aby zawierał adres instrukcji, do której wykonano skok, a wykonywanie programu będzie kontynuowane normalnie. W bardziej złożonych procesorach wiele instrukcji może być pobieranych, dekodowanych i wykonywanych jednocześnie. Ta sekcja opisuje to, co jest ogólnie określane jako „ klasyczny potok RISC ”, który jest dość powszechny wśród prostych procesorów używanych w wielu urządzeniach elektronicznych (często nazywanych mikrokontrolerami). W dużej mierze ignoruje ważną rolę pamięci podręcznej procesora, a zatem etap dostępu potoku.

Niektóre instrukcje manipulują licznikiem programu zamiast bezpośrednio wytwarzać dane wynikowe; takie instrukcje są ogólnie nazywane „skokami” i ułatwiają zachowanie programu, takie jak pętle , warunkowe wykonanie programu (poprzez użycie warunkowego skoku) i istnienie funkcji . W niektórych procesorach niektóre inne instrukcje zmieniają stan bitów w rejestrze „flag” . Flagi te mogą być używane do wpływania na zachowanie programu, ponieważ często wskazują one wynik różnych operacji. Na przykład w takich procesorach instrukcja „porównaj” ocenia dwie wartości i ustawia lub czyści bity w rejestrze flag, aby wskazać, która z nich jest większa lub czy są równe; jedna z tych flag może być następnie użyta przez późniejszą instrukcję skoku do określenia przepływu programu.

Aportować

Pierwszy krok, pobieranie, polega na pobraniu instrukcji (reprezentowanej przez liczbę lub sekwencję liczb) z pamięci programu. Lokalizacja instrukcji (adres) w pamięci programu jest określana przez licznik programu (PC; zwany „wskaźnikiem instrukcji” w mikroprocesorach Intel x86 ), który przechowuje liczbę identyfikującą adres następnej instrukcji do pobrania. Po pobraniu instrukcji, komputer PC jest zwiększany o długość instrukcji, tak aby zawierał adres następnej instrukcji w sekwencji. Często instrukcja do pobrania musi zostać pobrana ze stosunkowo wolnej pamięci, co powoduje zatrzymanie procesora podczas oczekiwania na zwrócenie instrukcji. Ten problem jest w dużej mierze rozwiązany w nowoczesnych procesorach przez pamięci podręczne i architektury potokowe (patrz poniżej).

Rozszyfrować

Instrukcja, którą procesor pobiera z pamięci, określa, co zrobi procesor. W kroku dekodowania, wykonywanym przez binarny obwód dekodera znany jako dekoder instrukcji , instrukcja jest przekształcana na sygnały sterujące innymi częściami procesora.

Sposób interpretacji instrukcji jest określony przez architekturę zestawu instrukcji procesora (ISA). Często jedna grupa bitów (tj. „pole”) w instrukcji, zwana kodem operacji, wskazuje, która operacja ma zostać wykonana, podczas gdy pozostałe pola zwykle dostarczają dodatkowych informacji wymaganych do operacji, takich jak operandy. Te operandy mogą być określone jako wartość stała (nazywana wartością bezpośrednią) lub jako lokalizacja wartości, która może być rejestrem procesora lub adresem pamięci, zgodnie z pewnym trybem adresowania .

W niektórych konstrukcjach procesorów dekoder instrukcji jest zaimplementowany jako przewodowy, niezmienny obwód dekodera binarnego. W innych mikroprogram jest używany do tłumaczenia instrukcji na zestawy sygnałów konfiguracyjnych procesora, które są stosowane sekwencyjnie przez wiele impulsów zegarowych. W niektórych przypadkach pamięć przechowująca mikroprogram jest wielokrotnego zapisu, co umożliwia zmianę sposobu, w jaki procesor dekoduje instrukcje.

Wykonać

Po krokach pobierania i dekodowania wykonywany jest krok wykonywania. W zależności od architektury procesora może to składać się z pojedynczej akcji lub sekwencji akcji. Podczas każdej akcji sygnały sterujące elektrycznie włączają lub wyłączają różne części procesora, dzięki czemu mogą wykonać całość lub część żądanej operacji. Akcja jest następnie zakończona, zazwyczaj w odpowiedzi na impuls zegarowy. Bardzo często wyniki są zapisywane w wewnętrznym rejestrze procesora w celu szybkiego dostępu do kolejnych instrukcji. W innych przypadkach wyniki mogą zostać zapisane do wolniejszej, ale tańszej io większej pojemności pamięci głównej .

Na przykład, jeśli ma być wykonana instrukcja dodawania, rejestry zawierające operandy (liczby do zsumowania) są aktywowane, podobnie jak części jednostki arytmetyczno-logicznej (ALU), które wykonują dodawanie. Kiedy pojawia się impuls zegarowy, operandy przepływają z rejestrów źródłowych do jednostki ALU, a suma pojawia się na jej wyjściu. Przy kolejnych impulsach zegarowych, inne komponenty są włączane (i wyłączane), aby przenieść wyjście (suma operacji) do pamięci (np. rejestru lub pamięci). Jeśli wynikowa suma jest zbyt duża (tzn. jest większa niż rozmiar słowa wyjściowego jednostki ALU), zostanie ustawiona flaga przepełnienia arytmetycznego, wpływając na następną operację.

Struktura i realizacja

Schemat blokowy podstawowego komputera jednoprocesorowego z procesorem. Czarne linie wskazują przepływ danych, podczas gdy czerwone linie wskazują przepływ sterowania; strzałki wskazują kierunki przepływu.

W obwodach procesora wbudowany jest zestaw podstawowych operacji, które może on wykonać, zwany zestawem instrukcji . Takie operacje mogą obejmować na przykład dodawanie lub odejmowanie dwóch liczb, porównywanie dwóch liczb lub przeskakiwanie do innej części programu. Każda instrukcja jest reprezentowana przez unikalną kombinację bitów , znaną jako kod operacyjny języka maszynowego . Podczas przetwarzania instrukcji, CPU dekoduje kod operacyjny (poprzez dekoder binarny ) na sygnały sterujące, które koordynują zachowanie CPU. Kompletna instrukcja języka maszynowego składa się z kodu operacji oraz, w wielu przypadkach, z dodatkowych bitów określających argumenty operacji (na przykład liczby, które mają być zsumowane w przypadku operacji dodawania). Idąc w górę skali złożoności, program w języku maszynowym jest zbiorem instrukcji języka maszynowego wykonywanych przez procesor.

Rzeczywista operacja matematyczna dla każdej instrukcji jest wykonywana przez kombinacyjny obwód logiczny w procesorze jednostki centralnej, znany jako jednostka arytmetyczno-logiczna lub ALU. Ogólnie rzecz biorąc, procesor wykonuje instrukcję, pobierając ją z pamięci, używając swojej jednostki ALU do wykonania operacji, a następnie zapisując wynik w pamięci. Oprócz instrukcji dotyczących matematyki na liczbach całkowitych i operacji logicznych istnieją różne inne instrukcje maszynowe, takie jak ładowanie danych z pamięci i przechowywanie ich z powrotem, operacje rozgałęziania i operacje matematyczne na liczbach zmiennoprzecinkowych wykonywane przez jednostkę zmiennoprzecinkową procesora (FPU ).

Jednostka sterująca

Jednostka sterująca (CU) to element procesora, który kieruje pracą procesora. Mówi pamięci komputera, jednostce arytmetycznej i logicznej oraz urządzeniom wejściowym i wyjściowym, jak reagować na instrukcje wysłane do procesora.

Kieruje pracą innych jednostek, dostarczając sygnały czasowe i sterujące. Większość zasobów komputera jest zarządzana przez CU. Kieruje przepływem danych między procesorem a innymi urządzeniami. John von Neumann włączył jednostkę sterującą jako część architektury von Neumann . W nowoczesnych konstrukcjach komputerowych jednostka sterująca jest zwykle wewnętrzną częścią procesora, a jej ogólna rola i działanie pozostają niezmienione od momentu wprowadzenia.

Jednostka arytmetyczno-logiczna

Symboliczna reprezentacja jednostki ALU oraz jej sygnałów wejściowych i wyjściowych

Jednostka arytmetyczno-logiczna (ALU) to obwód cyfrowy w procesorze, który wykonuje operacje arytmetyczne na liczbach całkowitych i logiki bitowe . Dane wejściowe do jednostki ALU to słowa danych, na których należy operować (nazywane operandami ), informacje o stanie z poprzednich operacji oraz kod z jednostki sterującej wskazujący, którą operację należy wykonać. W zależności od wykonywanej instrukcji, operandy mogą pochodzić z wewnętrznych rejestrów procesora lub pamięci zewnętrznej lub mogą być stałymi generowanymi przez samą jednostkę ALU.

Gdy wszystkie sygnały wejściowe ustabilizują się i rozprzestrzenią w obwodzie ALU, wynik wykonanej operacji pojawia się na wyjściach ALU. Wynik składa się zarówno ze słowa danych, które może być przechowywane w rejestrze lub pamięci, jak i informacji o stanie, które są zwykle przechowywane w specjalnym, wewnętrznym rejestrze procesora, zarezerwowanym do tego celu.

Jednostka generowania adresu

Jednostka generowania adresu ( AGU ), czasami nazywana również jednostką obliczania adresu ( ACU ), jest jednostką wykonawczą wewnątrz procesora, która oblicza adresy używane przez procesor w celu uzyskania dostępu do pamięci głównej . Dzięki temu, że obliczenia adresu są obsługiwane przez oddzielne obwody, które działają równolegle z resztą procesora, liczba cykli procesora wymaganych do wykonywania różnych instrukcji maszynowych może zostać zmniejszona, co poprawia wydajność.

Podczas wykonywania różnych operacji procesory muszą obliczać adresy pamięci wymagane do pobierania danych z pamięci; na przykład pozycje elementów tablicy w pamięci muszą być obliczone, zanim procesor będzie mógł pobrać dane z rzeczywistych lokalizacji pamięci. Te obliczenia generowania adresu obejmują różne operacje arytmetyczne na liczbach całkowitych , takie jak dodawanie, odejmowanie, operacje modulo lub przesunięcia bitowe . Często obliczanie adresu pamięci obejmuje więcej niż jedną instrukcję maszynową ogólnego przeznaczenia, która niekoniecznie dekoduje i wykonuje się szybko. Poprzez włączenie AGU do projektu CPU, wraz z wprowadzeniem wyspecjalizowanych instrukcji, które wykorzystują AGU, różne obliczenia generowania adresów mogą być odciążone od reszty CPU i często mogą być wykonywane szybko w jednym cyklu CPU.

Możliwości AGU zależą od konkretnego procesora i jego architektury . W związku z tym niektóre jednostki AGU implementują i udostępniają więcej operacji obliczania adresu, podczas gdy niektóre zawierają również bardziej zaawansowane wyspecjalizowane instrukcje, które mogą działać jednocześnie na wielu operandach . Co więcej, niektóre architektury procesorów zawierają wiele jednostek AGU, dzięki czemu więcej niż jedna operacja obliczania adresu może być wykonywana jednocześnie, co zapewnia dalszą poprawę wydajności dzięki wykorzystaniu superskalarnej natury zaawansowanych projektów procesorów. Na przykład Intel włącza wiele jednostek AGU do swoich mikroarchitektur Sandy Bridge i Haswell , które zwiększają przepustowość podsystemu pamięci procesora, umożliwiając równoległe wykonywanie wielu instrukcji dostępu do pamięci.

Jednostka zarządzania pamięcią (MMU)

Wiele mikroprocesorów (w smartfonach i komputerach stacjonarnych, laptopach, serwerach) posiada jednostkę zarządzania pamięcią, tłumaczącą adresy logiczne na fizyczne adresy RAM, zapewniając ochronę pamięci i możliwości stronicowania , przydatne w przypadku pamięci wirtualnej . Prostsze procesory, zwłaszcza mikrokontrolery , zwykle nie zawierają MMU.

Pamięć podręczna

Cache procesora jest pamięć podręczna sprzętu wykorzystywane przez jednostkę centralną (CPU) z komputera do zmniejszenia średniego kosztu (czas lub energii) W celu uzyskania danych z pamięci głównej . Pamięć podręczna to mniejsza, szybsza pamięć, bliżej rdzenia procesora , w której przechowywane są kopie danych z często używanych lokalizacji pamięci głównej . Większość procesorów ma różne niezależne pamięci podręczne, w tym pamięci podręczne instrukcji i danych , gdzie pamięć podręczna danych jest zwykle zorganizowana w hierarchię większej liczby poziomów pamięci podręcznej (L1, L2, L3, L4 itp.).

Wszystkie nowoczesne (szybkie) procesory (z kilkoma wyspecjalizowanymi wyjątkami) mają wiele poziomów pamięci podręcznej procesora. Pierwsze procesory korzystające z pamięci podręcznej miały tylko jeden poziom pamięci podręcznej; w przeciwieństwie do późniejszych pamięci podręcznych poziomu 1, nie został podzielony na L1d (dla danych) i L1i (dla instrukcji). Prawie wszystkie obecne procesory z pamięciami podręcznymi mają podzieloną pamięć podręczną L1. Mają także pamięci podręczne L2, a w przypadku większych procesorów również pamięci podręczne L3. Pamięć podręczna L2 zwykle nie jest podzielona i działa jako wspólne repozytorium dla już podzielonej pamięci podręcznej L1. Każdy rdzeń procesora wielordzeniowego ma dedykowaną pamięć podręczną L2 i zwykle nie jest współdzielony między rdzeniami. Pamięć podręczna L3 i pamięci podręczne wyższego poziomu są współdzielone przez rdzenie i nie są dzielone. Pamięć podręczna L4 jest obecnie rzadkością i zwykle znajduje się w dynamicznej pamięci o dostępie swobodnym (DRAM), a nie w statycznej pamięci o dostępie swobodnym (SRAM), na oddzielnej kości lub układzie scalonym. Tak było w przeszłości z L1, podczas gdy większe chipy umożliwiły integrację tego i ogólnie wszystkich poziomów pamięci podręcznej, z możliwym wyjątkiem ostatniego poziomu. Każdy dodatkowy poziom pamięci podręcznej jest zwykle większy i jest inaczej optymalizowany.

Istnieją inne typy pamięci podręcznych (które nie są wliczane do „rozmiaru pamięci podręcznej” najważniejszych wspomnianych powyżej pamięci podręcznych), takie jak bufor translacji (TLB), który jest częścią jednostki zarządzania pamięcią (MMU), którą ma większość procesorów.

Pamięć podręczna ma zwykle rozmiar dwojaki: 2, 8, 16 itd. KiB lub MiB (dla większych rozmiarów innych niż L1), chociaż IBM z13 ma 96 KiB pamięci podręcznej L1 instrukcji.

Częstotliwość zegara

Większość procesorów to obwody synchroniczne , co oznacza, że ​​wykorzystują sygnał zegarowy do wyznaczania tempa ich sekwencyjnych operacji. Sygnał zegarowy jest wytwarzany przez zewnętrzny obwód oscylatora, który co sekundę generuje stałą liczbę impulsów w postaci okresowej fali prostokątnej . Częstotliwość impulsów zegara określa szybkość, z jaką procesor wykonuje instrukcje, a co za tym idzie, im szybszy zegar, tym więcej instrukcji wykonuje procesor w ciągu każdej sekundy.

Aby zapewnić prawidłowe działanie procesora, okres zegara jest dłuższy niż maksymalny czas potrzebny do propagacji (przemieszczenia) wszystkich sygnałów przez procesor. Ustawiając okres zegara na wartość znacznie większą niż opóźnienie propagacji w najgorszym przypadku , możliwe jest zaprojektowanie całego procesora i sposobu, w jaki przenosi dane wokół „krawędzi” narastającego i opadającego sygnału zegara. Ma to zaletę znacznego uproszczenia procesora, zarówno z perspektywy projektowania, jak i liczby komponentów. Jednak ma to również tę wadę, że cały procesor musi czekać na swoje najwolniejsze elementy, mimo że niektóre jego części są znacznie szybsze. To ograniczenie zostało w dużej mierze skompensowane różnymi metodami zwiększania równoległości procesora (patrz poniżej).

Jednak same ulepszenia architektury nie rozwiązują wszystkich wad globalnie synchronicznych procesorów. Na przykład sygnał zegarowy podlega opóźnieniom dowolnego innego sygnału elektrycznego. Wyższe częstotliwości taktowania w coraz bardziej złożonych procesorach utrudniają utrzymanie sygnału zegara w fazie (zsynchronizowanie) w całej jednostce. Doprowadziło to do tego, że wiele nowoczesnych procesorów wymagało dostarczenia wielu identycznych sygnałów zegara, aby uniknąć opóźnień pojedynczego sygnału na tyle, aby spowodować awarię procesora. Innym ważnym problemem związanym z dramatycznym wzrostem częstotliwości taktowania jest ilość ciepła rozpraszanego przez procesor . Ciągle zmieniający się zegar powoduje, że wiele elementów przełącza się niezależnie od tego, czy są one w tym czasie używane. Ogólnie rzecz biorąc, element, który się przełącza, zużywa więcej energii niż element w stanie statycznym. Dlatego wraz ze wzrostem częstotliwości taktowania rośnie zużycie energii, co powoduje, że procesor wymaga większego rozpraszania ciepła w postaci rozwiązań chłodzących procesor .

Jedną z metod radzenia sobie z przełączaniem niepotrzebnych komponentów jest tzw. bramkowanie zegara , które polega na wyłączeniu sygnału zegarowego na niepotrzebne komponenty (skutecznie je wyłączając). Jest to jednak często uważane za trudne do wdrożenia i dlatego nie ma powszechnego zastosowania poza konstrukcjami o bardzo niskim poborze mocy. Jedną z godnych uwagi niedawnych konstrukcji procesora, która wykorzystuje rozbudowane bramkowanie zegara, jest Xenon oparty na IBM PowerPC , używany w konsoli Xbox 360 ; w ten sposób wymagania dotyczące zasilania konsoli Xbox 360 są znacznie zmniejszone.

Procesory bez zegara

Inną metodą rozwiązania niektórych problemów z globalnym sygnałem zegarowym jest całkowite usunięcie sygnału zegarowego. Podczas gdy usunięcie globalnego sygnału zegarowego znacznie komplikuje proces projektowania pod wieloma względami, projekty asynchroniczne (lub bez zegara) mają wyraźne zalety w zakresie zużycia energii i rozpraszania ciepła w porównaniu z podobnymi projektami synchronicznymi. Chociaż jest to dość rzadkie, całe asynchroniczne procesory zostały zbudowane bez użycia globalnego sygnału zegara. Dwa znaczące przykłady to są ARM zgodny AMULET i MIPS R3000 kompatybilne MiniMIPS. {{

Zamiast całkowicie usuwać sygnał zegarowy, niektóre projekty procesorów umożliwiają asynchroniczne działanie pewnych części urządzenia, na przykład użycie asynchronicznych jednostek ALU w połączeniu z superskalarnym potokowaniem w celu osiągnięcia pewnych przyrostów wydajności arytmetycznej. Chociaż nie jest całkowicie jasne, czy projekty całkowicie asynchroniczne mogą działać na porównywalnym lub lepszym poziomie niż ich synchroniczne odpowiedniki, oczywiste jest, że przynajmniej wyróżniają się one prostszymi operacjami matematycznymi. To, w połączeniu z ich doskonałym zużyciem energii i właściwościami rozpraszania ciepła, czyni je bardzo odpowiednimi do komputerów wbudowanych .

Moduł regulatora napięcia

Wiele nowoczesnych procesorów ma zintegrowany z matrycą moduł zarządzania energią, który reguluje napięcie zasilania na żądanie obwodów procesora, umożliwiając zachowanie równowagi między wydajnością a zużyciem energii.

Zakres liczb całkowitych

Każdy procesor reprezentuje wartości liczbowe w określony sposób. Na przykład, pewne wczesne komputery cyfrowe reprezentowane jako liczby znanego przecinku (podstawa 10) systemu liczbowy wartości i inni zastosowali bardziej niezwykłe, takie jak reprezentacje trójskładnikowych (podstawa trzy). Prawie wszystkie nowoczesne procesory przedstawiają liczby w postaci binarnej , przy czym każda cyfra jest reprezentowana przez jakąś dwuwartościową wielkość fizyczną, taką jak „wysokie” lub „niskie” napięcie .

Sześciobitowe słowo zawierające zakodowaną binarnie reprezentację wartości dziesiętnej 40. Większość nowoczesnych procesorów wykorzystuje rozmiary słów, które są potęgą dwójki, na przykład 8, 16, 32 lub 64 bity.

Z reprezentacją numeryczną związana jest wielkość i precyzja liczb całkowitych, które może reprezentować procesor. W przypadku procesora binarnym, to jest mierzona liczbą bitów (cyfr znaczących binarnego zakodowanego liczby całkowitej), że procesor może przetwarzać w jednej operacji, co jest powszechnie nazywane słowo wielkość , liczbie bitów , szerokość ścieżki danych , precyzyjnego całkowita lub rozmiar całkowity . Rozmiar liczby całkowitej procesora określa zakres wartości całkowitych, na których może on bezpośrednio operować. Na przykład 8-bitowy procesor może bezpośrednio manipulować liczbami całkowitymi reprezentowanymi przez osiem bitów, które mają zakres 256 (2 8 ) dyskretnych wartości całkowitych.

Zakres liczb całkowitych może również wpływać na liczbę lokalizacji w pamięci, do których procesor może bezpośrednio zaadresować (adres jest liczbą całkowitą reprezentującą konkretną lokalizację w pamięci). Na przykład, jeśli binarny procesor używa 32 bitów do reprezentowania adresu pamięci, może bezpośrednio zaadresować 2 32 lokalizacje pamięci. Aby obejść to ograniczenie i z różnych innych powodów, niektóre procesory używają mechanizmów (takich jak przełączanie banków ), które umożliwiają adresowanie dodatkowej pamięci.

Procesory z większymi rozmiarami słów wymagają więcej obwodów, a co za tym idzie są fizycznie większe, kosztują więcej i zużywają więcej energii (a zatem generują więcej ciepła). W rezultacie w nowoczesnych aplikacjach powszechnie stosuje się mniejsze 4- lub 8-bitowe mikrokontrolery, mimo że dostępne są procesory o znacznie większych rozmiarach słów (takich jak 16, 32, 64, a nawet 128-bit). Jednak gdy wymagana jest wyższa wydajność, korzyści wynikające z większego rozmiaru słowa (większe zakresy danych i przestrzenie adresowe) mogą przeważać nad wadami. Procesor może mieć wewnętrzne ścieżki danych krótsze niż rozmiar słowa, aby zmniejszyć rozmiar i koszt. Na przykład, mimo że zestaw instrukcji IBM System/360 był zestawem instrukcji 32-bitowych, modele System/360 Model 30 i Model 40 miały 8-bitowe ścieżki danych w arytmetycznej jednostce logicznej, tak że 32-bitowe dodawanie wymagało czterech cykli, po jednym na każde 8 bitów operandów, i chociaż zestaw instrukcji serii Motorola 68000 był zestawem instrukcji 32-bitowych, Motorola 68000 i Motorola 68010 miały 16-bitowe ścieżki danych w arytmetycznej jednostce logicznej, tak że 32-bitowe dodawanie wymagało dwóch cykli.

Aby uzyskać niektóre z zalet zapewnianych zarówno przez mniejszą, jak i większą długość bitów, wiele zestawów instrukcji ma różne szerokości bitów dla danych całkowitych i zmiennoprzecinkowych, dzięki czemu procesory implementujące ten zestaw instrukcji mają różne szerokości bitów dla różnych części urządzenia. Na przykład zestaw instrukcji IBM System/360 był głównie 32-bitowy, ale obsługiwał 64-bitowe wartości zmiennoprzecinkowe, aby zapewnić większą dokładność i zakres liczb zmiennoprzecinkowych. System/360 Model 65 miał 8-bitowy sumator dla dziesiętnej i stałoprzecinkowej arytmetyki binarnej oraz 60-bitowy sumator dla arytmetyki zmiennoprzecinkowej. Wiele późniejszych projektów procesorów używa podobnej mieszanej szerokości bitowej, zwłaszcza gdy procesor jest przeznaczony do użytku ogólnego, gdzie wymagana jest rozsądna równowaga między liczbami całkowitymi i zmiennoprzecinkowymi.

Równoległość

Model subskalarnego procesora, w którym wykonanie trzech instrukcji zajmuje piętnaście cykli zegara

Opis podstawowych operacji procesora przedstawiony w poprzedniej sekcji opisuje najprostszą formę, jaką może przybrać procesor. Ten typ procesora, zwykle określany jako podskalarny , działa i wykonuje jedną instrukcję na jednym lub dwóch elementach danych naraz, czyli mniej niż jedną instrukcję na cykl zegara ( IPC < 1 ).

Proces ten powoduje nieodłączną nieefektywność procesorów podskalarnych. Ponieważ tylko jedna instrukcja jest wykonywana na raz, cały procesor musi czekać na zakończenie tej instrukcji przed przejściem do następnej instrukcji. W rezultacie procesor podskalarny „zawiesza się” na instrukcjach, których wykonanie zajmuje więcej niż jeden cykl zegara. Nawet dodanie drugiej jednostki wykonawczej (patrz poniżej) nie poprawia znacząco wydajności; zamiast zawieszania jednej ścieżki, zawieszone są teraz dwie ścieżki i zwiększa się liczba nieużywanych tranzystorów. Ten projekt, w którym zasoby wykonawcze procesora mogą działać tylko na jednej instrukcji na raz, może osiągnąć tylko wydajność skalarną (jedna instrukcja na cykl zegara, IPC = 1 ). Jednak wydajność jest prawie zawsze podskalarna (mniej niż jedna instrukcja na cykl zegara, IPC < 1 ).

Próby osiągnięcia skalarnej i lepszej wydajności zaowocowały różnymi metodologiami projektowania, które powodują, że procesor zachowuje się mniej liniowo i bardziej równolegle. Odnosząc się do równoległości w procesorach, do klasyfikacji tych technik projektowych używa się dwóch terminów:

Każda metodologia różni się zarówno sposobem ich implementacji, jak i względną efektywnością, jaką zapewniają w zwiększaniu wydajności procesora dla aplikacji.

Równoległość na poziomie instrukcji

Podstawowy, pięciostopniowy potok. W najlepszym przypadku ten potok może utrzymać szybkość wykonywania jednej instrukcji na cykl zegara.

Jedną z najprostszych metod zwiększenia równoległości jest rozpoczęcie pierwszych kroków pobierania i dekodowania instrukcji przed zakończeniem wykonywania poprzedniej instrukcji. Jest to technika znana jako potokowanie instrukcji i jest używana w prawie wszystkich nowoczesnych procesorach ogólnego przeznaczenia. Potokowanie umożliwia jednoczesne wykonanie wielu instrukcji, dzieląc ścieżkę wykonania na odrębne etapy. Oddzielenie to można porównać do linii montażowej, w której instrukcja jest uzupełniana na każdym etapie, aż do wyjścia z potoku wykonawczego i wycofania.

Pipelining wprowadza jednak możliwość sytuacji, w której wynik poprzedniej operacji jest potrzebny do ukończenia kolejnej operacji; stan często określany jako konflikt zależności danych. Dlatego procesory potokowe muszą sprawdzać tego rodzaju warunki i w razie potrzeby opóźniać część potoku. Procesor potokowy może stać się prawie skalarny, hamowany tylko przez zatrzymanie się potoku (instrukcja zużywająca więcej niż jeden cykl zegara na etapie).

Prosty potok superskalarny. Pobierając i wysyłając jednocześnie dwie instrukcje, można wykonać maksymalnie dwie instrukcje na cykl zegara.

Ulepszenia potokowania instrukcji doprowadziły do ​​dalszego skrócenia czasu bezczynności komponentów procesora. Wzory, które są uważane za Superskalarna obejmują długi rurociąg instrukcji oraz wiele identycznych jednostki wykonawcze , takie jak jednostki obciążenie sklepie , jednostek arytmetyczno-logicznych , jednostek zmiennoprzecinkowych oraz jednostek wytwórczych adres . W potoku superskalarnym instrukcje są odczytywane i przekazywane do dyspozytora, który decyduje, czy instrukcje mogą być wykonywane równolegle (równocześnie). Jeśli tak, są one wysyłane do jednostek wykonawczych, co skutkuje ich równoczesnym wykonaniem. Ogólnie rzecz biorąc, liczba instrukcji, które superskalarny procesor wykona w cyklu, zależy od liczby instrukcji, które jest w stanie wysłać jednocześnie do jednostek wykonawczych.

Większość trudności w projektowaniu superskalarnej architektury procesora polega na stworzeniu efektywnego dyspozytora. Dyspozytor musi być w stanie szybko określić, czy instrukcje mogą być wykonywane równolegle, a także rozesłać je w taki sposób, aby jak najwięcej jednostek wykonawczych było zajętych. Wymaga to, aby potok instrukcji był wypełniany tak często, jak to możliwe i wymaga znacznej ilości pamięci podręcznej procesora . Sprawia również, że techniki unikania zagrożeń , takie jak przewidywanie rozgałęzień , wykonywanie spekulacyjne , zmiana nazw rejestrów , wykonywanie poza kolejnością i pamięć transakcyjna mają kluczowe znaczenie dla utrzymania wysokiego poziomu wydajności. Próbując przewidzieć, którą gałąź (lub ścieżkę) przyjmie instrukcja warunkowa, procesor może zminimalizować liczbę przypadków, w których cały potok musi czekać na zakończenie instrukcji warunkowej. Wykonywanie spekulacyjne często zapewnia niewielki wzrost wydajności dzięki wykonywaniu części kodu, które mogą nie być potrzebne po zakończeniu operacji warunkowej. Wykonywanie poza kolejnością nieco zmienia kolejność wykonywania instrukcji, aby zmniejszyć opóźnienia spowodowane zależnościami danych. Również w przypadku pojedynczego strumienia instrukcji, wielu strumieni danych — przypadku, gdy trzeba przetworzyć wiele danych tego samego typu — nowoczesne procesory mogą wyłączyć części potoku tak, że gdy pojedyncza instrukcja jest wykonywana wiele razy, procesor pomija fazy pobierania i dekodowania, a tym samym znacznie zwiększa wydajność w pewnych sytuacjach, zwłaszcza w bardzo monotonnych silnikach programów, takich jak oprogramowanie do tworzenia wideo i przetwarzania zdjęć.

W przypadku, gdy tylko część procesora jest superskalarna, część, która nie jest obciążona, traci wydajność z powodu przestojów w harmonogramie. Intel P5 Pentium miał dwie superskalarne jednostki ALU, które mogły przyjąć jedną instrukcję na cykl zegara, ale jego FPU nie. Zatem P5 jest superskalarem liczb całkowitych, ale nie jest superskalarem zmiennoprzecinkowym. Następca architektury P5 firmy Intel, P6 , dodał możliwości superskalarne do swoich funkcji zmiennoprzecinkowych.

Proste potokowanie i konstrukcja superskalarna zwiększają ILP procesora, umożliwiając mu wykonywanie instrukcji z szybkością przekraczającą jedną instrukcję na cykl zegara. Większość nowoczesnych projektów procesorów jest przynajmniej w pewnym stopniu superskalarna, a prawie wszystkie procesory ogólnego przeznaczenia zaprojektowane w ostatniej dekadzie są superskalarne. W późniejszych latach część nacisku przy projektowaniu komputerów o wysokim ILP została przeniesiona ze sprzętu procesora na jego interfejs programowy lub architekturę zestawu instrukcji (ISA). Strategia bardzo długiego słowa rozkazowego (VLIW) powoduje, że niektóre ILP są implikowane bezpośrednio przez oprogramowanie, zmniejszając pracę procesora nad zwiększeniem ILP, a tym samym zmniejszając złożoność projektu.

Równoległość na poziomie zadania

Inną strategią osiągania wydajności jest równoległe wykonywanie wielu wątków lub procesów . Ten obszar badań jest znany jako przetwarzanie równoległe . W taksonomii Flynna strategia ta jest znana jako wielokrotny strumień instrukcji, wielokrotny strumień danych (MIMD).

Jedną z technologii wykorzystywanych w tym celu było przetwarzanie wieloprocesowe (MP). Początkowy smak tej technologii jest znany jako symetryczne przetwarzanie wieloprocesowe (SMP), w którym niewielka liczba procesorów współdzieli spójny obraz swojego systemu pamięci. W tym schemacie każdy procesor ma dodatkowy sprzęt do utrzymywania stale aktualnego widoku pamięci. Unikając przestarzałych widoków pamięci, procesory mogą współpracować w ramach tego samego programu, a programy mogą migrować z jednego procesora do drugiego. Aby zwiększyć liczbę współpracujących procesorów ponad garstkę, w latach 90. wprowadzono schematy, takie jak niejednolity dostęp do pamięci (NUMA) i protokoły koherencji oparte na katalogach . Systemy SMP są ograniczone do niewielkiej liczby procesorów, podczas gdy systemy NUMA zostały zbudowane z tysiącami procesorów. Początkowo przetwarzanie wieloprocesowe zostało zbudowane przy użyciu wielu dyskretnych procesorów i płyt w celu zaimplementowania połączenia między procesorami. Gdy wszystkie procesory i ich połączenia są zaimplementowane w jednym układzie scalonym, technologia ta jest znana jako wieloprocesorowe przetwarzanie na poziomie układu (CMP), a pojedynczy układ jako procesor wielordzeniowy .

Później uznano, że w jednym programie istnieje równoległość drobniejszych ziaren. Pojedynczy program może mieć kilka wątków (lub funkcji), które mogą być wykonywane oddzielnie lub równolegle. Niektóre z najwcześniejszych przykładów tej technologii zaimplementowały przetwarzanie wejścia/wyjścia, takie jak bezpośredni dostęp do pamięci, jako oddzielny wątek od wątku obliczeniowego. Bardziej ogólne podejście do tej technologii zostało wprowadzone w latach 70., kiedy zaprojektowano systemy do równoległego uruchamiania wielu wątków obliczeniowych. Ta technologia jest znana jako wielowątkowość (MT). Takie podejście jest uważane za bardziej opłacalne niż przetwarzanie wieloprocesorowe, ponieważ tylko niewielka liczba komponentów w procesorze jest replikowana w celu obsługi MT, w przeciwieństwie do całego procesora w przypadku MP. W MT jednostki wykonawcze i system pamięci, w tym pamięci podręczne, są współdzielone przez wiele wątków. Wadą MT jest to, że sprzętowa obsługa wielowątkowości jest bardziej widoczna dla oprogramowania niż w przypadku MP, a zatem oprogramowanie nadzorcze, takie jak systemy operacyjne, musi podlegać większym zmianom w celu obsługi MT. Jeden typ technologii MT, który został zaimplementowany, jest znany jako wielowątkowość czasowa , w której jeden wątek jest wykonywany, dopóki nie zostanie zatrzymany w oczekiwaniu na powrót danych z pamięci zewnętrznej. W tym schemacie procesor szybko przełączałby kontekst na inny wątek, który jest gotowy do uruchomienia, przełączanie często odbywa się w jednym cyklu zegara procesora, na przykład UltraSPARC T1 . Innym rodzajem MT jest symultaniczna wielowątkowość , w której instrukcje z wielu wątków są wykonywane równolegle w ramach jednego cyklu zegara procesora.

Przez kilkadziesiąt lat, od lat 70. do wczesnych lat 2000., koncentrowano się na projektowaniu wysokowydajnych procesorów ogólnego przeznaczenia w dużej mierze na osiąganiu wysokiego ILP dzięki technologiom, takim jak potokowanie, pamięci podręczne, wykonywanie superskalarne, wykonywanie poza kolejnością itp. Tendencja ta zakończyła się dużym , energochłonne procesory, takie jak Intel Pentium 4 . Na początku XXI wieku projektanci procesorów nie mogli osiągnąć wyższej wydajności dzięki technikom ILP z powodu rosnącej dysproporcji między częstotliwościami pracy procesora a częstotliwościami pracy pamięci głównej, a także eskalacją rozpraszania mocy procesora z powodu bardziej ezoterycznych technik ILP.

Projektanci procesorów zapożyczyli następnie pomysły z komercyjnych rynków komputerowych, takich jak przetwarzanie transakcyjne , gdzie łączna wydajność wielu programów, znana również jako przetwarzanie przepustowości , była ważniejsza niż wydajność pojedynczego wątku lub procesu.

O tym odwróceniu nacisku świadczy mnożenie się projektów dwu- i bardziej rdzeniowych procesorów, a zwłaszcza nowszych projektów Intela, przypominających jego mniej superskalarną architekturę P6 . Późne projekty w kilku rodzinach procesorów wykazują CMP, w tym x86-64 Opteron i Athlon 64 X2 , SPARC UltraSPARC T1 , IBM POWER4 i POWER5 , a także kilka procesorów do konsol do gier wideo, takich jak trzyrdzeniowa konstrukcja PowerPC Xbox 360 , oraz 7-rdzeniowy mikroprocesor Cell w PlayStation 3 .

Równoległość danych

Mniej powszechny, ale coraz ważniejszy paradygmat procesorów (i ogólnie informatyki) dotyczy równoległości danych. Wszystkie procesory omówione wcześniej są określane jako pewien rodzaj urządzeń skalarnych. Jak sama nazwa wskazuje, procesory wektorowe przetwarzają wiele fragmentów danych w kontekście jednej instrukcji. Kontrastuje to z procesorami skalarnymi, które przetwarzają jedną porcję danych dla każdej instrukcji. Korzystanie Taksonomia Flynna , te dwa schematy postępowania z danymi są ogólnie określane jako pojedyncza instrukcja strumienia, stwardnienie dane strumienia ( SIMD ) i pojedyncza instrukcja strumienia, pojedynczego danych strumienia ( SISD ), odpowiednio. Wielką użytecznością w tworzeniu procesorów obsługujących wektory danych jest optymalizacja zadań, które zwykle wymagają wykonania tej samej operacji (na przykład sumy lub iloczynu skalarnego ) na dużym zbiorze danych. Niektóre klasyczne przykłady tego typu zadań obejmują aplikacje multimedialne (obrazy, wideo i dźwięk), a także wiele rodzajów zadań naukowych i inżynierskich. Podczas gdy procesor skalarny musi ukończyć cały proces pobierania, dekodowania i wykonywania każdej instrukcji i wartości w zestawie danych, procesor wektorowy może wykonać pojedynczą operację na stosunkowo dużym zestawie danych za pomocą jednej instrukcji. Jest to możliwe tylko wtedy, gdy aplikacja zwykle wymaga wielu kroków, które obejmują jedną operację na dużym zestawie danych.

Większość wczesnych procesorów wektorowych, takich jak Cray-1 , była związana prawie wyłącznie z badaniami naukowymi i aplikacjami kryptograficznymi . Jednakże, ponieważ multimedia w dużej mierze przeniosły się na media cyfrowe, zapotrzebowanie na jakąś formę SIMD w procesorach ogólnego przeznaczenia stało się znaczące. Krótko po tym, jak włączanie jednostek zmiennoprzecinkowych stało się powszechne w procesorach ogólnego przeznaczenia, specyfikacje i implementacje jednostek wykonawczych SIMD zaczęły pojawiać się również dla procesorów ogólnego przeznaczenia. Niektóre z tych wczesnych specyfikacji SIMD – takie jak HP Multimedia Acceleration eXtensions (MAX) i Intel MMX – były tylko liczbami całkowitymi. Okazało się to istotną przeszkodą dla niektórych twórców oprogramowania, ponieważ wiele aplikacji korzystających z SIMD zajmuje się głównie liczbami zmiennoprzecinkowymi . Programiści stopniowo udoskonalali i przerabiali te wczesne projekty na niektóre z popularnych współczesnych specyfikacji SIMD, które zwykle są związane z architekturą jednego zestawu instrukcji (ISA). Niektóre godne uwagi nowoczesne przykłady to Intel Streaming SIMD Extensions (SSE) i AltiVec związany z PowerPC (znany również jako VMX).

Wirtualne procesory

Przetwarzanie w chmurze może obejmować podział działania procesora na wirtualne jednostki centralne ( vCPU ).

Host to wirtualny odpowiednik fizycznej maszyny, na której działa system wirtualny. Gdy kilka fizycznych maszyn działa w tandemie i jest zarządzanych jako całość, zgrupowane zasoby obliczeniowe i pamięciowe tworzą klaster . W niektórych systemach możliwe jest dynamiczne dodawanie i usuwanie z klastra. Zasoby dostępne na poziomie hosta i klastra można podzielić na pule zasobów z drobną szczegółowością .

Wydajność

Wydajność i szybkość procesora w zależności od, między innymi czynnikami, częstotliwość zegara (na ogół podane wielokrotność hercach ) i instrukcji na dobę (IPC), który razem z czynnikami dla instrukcji na sekundę (IPS), że Procesor może działać. Wiele zgłoszonych wartości IPS reprezentuje „szczytowe” szybkości wykonywania sztucznych sekwencji instrukcji z kilkoma gałęziami, podczas gdy realistyczne obciążenia składają się z kombinacji instrukcji i aplikacji, z których wykonanie niektórych trwa dłużej niż innych. Wydajność hierarchii pamięci ma również duży wpływ na wydajność procesora, problem ledwo brany pod uwagę w obliczeniach MIPS. Z powodu tych problemów opracowano różne standaryzowane testy, często nazywane w tym celu „benchmarkami” — takie jak SPECint — w celu zmierzenia rzeczywistej efektywnej wydajności w powszechnie używanych aplikacjach.

Wydajność przetwarzania komputerów zwiększa się dzięki zastosowaniu procesorów wielordzeniowych , które zasadniczo polegają na podłączeniu dwóch lub więcej pojedynczych procesorów ( w tym znaczeniu nazywanych rdzeniami ) w jeden układ scalony. Idealnie, dwurdzeniowy procesor byłby prawie dwa razy mocniejszy niż procesor jednordzeniowy. W praktyce wzrost wydajności jest znacznie mniejszy, tylko około 50%, z powodu niedoskonałych algorytmów oprogramowania i implementacji. Zwiększenie liczby rdzeni w procesorze (tj. dwurdzeniowy, czterordzeniowy itp.) zwiększa obciążenie, które można obsłużyć. Oznacza to, że procesor może teraz obsługiwać wiele zdarzeń asynchronicznych, przerwań itp., które mogą odbić się na procesorze, gdy są przytłoczone. Rdzenie te można traktować jako różne podłogi w zakładzie przetwórczym, przy czym każda podłoga wykonuje inne zadanie. Czasami te rdzenie będą obsługiwać te same zadania, co rdzenie sąsiadujące z nimi, jeśli pojedynczy rdzeń nie wystarczy do obsługi informacji.

Ze względu na specyficzne możliwości nowoczesnych procesorów, takie jak jednoczesne wielowątkowość i uncore , które polegają na współdzieleniu rzeczywistych zasobów procesora przy jednoczesnym dążeniu do zwiększenia wykorzystania, monitorowanie poziomów wydajności i wykorzystania sprzętu stopniowo stawało się coraz bardziej złożonym zadaniem. W odpowiedzi, niektóre procesory wdrażają dodatkową logikę sprzętową, która monitoruje rzeczywiste użycie różnych części procesora i zapewnia różne liczniki dostępne dla oprogramowania; przykładem jest technologia Performance Counter Monitor firmy Intel .

Zobacz też

Uwagi

Bibliografia

Zewnętrzne linki