Milli arhitektuur

**Milli arhitektuur** (inglise keeles *Mill architecture*) on uudne üldotstarbeliste protsessorite arhitektuur, mida arendab Mill Computing, Inc. Mill on vööarvuti (ingl. Belt machine), mis erineb pinu- ja registripõhistest arvutitest. Vööprotsessoris puuduvad üldotstarbelised registrid. Nende asemel on kasutusel nn registrite vöö (ingl. belt). Vöö kasutamine võimaldab suurendada protsessori efektiivsust võrreldes x86 ja PowerPC arhitektuuriga, eemaldades suure hulga energiakulukaid ümbernimetusregistreid. x86 ja PowerPC protsessorites on suur osa kasutatavast elektrienergiast ümbernimetusregistrite jaoks. Milli eesmärk on konkureerida x86 ja ARM protsessoritele, kuigi 2020. aasta alguse seisuga ühtegi Milli protsessorit füüsilisel kujul veel ei eksisteeri.

## Ajalugu
2003. veebruaris alustasid endised Philips Trimedia signaaliprotsessorite arhitektuurimeeskonna liikmed koos Ivan Godardiga Milli arhitektuuri loomist.

2004. jaanuaris panid Milli arhitektuuri loojad oma ühingu nimeks Out-of-the-Box Computing.

2014. märtsis inkorporeeris Out-of-the-Box Computing ennast Mill Computing, Inc. nime all.

## Vöö

Registrite vöö töötab FIFO või üldisemalt konveierlindi põhimõttel. Vööl olevaid andmeid saab lugeda igalt positsioonilt, kuid uusi väärtusi saab kirjutada ainult vöö algusse. Uue väärtuse vööle kirjutamisega liiguvad kõik olemasolevad väärtused ühe koha võrra edasi. Kuna vööl on kindel pikkus siis sellest välja liikunud väärtused kustuvad. Vöö pikkus on 8, 16, 32 registrit olenevalt protsessori implementatsioonist. Vöö on abstraktsioon, mis sarnaneb nihkeregistriga, tegelikkuses riistvaralist nihkeregistrit protsessori ehituses kasutusel ei ole. 

Andmed mida läheb vaja hiljem kui vööpikkus seda lubab, saab kirjutada eraldi vahemällu, mida Milli arhitektuuris kutsutakse märkmikuks (ingl. scratchpad). Igal programmil ja alamprogrammil on enda isiklik vöö ja märkmik. Alamprogrammi sisendväärtused paigutatase tema vööle. Kui alamprogrammi sisendid on liiga suured või neid on kokku rohkem kui vööl pikkust on, siis tuleb neid eraldi mälust lugeda. Alamprogrammi lõpetamisel paigutatakse tagastatavad väärtused väljakutsuva programmi vööle, alamprogrammil endal väljakutsuva programmi vööle ega märkmikule ligipääsu ei ole.

Sama tsükli jooksul saab mitu käsku vöölt väärtusi lugeda. Kui vööle on sama tsükli jooksul vaja kirjutada mitut väärtust, siis need kirjutatakse väljakutsumise järjekorras s.t esimesena käivitatud käsk või alamprogramm paigutab enda tulemuse vööle esimesena. Milli arhitektuur toetab mitme väärtuse tagastamist ühest käsust või alamprogrammist.

## Käsustik ja toru

Mill on laia käsustikuga arhitektuur ning kasutab pikki käsu sõnesid (ingl. very long instruction word), mis on kuni 33 individuaalset käsku pikad, millest iga käsk on kuni 15 bitti pikk. Käske käivitatakse kolmes faasis: lugemine, arvutamine, kirjutamine. Erinevate käskude täitmiseks läheb erinev arv tsükleid, nt. korrutamine võtab 3 tsüklit, liitmine aga 1 tsükli. Teineteisest sõltuvad käsud saavad olla samas torus ning eelneva käsu tulemus on järgneval käsul kohe kasutada, ilma seda väljundisse kirjutamata. Torude tööshoidmiseks on igas torus erinevate tsükliarvudega käsutäitmisüksused. Suure hulga käskude dekodeerimiseks on kasutusel kaks käsu dekoodrit.

Käsud on üldised ning saavad töötada erinevate andmesuurustega, näiteks sama summeerimiskäsk oskab summeerida nii baite kui ka ujukomaarve, või neid siis omavahel summeerida. Kõik käsud peale load käsu on kindla ette teatud ajaga, see võimaldab täiendavat koodi optimeerimist kompilaatori poolt.

Kõigil andmetel on protsessori siseselt olemas metaandmed, neid muutmällu kirjutades kaasa ei panda. Metaandmed võimaldavad hakkama saada tavalisest väiksema hulga käskudega, mis tegeleks nende väärtuste leidmise ja kontrollimisega. Metaandmeteks on skalaarsus, väärtuse suurus baitides, IEEE-754 ujukoma arvu puhul selle staatuslipud ja NaR-bitt (Not a Result). Tavapärases protsessoris salvestataks ujukoma arvu staatuslipud protsessori registritesse, seda võimalust milli puhul ei ole. NaR-bitti tähistab vigaseid andmeid ja seda kasutatakse spekulatiivsete käskude puhul valesti arvutatud väärtuse märgistamiseks. Mill toetab tarkvaralist spekulatiivset käskude käivitust, kuid protsessor seda ise suvalises programmis ei tee. Riistvaralise spekulatiivse käivituse puudumine teeb Milli protsessori immuunseks spectre, meltdown ja teiste sarnaste spekulatiivset käivitust kasutavate turvanõrkuste vastu. 

Käsustik toetab ka *None* väärtust, selleks on väärtus 0, millel on metaandmete NaR-bitt aktiivne. *None* väärtus tähistab olematut väärtust, ning seda store käsk põhimällu ei kirjutata.

## Mälu
Milli protsessoris on eraldi L1-vahemälu käskudele ja andmetele, ning üks jagatud L2-vahemälu. Andmete vahemälu kasutab 9 bitti ühe baidi kohta, lisa bitt on kasutusel baidi valiidsuse jälgimiseks. Vahemälus olevad andmed võivad liikuda madalama taseme vahemällu. Vahemälust lugemisel loetakse vastavalt vajadusele andmeid igalt tasemelt, kui esimese taseme vahemälust loetakse baiti millel on valiidsusbitt mittevaliidne, siis otsitakse seda puuduvat väärtust ka teise taseme vahemälust.

Protsessori virtuaalne aadressiruum on 60-bitine, mille kõrged bitid on reserveeritud protsesside vaheliseks mälu isoleerimiseks. Turvalisuse tagamiseks tagastatakse initsialiseerimata mälust lugedes alati väärtus 0, see eemaldab ka vajaduse eraldi mälu nullida või vanu väärtusi eemaldada.

## Viited