Blog: Underlige CPU’er

Computeres regneenheder (CPU’erne) har efterhånden konvergeret mod en model, der kun varieres lidt: Man har 2^n bit per register, typisk 8, 16, 32 eller 64. Man har 2^n registre, hvoraf nogle få kan have specialfunktioner (såsom PC, stakpegepind eller konstant lig med 0). Heltal bruger tokomplement repræsentation og kommatal bruger IEEE-standarden. Men der har gennem tiderne været lavet mange underlige ting, der måske gav mening i sin tid, men som på darwinistisk vis er uddøde i kampen om overlevelse. Her er et par eksempler:

Skæve ordlængder

Tidlige computere havde ikke nødvendigvis ordlængder, der var toerpotenser. Vores hjemlige DASK havde for eksempel 40-bits ord, og GIER 42-bit ord, hvor de to sidste bit dog kun blev brugt til instruktionsindkodning (tal var altid 40 bit). Univac 1100, som var den computer, der blev brugt på DIKU, da jeg startede med at studere, havde 36-bit maskinord. Det havde den fordel, at man kunne dele et register op i to halve, tre tredjedele, fire fjerdedele eller seks sjettedele, som f.eks. blev brugt til at indkode seks Fieldata tegn i et register. Digitale signalprocessorer (DSP’er) har ofte skæve ordlængder, f.eks. 24 bit, så man havde lidt større præcision end 16 bit uden at betale hele prisen for 32 bit. Ofte var der et par ekstra bit i akkumulatoren, så man kunne have mellemresultater, der var lidt større end registrene ellers tillod. http://en.wikipedia.org/wiki/Word_%28computer_architecture%29 har en tabel over ældre maskiners ordlængder, hvoraf man blandt andet kan se, at Saturn V raketternes computer havde 26-bit ord. Hvor moderne computere er byte-addresserede (dvs. at adresser tæller 1 op for hver byte i lageret), ver det almindeligt i de tidlige computere, at der var et helt maskinord per adresse. Men det modsatte har også været forsøgt: Intels første forsøg på erstatning af x86, iAPX432, havde 32-bit maskinord, men havde en adresse for hvert bit i lageret, så man kunne f.eks. hente 32 bit startende fra bit 113 i lageret.

Alternative talindkodninger

Stort set alle moderne computere bruger tokomplement binær repræsentation til heltal. Men det har ikke altid være tilfældet. Den før omtalte UNIVAC 1100 brugte foreksempel etkomplementrepræsentation, hvor et tal negeres ved at vende alle bit. Hvis tallet 3 er indkodet i 8 bit som 00000011, er -3 indkodet som 11111100. Det gør nogle ting enklere, men der er underlige konsekvenser, f.eks. har 0 to forskellige indkodninger: 00000000 og 11111111, hvoraf den sidste ofte blev kaldt -0. Det gjorde også kredsløbende til addition lidt mere besværlige (subtraktion er nem nok, når man har addition: Man vender blot alle bit i den ene operand). Andre maskiner brugte fortegn + magnitude, hvilket stadig ses i kommatalsrepræsentationer, men der var flere muligheder. Det var ikke ualmindeligt, at computere brugte decimaltal: Hvert ciffer blev internt repræsenteret med fire bits (Binary-Coded Decimal), og aritmetik sørgede for at menteoverførsler fungerede som i decimal. Det gjorde man til dels for at understøtte COBOL, hvor taltyper var specificeret som et antal decimale cifre (både før og efter decimalpunktummet). x86 understøtter stadig BCD i hardware, men de fleste andre processorer overlader det til software. Men det kunne være endnu mere underligt: Den russiske Saturn computer brugte ternære tal: Cifre kunne være 0, +1 eller -1. Denne balancerede ternære repræsentation har nogle gode matematiske egenskaber: Negative tal er ikke specialtilfælde, negation er en tritvis (et ternært ciffer kaldet en “trit”) og det er den mest effektive talindkodning af alle, hvis man regner på følgende måde: Vi antager, at et ciffer “fylder” lineært i antallet af forskellige cifre. Da kræver det det log(n)/log(base) cifre, der hver koster base plads at indkode et tal n. Man skal altså minimere base/log(base). For base 2 (binær) er dette tal 2,885, for base 3 (ternær) er det 2,731, for base 4 er det 2,885 (ligesom for base 2), og derefter stiger værdien. Så base 3 er marginalt mindre pladskrævende end base 2. Desværre er elektronikken væsentligt mere kompliceret. I Saturn repræsenterede man f.eks. en trit som to bit, hvor en kombination ikke blev brugt, så i praksis var der ikke vundet noget. Der forskes dog stadig teoretisk med ternær logik for kredsløb, blandt andet i forbindelse med kvantecomputere. Hvem ved: Hvis et element i en fremtidig computer har tre naturlige tilstande i stedet for to, kan ternære tal komme på mode igen.

Stakcomputere

Moderne CPU’er bruger stort set altid registre til mellemresultater og lokale variabler, selv om mange virtuelle maskiner (JVM, CLI, osv) bruger stakke. Men tidligere var det ikke ualmindeligt at lave CPU’er, der eksplicit brugte en stak til mellemresultater. En af de mere kendte er Burroughs B5000 serien, som var bygget til Algol 60 (man brugte en variant af Algol kaldet ESPOL som assemblersprog). Et andet eksempel er den britiske Transputer, der var lavet til at understøtte sproget Occam, der var rettet mod parallelle og samtidige beregninger. Der er også hybride maskiner, f.eks. SPARC, der har en registerstak: 16 af de 32 heltalsregistre er et vindue ind i en større registerstak, der flyttes op eller ned ved funktionskald. Ideen var at mindske prisen for funktionskald ved at undgå, at der skal gemmes og hentes et større antal registre ved hvert kald. Intels mindre succesfulde Itanium brugte en lignede ide. En næsten modsat ide blev brugt i Texas Instruments’ TMS9900 16-bit processor (som blev brugt i hjemmecomputeren TI-99/4): Et WP (workspace pointer) register pegede på 16 16-bit ord i lageret, som blev brugt som registre. Udover WP var kun PC og statusregisteret egentlige on-chip registre, så alle beregninger skete via lageret, o det var almindeligt at organisere en stak i lageret og lade WP rykke op og ned ved funktionskald og retur.

Forbedringer in oversætterteknik har gjort stakmaskinernes fordel i forhold til enkel kodegenerering fra højniveausprog stort set irrelevant, og overhead til at gemme og hente registre ved funktionskald er minimeret dels gennem registerallokering og dels gennem hurtig primærcache. Så stort set ingen moderne CPU’er er egentlige stakmaskiner.

Andre underligheder

En tidlig mikroprocessor, RCA 1802 fra 1974, var ret usædvanlig: Den havde et akkumulatorregister D (16 bit) samt 16 16-bit registre, der kunne bruges som operander sammen med D til aritmetik og lagertilgang. Der var ikke nogen egentlig stakpegepind, ingen subrutinekaldinstruktion og ingen betingede hop, men enhver af de 16 registre kunne sættes til at være PC, så man kunne simulere disse ting med lidt snedighed. Alle instruktioner var 8 bit bestående af 4 bit opcode og 4 bit operandregister. På mange måder kan RCA 1802 siges at være en forløber for RISC-ideen.

Data General’s Nova computer (som Regnecentralen lavede en version af undre navnet RC7000) havde 16-bit registre og adresser. Men det ene bit i adressen havde en speciel funktion: Hvis det var sat, var lagertilgang eller hop indirekte, så man hentede ordet på adressen og brugte det som adresse. Hvis dette ord også havde indirektionsbittet sat (og det var en hopinstruktion), var denne adresse også indirekte, og så fremdeles, så man kunne have vilkårligt lange kæder af indirekte adresser. I de første versioner af computeren, kunne man ikke afbryde denne sekvens, så hvis man forsøgte at tilgå en cyklisk kæde af adresser, kom computeren i en uendelig løkke, som kun kunne afbrydes ved at slukke computeren. Senere modeller tilføjede en tæller, der afbrød kædefølgeriet efter et stykke tid.

Der har været adskillige processorer, der har været specialiseret til et bestemt højniveausprog. Jeg nævnte Burroughs B5000 serien og Algol samt Transputeren og Occam før, men der har også været lavet processorer specielt til sprog som LISP, Java, Forth m.m. De er for det meste blevet overflødige, fordi oversætterteknik har gjort implementering af disse sprog på traditionelle CPU’er lige så effektiv som på de specialiserede processorer.

Der er korte beskrivelser af flere bemærkelsesværdige processorer på Great Microprocessors of the Past and Present. Nogle af dem er underlige på forskellige måder, mens andre “blot” er klassikere.

Alle de ovenstående eksempler har været i kommerciel produktion, men der er utallige mærkelige CPU’er, der aldrig har forladt laboratorierne. Et eksempel på dette er Pendulum processoren, der implementer et reversibelt instruktionssæt: Et bit i processoren bestemmer, om programmet kører forlæns eller baglæns, og dette bit kan vendes i forbindelse med hop.

Posted in computer.

Leave a Reply

Your email address will not be published. Required fields are marked *

You may use these HTML tags and attributes: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>