ALU på CPU och GPU: Typer, funktioner och hur de fungerar

0 Shares

Den första ALU som släpptes var inte en del av en CPU, utan snarare ett 7400-seriechip med ett TTL-gränssnitt från Texas Instruments, 74181 var den första ALU integrerad på ett enda chip. Den var bara 4-bitars och användes i olika minidatorer under 1960-talet, vilket markerade den första stora övergången inom datoranvändning.

Konstruktionen av de första kompletta CPU:erna under 70-talet och med alla motsvarande element för att exekvera en fullständig instruktionscykel var uppenbarligen tvungen att räkna med integrationen av ALU:erna för att beräkna logik- och aritmetikinstruktionerna inuti chippet.

Typer av ALU

SIMD Escalar

Vi kan dela in ALU:erna i två olika underavdelningar, den första är efter typen av tal som ska beräknas och därför om den drivs med heltal eller med flyttal, där vi i det senare fallet talar om att arbeta med decimaler. Flyttalsoperationer följer en regel som anger hur många bitar av talet som motsvarar heltalsdelen och hur många som motsvarar bråkdelen.

Standarderna i båda fallen anger också om den första siffran markerar tecknet eller inte, till exempel kan ett tal i 8-bitars heltal representera en siffra från 0 till 255 eller från -127 till 127 beroende på vilket format som används.

Den andra kategoriseringen avser hur många data och instruktioner en ALU exekverar samtidigt. Den enklaste formen är den skalära ALU där en operation eller instruktion utförs av operand. Vi har också SIMD eller vektorenheter, som utför samma instruktion med olika operander samtidigt.

Typer av operationer med en ALU

ALU suma binaria

Först och främst måste vi ha en ALU som inte kan fungera av sig själv, så en kontrollenhet kommer att behövas för att indikera vilken instruktion som ska utföras och på vilken data som ska göras. Så i denna förklaring kommer vi att anta att vi har en styrenhet som följer med vår ALU.

En ALU som tillåter alla typer av processorer, vare sig det är en CPU eller en GPU, att utföra matematiska operationer med binära tal. Så det är inget annat än en binär kalkylator, eftersom den är den enklaste typen av ALU, den som gör det möjligt att lägga till två siffror på 1 bit vardera, vilket är en operation som skulle vara följande:

Drift Resultat Åkeri
0 + 0 0 0
0 + 1 1 0
1 + 0 1 0
1 + 1 1 1

Om du tittar på dessa är det här specifikationerna för en logisk grind av OR-typ, men vi hittar ett problem som är att bära när man adderar 1 + 1, eftersom resultatet av att lägga till binär 1 + 1 är 10 och inte 1. Så vi måste ta hänsyn till att 1 i carry som vi bär och därför räcker det inte med en enkel OR-grind, speciellt om vi vill arbeta med mycket högre precision i bitar och därför har en mycket mer komplex ALU i antal bitar.

Binär subtraktion i en ALU

ALU resta binaria

Subtraktion eller subtraktion kan härledas med följande formel:

A – B = A + INTE (B) +1

Tricket här är väldigt enkelt, det bygger på att vi arbetar med binära heltal. Detta fungerar inte med flyttal. Vi kan använda samma mekanism som används för att addera två tal för att utföra subtraktionsoperationen. Allt vi behöver göra är att invertera värdet på den andra som arbetar genom en serie INTE-grindar och lägga till 1 till det slutliga resultatet. Tack vare dem kan vi använda samma hårdvara för att utföra en additionsoperation för att utföra en subtraktion.

Binär multiplikation och division i 2 potenser

ALU multiplicación división desplazamiento

Den enklaste formen av multiplikation i ett binärt system är multiplikation med siffror multiplar av 2, eftersom det är ett binärt system behöver vi bara implementera en mekanism där indata förskjuts flera positioner åt vänster, om vi multiplicerar, eller till vänster . rätt, om vi delar. Antalet tjänster? Det beror på effektindexet för 2 av multiplikatorn, så om vi multiplicerar med 8, vilket är 2 ^ 3, måste vi flytta siffran 3-positioner åt vänster och om den dividerar 3 positioner till höger. Det är av denna anledning som ALU:er också integrerar bitskiftsoperationer, som är grunden för att multiplicera eller dividera med multiplar av 2.

Men om vi pratar om att multiplicera andra typer av tal är det bäst att gå tillbaka till när vi var små i skolan.

Multiplikation med icke-potens av 2 tal

Multiplicación binaria ALU

Under många år var ALU:erna mycket enkla och kunde bara adderas, eftersom de inte hade ALU:er avsedda för multiplikation. Hur presterade de då? Tja, exekvera flera sammanlänkade summor som tog dem många cykler. Som en historisk kuriosa var en av de första inhemska processorerna som hade en multiplikationsenhet Intel 8086.

Anta att vi vill multiplicera 25 x 25, när vi var små gjorde vi följande:

  • Först multiplicerar vi 25 x 5 och skriver ner resultatet, som är 125.
  • För det andra multiplicerar vi 25 x 2, vilket ger oss 50 och vi skriver ner resultatet men flyttar en position åt vänster.
  • Vi adderar båda talen, eftersom vi har det andra talet förskjutet till vänster, blir resultatet av summan inte 175, utan 625, vilket är resultatet av att multiplicera 25 x 25 i decimal.

Tja, i binär är processen densamma, men siffran 25 i detta fall är 11001 och därför ett 5-bitars nummer. Så binärt kommer vi att multiplicera 11001 x 11001 och för detta kommer vi att behöva använda AND-grindar.

  • Först multiplicerar vi 11001 x 1 = 11001
  • För det andra multiplicerar vi 11001 x 0 = 0000, vi skriver resultatet en plats till vänster.
  • För det tredje multiplicerar vi 11001 x 0 = 0000, vi skriver resultatet två platser till vänster.
  • För det fjärde multiplicerar vi 11001 x 1 = 11001, vi skriver resultatet tre platser till vänster
  • För det femte multiplicerar vi 11001 x 1 = 11001, vi skriver resultatet fyra platser till vänster
  • Med hänsyn till positionen för varje operation lägger vi till resultatet, vilket inte borde ge som ett resultat 01001110001

Mer komplexa matematiska operationer

Med det förklarade ovan kan du bygga enheter för att utföra mycket mer komplexa matematiska operationer som divisioner, kvadratrötter, potens, och så vidare. Ju mer komplex operationen kommer att behöva fler transistorer. I själva verket finns det en annan mekanism för varje operation och när kontrollenheten berättar för en ALU vilken typ av operation som ska utföras så säger den att den måste använda den specifika mekanismen för den specifika matematiska operationen.

Eftersom det viktiga är att spara på transistorer, definieras de mest komplexa operationerna som en följd av de enklaste för att återanvända hårdvaran. Detta leder till att de mer komplexa operationerna kräver ett högre antal klockcykler. Även om i vissa konstruktioner implementeras kompletta mekanismer som gör att dessa operationer kan utföras i ett mycket mindre antal cykler och till och med i en enda cykel i många fall, men de är inte vanliga i CPU:er.

Där de används i GPU:er, där vi ser en typ av enhet som kallas Special Function Unit som ansvarar för att utföra vad vi kallar transcendentala operationer som de trigonometriska förhållandena som används i geometri.

Var får ALU data för att fungera?

Registros

Först och främst måste vi komma ihåg att en ALU inte arbetar med data i minnet, utan att i processen att fånga och avkoda de data som den ska arbeta med lagras i ett register som kallas ackumulator, på vilket operationer.

I vissa mer komplexa system används mer än ett register för aritmetiska operationer och i vissa fall även specialregister för vissa instruktioner. Som är dokumenterade för det mesta, men i andra fall, eftersom de bara används i vissa instruktioner, är de vanligtvis inte dokumenterade.

Anledningen till att använda registren är på grund av deras närhet till ALU, om RAM-minnet används så skulle det ta mycket längre tid att utföra en enkel operation. Den andra anledningen är att mycket mer energi skulle förbrukas för att utföra en operation.

Med allt detta förklaras hur en ALU fungerar, åtminstone i grundläggande termer.

0 Shares