8.12.1999 (alkuperäinen pitkä versio)

Transmetan salaisuus

Johdanto

Viime aikoina lehdistössä on usein puhuttu yhtiöstä nimeltä Transmeta ja siitä, mitä tämä yhtiö oikeastaan tekee. Transmetaa on sanottu Intelin haastajaksi samalla tavoin kuin Linux- käyttöjärjestelmää on sanottu Windowsin ja siis Microsoftin haastajaksi. Transmetan sanotaan tekevän jotain uutta mullistavaa suoritinta tietokoneisiin ja suorittimen huhutaan olevaan nopeampi kuin nopeimmat Intelin valmistamat suorittimet. Transmetan suoritin on kuitenkin ollut suuri salaisuus ja siitä on valtaisan mediamyllytyksen varjossa luvattu suuri paljastus 19. tammikuuta 2000.

Transmetassa kiinnostavat muutamat yhtiön taustavoimiin kuuluvat henkilöt. Yhtiön rahoittajiin kuuluu Microsoftin toinen perustaja Paul Allen. Suomalaisittain ja myös maailmanlaajuisesti viime aikoina enemmän huomiota on kuitenkin saanut Linus Torvalds, joka siirtyi Transmetan palvelukseen heti valmistuttuaan Helsingin yliopistolta tietojenkäsittelytieteen laitokselta noin 3 vuotta sitten.

Linus Torvalds on Linux-käyttöjärjestelmän luoja ja yhä edelleen sen tärkeimpien tekijänoikeuksien haltija. Linux taas on maailmalla ainoa varteenotettava haastaja Microsoft Windowsille. Viime aikoina on väitetty, että haastettuaan ohjelmistopuolella maailman monopoliyrityksen Microsoftin Linus Torvalds on nyt haastamassa vuorostaan maailmalla lähes monopoliasemassa olevaa mikropiirien valmistajaa, Inteliä.

Mitään suurta salaisuutta ei kuitenkaan varsinaisesti ole ollut enää yli vuoteen. Transmetan ensimmäinen uutta suoritinta koskeva patentti hyväksyttiin ja tuli samalla julkiseksi marraskuussa 1998. Patentteja on nyt hyväksytty yhteensä neljä ja ne kuvaavat kaikki samanlaista uuden tyyppistä suoritinta. Tuorein patentti hyväksyttiin tämän vuoden syyskuussa.

Patenteissa on esitetty vähän eri tavalla toteutettu suoritin kuin on tähän asti totuttu näkemään. Sen sijaan, että suoritin varsinaisesti ajaisi sille annettua sovellusta, käynnissä onkin aina toista suoritinta (patenteissa Intelin x86-arkkitehtuuria nodattavaa suoritinta) matkiva emulointiohjelma eli emulaattori.

Itse suoritin on toteutettu RISC-tyyppisellä arkkitehtuurilla, joka on suunniteltu erityisesti emulointia varten. Sekä suoritin että emulaattori on suunniteltu niin yhteensopiviksi, että patenteissa emulaattori mielletään osaksi suoritinta, vaikka se emulaattori onkin toteutettu ohjelmistona. Kokonaisuutta kutsutaan nimellä “morph host emulator”, jonka voisi kääntää lähinnä muuntavaksi emulaattoriksi.

Lopputulos on kuitenkin sama kuin aikaisemminkin: sovellukset ja käyttöjärjestelmä tulevat suoritetuksi täsmälleen samalla tavoin kuin jos ne olisi suoritettu uusimpaan Intelin suorittimeen perustuvalla laitteistolla uusimmassa Windows 2000 -käyttöjärjestelmässä.

Verrattuna aikaisempiin vastaaviin emulointitoteutuksiin, joissa jollakin toisella suorittimella toteutetaan Intel x86 -arkkitehtuurille tarkoitettuja sovelluksia, esitetyssä lähestymistavassa on kuitenkin kaksi merkittävää eroa. Ensinnäkin, Intel x86 -suorittimelle tehtyjä sovelluksia voidaan suorittaa nopeammin kuin uusimmalla perinteisellä tavalla, mutta samalla valmistustekniikalla valmistetulla suorittimella. Toiseksi, itse suorittimen väitetään olevan huomattavasti yksinkertaisempi.

Patenttien mukaan Transmeta on toteuttanut tällä arkkitehtuurilla järjestelmän, joka on huomattavasti nopeampi kuin patenttien hakuaikaan nopein Intelin suoritin (Pentium Pro), mutta jossa suorittimen mikropiiri on huomattavasti (75%) pienempi. Pienempi mikropiiri on halvempi valmistaa ja se kuluttaa myös vähemmän virtaa. Kuitenkin sillä voidaan suorittaa kaikkia samoja sovelluksia ja käyttöjärjestelmiä kuin vertailun kohteena olevalla suorittimella. Mikropiirin valmistuskustannusten arviointi on vaikeata, mutta yleisen nyrkkisäännön mukaan piirin pinta-alan kaksinkertaistuminen lisää piirin valmistuskustannukset 16-kertaisiksi. Toisaalta, suoritinpiirin hinta on yleensä vain pieni osa tietokonelaitteiston lopullisesta hinnasta.

Kaikki tässä artikkelissa olevat tiedot on kerrottu Transmetan patenteissa, jotka on julkaistu myös Internetissä. Patentit on jopa kirjoitettu niin selkeästi havainnollisine esimerkkeineen, että luulisi jokaisen tietokonearkkitehtuureista ja emulaattoreista tietävän pystyvän niitä lukemaan. Riittävä tiedon taso saavutetaan tavallisilla yliopistotasoisilla tietokonearkkitehtuuri- ja simulointikursseilla. Toisaalta, patenttien kuvaama suoritinarkkitehtuuri ei ole aivan yksinkertainen eikä sen kuvaaminen lyhyesti ole helppoa.

Suorittimen hyödyntäminen

Patentit eivät tietenkään kerro kaikkia Transmetan salaisuuksia. On selvää, että Transmetalla ei ole mahdollisuuksia valmistaa itse suoritinta. Intelin kanssa samalla mikropiirien valmistustekniikan tasolla olevia yhtiöitä ei maailmassa ole kovin monta. Uusi suoritin kilpailee nimenomaan Intelin suorittimien kanssa, joten ei ole luultavaa, että Transmeta haluaisi Intelin kumppanikseen.

Uuteen suorittimeen ja emulaattoriin perustuvissa järjestelmissä tarvitaan ilmeisesti myös oma käyttöjärjestelmä sovellusten vaatiman Windowsin lisäksi. Linus Torvaldsin mukanaolon vuoksi ei liene kaukaa haettu idea, että tämä käyttöjärjestelmänä olisi Linux.

Toisaalta on myös mahdollista, että emulaattori mielletään vain suorittimen laajennukseksi, jolloin se voidaan toteuttaa Windows-järjestelmän laajennuksena. Tässä tapauksessa mitään muuta käyttöjärjestelmää ei tarvita, vaan näin laajennettu Windows riittää.

Patentit eivät tietenkään kerro mitään siitä, millaiseen järjestelmään uusi suoritin on suunniteltu. Erilaisissa julkisissa esitelmissä Linus Torvalds on kuitenkin viitannut jonkinlaisiin mobiileihin järjestelmiin, jotka lienevät yhtä hyvä veikkaus kuin joku muukin. Tällaisia liikkuvia laitteita varten uuden arkkitehtuurin suoritin voitaisiin ehkä optimoida enemminkin kuluttamaan vain vähän virtaa sen sijaan että siitä tehtäisiin mahdollisimman nopea. Pienen mikropiirin koon takia esitetty arkkitehtuuri sopisi hyvin pienitehoisiin mutta paljon laskentaa vaativiin kannettaviin laitteisiin. Sellainen voisi olla vaikkapa kuvakännykkä tai povitaskuun mahtuva Internet-ikkuna. On myös mahdollista, että Transmeta jättää suoritinta hyödyntävien kokonaisjärjestelmien kehitystyön muille.

On myös otettava huomioon, että tämä kyseiset patentit on jätetty jo kohta 3 ja puoli vuotta sitten. On otaksuttavaa, että Transmeta on edelleen kehittänyt uusia optimointimenetelmiä ja luultavasti se on myös jättänyt vielä uudempia patentteja, jotka vielä täsmentävät arkkitehtuuria. Uskomme kuitenkin, että perusidea “nopeampi ja halvempi kuin samalla valmistusteknologialla tehdyt muut suorittimet” voi kantaa hyvinkin pitkälle.

Selostamme nyt jatkossa olennaiset osat patenteissa esitetystä suoritinarkkitehtuurista. Emme mitenkään siis lupaa, että Transmetan suoritin on juuri tällainen. Toisaalta, patenttien mukaan tällainen suoritin olisi kilpailukykyinen.

Tavanomaisen suorittimen rakenne

Tietokoneohjelma muodostuu joukosta melko yksinkertaisia konekäskyjä, joita koneen suoritin ymmärtää. Nämä käskyt on etukäteen käännetty ohjelmoijan kirjoittamasta, esimerkiksi C-kielisestä ohjelmasta. Ohjelmaa suoritettaessa konekäskyt sijaitsevat tietokoneen keskusmuistissa, jossa myös kaikkien suorituksessa tarvittavien tietojen on oltava. Monet ohjelmat kuitenkin käyttävät niin suurta tiedon tai konekäskyjen määrää, että ne kaikki eivät mahdu muistiin kerralla. Usein ne käsittelevät myös muistin ulkopuolelle talletettuja tietoja. Jos muistin ulkopuoliseen tietoon viitataan, niin käyttöjärjestelmä puuttuu asiaan ja keskeyttää ohjelman suorituksen kunnes tarvittavat tiedot on saatu noudettua esimerkiksi levyltä muistiin tai siirrettyä muistista levylle. Tiedon hakemisen aikana suorittimella on aikaa toteuttaa miljoonia muita konekäskyjä ja yleensä odotuksen aikana suoritetaankin jotain muuta ohjelmaa tai käyttöjärjestelmän tehtäviä.

Myös muisti on suorittimen näkökulmasta aika hidas. Suoritin pitää itse välituloksiaan omissa rekistereissään, joiden käsittely on nopeaa. Tiedon haku muistista voi kestää esimerkiksi 10 kertaa niin kauan kuin rekisteristä. Toiminnan nopeuttamiseksi viimeksi käytetyistä muistialueista (sisälsivätpä ne sitten konekäskyjä tai tietoja) pidetään kopioita suorittimen osana tai sen välittömässä läheisyydessä olevassa välimuistissa. Välimuisti on selvästi nopeampi kuin keskusmuisti, mutta vähän hitaampi kuin rekisterit. Välimuisteja voi olla useita eri tasoisia ja ne voivat olla konekäskyille ja tiedoille joko yhteisiä tai erillisiä. Nopeuden kannalta on erittäin oleellista, että useimmiten sekä suoritettavien käskyjen että niiden käsittelemien tietoalueiden kopiot löytyvät välimuistista.

Konekäskyissä olevat muistiosoitteet eivät yleensä käy suoraan keskusmuistin osoitteiksi, vaan ne tulee muuttaa sopiviksi ennen kutakin viittausta muistiin. Tämä osoitteenmuunnos tapahtuu periaatteessa käyttäen keskusmuistiin talletettuja taulukoita, mutta käytännössä lähes aina suorittimessa olevalla osoitteenmuunnospuskurilla (TLB, translation lookaside buffer). TLB toimii aika lailla välimuistin tapaan ja useimmiten (esim 99.9% tapauksista) vältetään muunnostietojen haku muistista. Tämä on tärkeätä, koska jokaisessa konekäskyssä näitä osoitteenmuunnoksia tapahtuu ainakin yksi. Tätä osoitteenmuunnosta käytetään useissa suorittimissa myös muihin tehtäviin. Sen yhteyteen on suhteellisen helppo toteuttaa esimerkiksi muistialueiden suojaus.

Nykyaikaisissa suorittimissa toteutetaan useita konekäskyjä samanaikaisesti. Kunkin käskyn toteutus jaetaan erillisiin vaiheisiin. Suoritin itse kostuu useista yhden käskyvaiheen toteutukseen erikoistuneista osista. Tällaisia yhden vaiheen toteuttavia suorittimen osia voi olla useita. Suoritin voi näin toteuttaa samanaikaisesti vaikkapa 10 eri käskyn jotain vaihetta. Kustakin käskystä on kerrallaan tyypillisesti vain yksi vaihe käynnissä. Kokonaisten käskyjenkin järjestys voi muuttua. Käskyjonossa myöhempänä oleva käsky voidaan toteuttaa ennen sen edellä olevia käskyjä, jos nämä joutuvat odottamaan joidenkin muiden käskyjen valmistumista.

Aika ajoin ohjelman suoritus keskeytyy jonkin erikoistilanteen vuoksi. Tällainen tilanne voi olla esimerkiksi nollalla jaosta aiheutuva virhe, tiedonsiirtotarve tai jokin muu käyttöjärjestelmän asiaan puuttumista edellyttävä toiminto. Erikoistilanteessa ohjelman suorituksen on pysähdyttävä heti meneillään olevan konekäskyn päätyttyä, jolloin käyttöjärjestelmä voi käsitellä tilanteen. Tämän jälkeen ohjelman suoritus voi jatkua, ellei kyseessä ollut virhetilanne. Suorittimen pysäyttäminen erikoistilanteen vuoksi jonkin tietyn konekäskyn jälkeen ei ole aivan yksinkertaista, kun otetaan huomioon, että samaan aikaan toteutettavana eri vaiheissa voi olla useita käskyjä. Emulointi

Suorittimen emulointi toisella suorittimella tarkoittaa sitä, että konekielinen ohjelma suoritetaan toisen tyyppisellä suorittimella ja se toimii silti aivan samoin tavoin kuin jos käytettäisiin alkuperäistä suoritinta. Tähän on kaksi eri tapaa: (1) ohjelma joko käännetään alkuperäisen suorittimen konekielestä etukäteen emuloivan suorittimen konekielelle ja suoritetaan tavallisen ohjelman tapaan tai (2) ohjelman alkuperäiselle suorittimelle sopivia konekäskyjä tulkitaan yksi kerrallaan toisessa laitteistossa olevalla emulointiohjelmalla. Molemmissa tavoissa on ongelmansa.

Kummassakin tavassa kaikki alkuperäisen suorittimen osat (esim. rekisterit) täytyy sijoittaa jonnekin emuloivassa suorittimessa. Jotakin voidaan säilyttää emuloivan suorittimen omissa rekistereissä, mutta useimmat osista pitää sijoittaa muistiin. Osaa muistista käytetään näin alkuperäisen laitteiston muistin emulointiin ja (toivon mukaan) osaa rekistereitä alkuperäisen laitteiston rekistereiden emulointiin. Mitä vähemmän muistiin viitataan, sitä nopeammin emulointi sujuu.

Emuloitavan laitteiston rekistereiden emulointi suoraan toisen koneen rekistereiden avulla on usein vaikeata, koska rekistereiden tyypit ja koot voivat olla aivan erilaisia. Lisäksi rekistereitä ei yleensä ole mitenkään liikaa ja ne kaikki tarvitaan jo normaaliin nopeaan suoritukseen. Tavoitteena emuloinnilla onkin usein vain se, että tietylle laitteistolle tehty ohjelma ylipäätänsä voidaan suorittaa toisella laitteistolla.

Tässä patentissa esitellyllä laitteistolla emuloinnin tavoite on paljon haastavampi: pystyä emuloinnilla nopeampaan suoritukseen kuin alkuperäisessä laitteistossa. Ongelman tekee todella haastavaksi se, että kilpailevan laitteiston ymmärretään olevan myös tämän hetken nopein Intelin x86-arkkitehtuurin suoritin, ja myös se, että emuloinnin halutaan toimivan nopeasti kaikilla x86-arkkitehtuurin sovelluksilla ja niiden tarvitsemilla käyttöjärjestelmillä.

Ensimmäisessä lähestymistavassa hyvä puoli on se, että kaikki on valmiiksi etukäteen käännetty konekielelle. Konekielinen ohjelma voi olla optimoitu nopeaa suoritusta varten ja suoritin voi vielä suoritusaikana optimoida käskyjen suoritusta aikaisemmin esitellyillä menetelmillä. Emuloitu suoritus voi sujua hyvinkin nopeasti. Konekielisen ohjelman kääntäminen toisen suorittimen konekielelle ei kuitenkaan ole lainkaan helppoa. Suorittimet ovat usein hyvnkin erilaisia ja todellisesta suorittimesta voi puuttua jokin keskeinen emuloitavan laitteiston osa. Tällainen voi olla vaikkapa muistinsuojauksen käyttämä rekisteri, jonka emulointi voi muodostua aikaavieväksi järjestelmässä, jossa muistinsuojaus on tehty jollain muulla menetelmällä.

Erityinen ongelma tässä lähestymistavassa on se, että itse asiassa aika usein ohjelman suorituksen (siis emuloinnin) aikana tapahtuu erikoistilanteita, jotka pitäisi käsitellä täsmälleen samalla tavalla kuin jos ne tapahtuisivat oikeassa laitteistossa. Tällainen erikoistilanne voi syntyä esimerkiksi käyttöjärjestelmäpalvelun kutsusta tai jonkin laitteen ohjauskomennosta. Konekäskyjen suoritusjärjestys voi kuitenkin nopeuden saavuttamiseksi olla vaihtunut tai jotkut konekäskyistä ovat voineet muuttaa muistin sisältöä liian aikaisin emuloinnin kannalta. Näiden erikoistilanteiden täsmällinen käsittely on ensimmäisen lähestymistavan tehokkaassa toteutuksessa mahdotonta.

Toisessa lähestymistavassa alkuperäistä laitteistoa emuloiva ohjelma (emulaattori) tulkitsee kunkin emuloitavan käskyn kerrallaan ja näin kaikki erikoistapaukset voidaan käsitellä hyvinkin täsmällisesti. Tässä lähestymistavassa on ongelmana hitaus, koska käskyt nimenomaan suoritetaan yksi kerrallaan. Tämä estää tehokkaan optimoinnin.

Emulointi uuden suorittimen avulla

Patenttien mukaisessa arkkitehtuurissa emulointi tapahtuu yhdistelemällä edellä kuvattuja menetelmiä ja käyttäen hyväksi nimenomaan emulointia varten suunniteltua suoritinta (kuva 1). Alkuperäinen x86- ohjelma käännetään kyllä emuloivan koneen konekielelle, mutta sitä ei tehdä ennen emulointia omana vaiheenaan. Sen sijaan tämä käännös tehdään dynaamisesti aina tarvittaessa emuloinnin aikana. Aina kun emuloinnissa edetään vaiheeseen, jossa seuraavaksi emuloitavan olevaa x86-käskyä (tai niiden joukkoa) ei ole vielä käännetty, emulointi pysähtyy ja tarvittavat x86-käskyt käännetään konekielelle. Tässä yhteydessä on mahdollista tehdä huomattavakin määrä optimointia siten, että juuri tuotetut konekieliset käskyt voidaan suorittaa mahdollisimman nopeasti. Itse asiassa eräs patenttien perusideoista on se, että itse suoritin on suhteellisen yksinkertainen (jos nyt tällaista termiä mitenkään voi käyttää mistään nykyaikaisesta suorittimesta). Yksinkertainen suoritin tekee optimoimisen työläämmäksi, mutta lopputuloksen nopeammaksi suorittaa.
o

Optimoinnin ongelma on se, että aikaisemmin mainitut erikoistilanteet vaativat täsmällisiä tilanmuutoksia, mutta optimointi ja käskyjen samanaikainen suoritus toisaalta estävät täsmälliset tilanmuutokset. Tähän ongelmaan on nyt kuitenkin ratkaisu, joka on lainattu tietokantojen tapahtumankäsittelystä. Aika ajoin emuloidun koneen täsmällinen tila otetaan talteen. Tämä voitaisiin tehdä jokaisen emuloidun konekäskyn jälkeen, mutta se hidastaisi suoritusta liikaa. Sen sijaan suoritin olettaa, että erikoistilanteita tapahtuu harvoin ja tallettaa tilan vain silloin tällöin suorittaen muun ajan emuloitavia käskyjä mahdollisimman tehokkaasti. Tilan talletus tehdään sitoutumisella, jossa kesken olevat konekäskyt toteutetaan loppuun ja sekä emuloidun suorittimen että sen sen muistin täsmällinen tila otaan talteen suorittimessa olevien erikoisrekisterien ja erikoiskonekäskyjen avulla. Talletushetkellä emuloitavan laitteiston tila on eheä eli samanlainen kuin se olisi vastaavassa todellisessa laitteistossa.

Kun sitten kuitenkin tuollainen erikoistilanne tapahtuu, niin se käsitellään seuraavasti. Nopeutta varten optimoitu emulointi pysähtyy ja yleensä havaitaan, että emuloidun suorittimen ja sen muistin tarkkaa tilaa ei ole käytettävissä. Mutta tarjolla on jokin vähän aikaa sitten talletettu tila. Emulaattori palauttaa emuloidun suorittimen muisteineen tuohon tilaan myös tietokannoista tutulla peruutusoperaatiolla. Emulaattori kääntää uudelleen konekielelle edellistä sitoutumista seuraavat emuloitavat käskyt. Näin emulointi voi jatkua aiemmin talletetusta ja nyt siis palautetusta tilasta lähtien. Tällä kertaa tavoitteena on kuitenkin täsmällinen erikoistilanteen käsittely eikä suoritusnopeus, joten uuteen käännökseen sisällytetään sitoutumiskäsky jokaisen emuloitavan konekäskyn jälkeen. Emulointi jatkuu nyt hitaasti yksi konekäsky kerrallaan. Erikoistilanteen tapahduttua se voidaan käsitellä täsmälleen samoin tavoin kuin todellisessa laitteistossa. Tilanteen jälkeen suoritus voi jatkua käyttäen alkuperäisiä, nopeutta varten optimoituja konekielisiä käskyjä. Niitä ei suinkaan hylätä erikoistilanteen aikana, vaan ne löytyvät käännöspuskurista.

Alkuaan kunkin optimoidun konekielisen käskysarjan jälkeen joudutaan kääntämään lisää käskyjä. Pikkuhiljaa kuitenkin useimmat suoritettavan ohjelman käskyt on käännetty emuloivan koneen kielelle ja itse emulaattorin ei tarvitse puuttua suoritukseen juuri lainkaan. Erilliset käskysarjat liitetään yhteen muuttamalla käskysarjojen lopussa olevia hyppykäskyjä, jolloin myöskin käskysarjan vaihtuminen seuraavaksi emulointiaikana tapahtuu hyvin nopeasti. Patentissa arvioidaan että emulaattori joutuu kääntämään uusia käskysarjoja keskimäärin kerran miljoonaa emuloitua käskyä kohden.

Käännöspuskurin on oltava riittävän iso, jotta se voi sisältää kaikki valmiit käännökset isonkin sovelluksen ja sen tarvitsemien emuloidun käyttöjärjestelmän palveluista. Toisaalta, jos emulaattori toteutetaan osana käyttöjärjestelmää, niin pääosa käyttöjärjestelmän palveluista voidaan kääntää etukäteen omille muistialueilleen.

Uusi suoritin

Itse suoritin noudattaa RISC (Reduced Instruction Set Computer) suunnitteluperiaatteita ja siinä touteutetaan rinnakkain esimerkiksi 8 konekäskyä. Tätä kutsutaan VLIW (Very Long Instruction Word) arkkitehtuuriksi, koska kerralla suorittimella annettava konekäskysarja on niin pitkä. VLIW- käskyt on jo valmiiksi optimoitu siten, että suoritin voi käskyn saatuaan heti toteuttaa sen tarkistamatta lainkaan, missä vaiheessa muut sillä hetkellä käynnissä olevat käskyt ovat tai mitä ne ovat tekemässä. Patentissa esitetty suoritin ei myöskään muuta näiden VLIW-käskyjen suoritusjärjestystä, toisin kuin monet muut nykyaikaiset suorittimet. Tällä tavoin suorittimesta saadaan huomattavasti yksinkertaisempi kuin kilpailijansa, mutta toisaalta ohjelmien kääntäminen on monimutkaisempaa.

Asiaa voidaan myös tarkastella nykyaikaisen vertaamalla sitä CISC (Complex Instruction Set Computer) suorittimien (esim. kaikki Intelin uudemmat suorittimet) toteutusmenetelmiin. Niissä monimutkaiset konekäskyt pilkotaan suoritttimen sisällä yksinkertaisimmiksi mikrokäskyiksi, jotka ovat hyvin samankaltaisia RISC-arkkitehtuurin konekäskyjen kanssa, ja joita suoritetaan suorittimen sisällä hyvin samalla tavalla kuin RISC-arkkitehtuurin suoritin toteuttaa omia konekäskyjään. CISC- arkkitehtuurissa tuo muunnos konekäskyistä mikrokäskyiksi täytyy tehdä kunkin konekäskyn kohdalla aina alusta pitäen uudelleen, kun taas esitetyssä arkkitehtuurissa käskypuskuri pitää jo kertaalleen käännetyt ja optimoidut käskysarjat muistissa. Käskyjen noutaminen muistista on tosin hitaampaa kuin suorittimen sisäisistä mikrokäskyrekistereistä, mutta toisaalta tehokkaasti toteutettu käskyvälimuisti voi tehdä käskyjen noudon muistista hyvinkin nopeaksi. Patenttien esittämä suoritin voidaan toteuttaa pienempänä kun sen ei tarvitse sisältää piirejä käskyjen pilkkomiseen mikrokäskyiksi eikä suurehkoa mikrokäskyrekisteriä.

Esitetty suoritinarkkitehtuuri on selvästi suunniteltu nimenomaan toimimaan yhteen muuntavan emulaattorin kanssa suorittamaan emuloimalla x86-sovelluksia ja Windows-käyttöjärjestelmän palveluja. Sitä ilmeisesti voisi käyttää myös sellaisenaan suorittamaan suoraan sen konekielelle käännettyjä ohjelmia sen oman käyttöjärjestelmän alla, mutta tämä ei ilmeisestikään ole päätarkoitus. Tällaiseen tarkoitukseen samanlaisen suorittimen voisi suunnitella varmaankin tehokkaammin ilman muuntavan emulaattorin vaatimia laajennuksia. Muuntavaa emulaattoria voisi pitää myös osana käyttöjärjestelmää, koska se yhdessä suorittimen kanssa määrittelee sovelluksille suoritusrajapinnan. Patenttien tekijät kuitenkin mieltävät emulaattorin osaksi suoritinta.

Alkuperäisen arkkitehtuurin konekäskyjä emuloivat käskysarjat talletetaan emulaattorin ylläpitämään käännöspuskuriin, joka sijaitsee muistissa (ks. kuva 2). Käännöspuskurissa pyritään pitämään kaikki koko emuloinnin aikana joskus tuotetut käännökset ja joissakin tapauksissa useita versioita tietyistä emuloitavista käskysarjoista. Niissä tapauksissa, joissa samasta käskysarjasta on tuotettu sekä nopea että tarkka versio, ne molemmat pyritään säilyttämään siltä varalta, että niitä vielä tarvitaan uudelleen.
o

Tavallisesti konekäskyjen tuottaminen ja erityisesti suoritusnopeuden äärimmäinen optimointi on ollut ohjelmointikielten kääntäjien vastuulla. Tämä optimointi vie suurimman osan kääntämiseen kuluvasta ajasta. Esitetyssä järjestelmässä lähes kaikki konekäskyt tuotetaan vasta ohjelman suoritusaikana, usein jopa moneen kertaan, ja silti yhteenlaskettu konekäskyjen tuottamiseen ja niiden suorittamiseen käytetty aika on pienempi kuin kilpailevalla suorittimella pelkkä suoritusaika. Selkeästi siis joko optimoinnin on oltava helpompaa tai sitten suorittimen nopeus kattaa myös optimointiin kuuluvan suoritusaikahävikin.

Suorittimen tuki emuloinnille

Suorittimessa on erityisrekistereitä emuloinnin nopeuttamiseen. Näissä rekistereissä pidetään yllä sekä emuloitavan suorittimen koko nykyhetkistä tilaa että viimeistä tilaa, johon suoritin on sitoutunut. Emuloitavan suorittimen tilaan sisältyvät kaikki näkyvät laiterekisterit sekä kaikki sisäiset ohjausrekisterit. Keskusmuistin muistipuskuri on toteutettu muistiin, johon osoittaa kolme erikoisrekisteriä. Näiden rekistereiden avulla muistipuskuri pystyy erottamaan alustavat muistiin talletukset niistä, johin se on jo sitoutunut. Suorittimen käskykannassa on muutamia erityiskäskyjä emuloinnin nopeuttamista varten. Commit eli sitoutumiskäsky aiheuttaa emuloidun suoritintilan vahvistamisen tallettamalla työrekisterit sitoutetun tilan rekistereihin ja sitouttamalla emuloidun muistitilan muutokset muistipuskuria ohjaavia rekistereitä päivittämällä. Rollback-käsky peruuttaa emuloitavan suorittimen tilan viimeksi sitoutettuun tilaan kopioimalla sitoutetun tilan rekistereiden tiedot työrekistereihin ja hylkäämällä muistipuskurista ne emuloituun muistiin tapahtuneet muistiintalletukset, joihin se ei vielä ole sitoutunut. Patentista ei tosin selviä, onko peruutus toteutettu konekäskynä vai aliohjelmana emulaattorissa. Suurenkin rekisterijoukon sisällön kopiointi toiseen rekisterijoukkoon voi tapahtua hyvin nopeasti yhdellä kellopulssilla, jos se tehdään sitä varten suunnitellun laitteiston avulla.

Suoritin vähentää muistiviitteiden lukumäärää pitämällä usein käytetyistä muuttujista kopioita omissa sisäisissä rekistereissään. Samalle muuttujalle on siis suoritusaikana kaksi eri osoitetta: yksi muistiin ja toinen sisäiseen todelliseen rekisteriin. Tällainen optimointi voisi olla tulos vaikkapa jonkun tietyn aliohjelman optimoinnista, jossa lähes kaikki tuon muuttujan viittaukset voidaan tehdä sisäistä rekisteriä käyttäen. Toisaalta, aivan kaikkia tuohon muuttujan muistiosoitteen kautta tehtyjä viittauksia ei voida paikallistaa etukäteen ja niiden havaitseminen suoritusaikana on ollut mahdotonta. Esitetyssä arkkitehtuurissa on erityisrekistereitä tämän ongelman ratkaisemiseen. Kyseisten rekistereiden piirit aktiivisesti valvovat jokaista muistiviitettä ja ne aiheuttavat erikoistilanteen (poikkeuksen) aina kun tällaiseen kahdessa paikassa sijaitsevaan tietoon viitataan. Useimmiten tapahtuvat nopeasti rekisterin kautta ja harvojen muistiosoitteen kautta tapahtuvien viittausten hidastava vaikutus on pieni.

Osoitteenmuunnospuskuria (TLB) käytetään esitetyssä arkkitehtuurissa kahteen uuteen tehtävään. Kunkin osoitteenmuunnoksen yhteydessä on kaksi uutta suojausbittiä. Bitin A/N avulla voidaan erotella oheislaitteiden muistiosoitteet tavallisista muistiosoitteista. Sen avulla emuloinnissa siirräntää toteuttavat emuloidut konekäskyt saadaan suoritettua täsmällisesti. Bittiä T käytetään valvomaan emuloidussa ohjelmassa itseään muuttavan ohjelman olemassaoloa. Siitä aiheutuneen erikoistilanteen avulla saadaan muuttuneet emuloitavat konekäskyt käännettyä tarvittaessa uudelleen. Yhteenveto

Transmeta on siis suunnitellut uudenlaisen RISC-VLIW suorittimen, jossa suuri osa aikaisempien suorittimien sisäisestä optimoinnista on siirretty suorittimen ulkopuolelle. Tällä tavoin itse suoritin on saatu huomattavasti yksinkertaisemmaksi kuin vastaavat nykyisellä arkkitehtuurilla ja samalla valmistustekniikalla toteutetut suorittimet. Suorittimessa myös mikro-ohjelmamuisti sekä mikro- ohjelmien ohjauslogiikka on siirretty suorittimen ulkopuolelle muistiin, mutta näinhän on tehty jo aikaisemmissakin RISC arkkitehtuureissa. Sovellusohjelmat tulkitaan ohjelmallisesti muuntavassa emulaattorissa, jonka toimintaa avustavat suorittimen uudet rekisterit ja emulointia tukevat konekäskyt.

Tällä suorittimella varustetun laitteiston suoritusteho on vielä epäselvä. Toisaalta laskentaa nopeuttaa yksinkertaisempi suoritin, joka pelkän pienemmän kokonsa vuoksi voidaan toteuttaa halvemmalla tai nopeampana tai vähemmän virtaa kuluttavana kuin kilpailijansa. Toisaalta taas laskentaa hidastaa käskyjen dynaaminen kääntäminen, usein vielä moneen kertaan, sekä se, että suoritettavat ”mikrokäskyt” ovat muistissa eivätkä suorittimen sisäisessä mikro-ohjelmamuistissa. Kokonaissuoritusteho jää nähtäväksi.

On mielenkiintoista, miten Transmeta aikoo uutta suoritinarkkitehturiaan hyödyntää. Vaihtoehdot ovat patenttien lisenssoimisesta mikropiirien valmistajille aina omien tähän suorittimeen perustuvien tuotteiden kehittämiseen.

Kuvat

Kuva 1: Patenttien arkkitehtuurin looginen rakenne
Kuva 2: Patenttien arkkitehtuurin fyysinen rakenne

Viitteet

Edmund J. Kelly Malcolm John Wing, Transmeta Corporation (Santa Clara, CA, USA), Host microprocessor with apparatus for temporarily holding target processor state, United States Patent 5,958,061 (September 29, 1999)

US Patent and Trademark Office, http://www.uspto.gov/patft/

IBM Intellectual Property Network, http://www.patents.ibm.com/
 
 
Teemu Kerola ja Petri Kutvonen
Tietojenkäsittelytieteen laitos
Helsingin yliopisto