Central processing unit

Katso myös: Computer architecture and Digital Circuit.

Enteros Rangeedit

suorittimen tapa esittää numeroita on suunnitteluvaihtoehto, joka vaikuttaa laitteen perustavanlaatuisimpiin toimintatapoihin. Osa varhaisista digitaalilaskimista käytti lukujen sisäisenä esittämiseen sähköistä mallia yhteisestä kymmenlukujärjestelmästä (kantakymppi). Joissakin muissa tietokoneissa on käytetty eksoottisempia numerointijärjestelmiä, kuten kolmostietokonetta (base three). Lähes kaikki moderna-suorittimet edustavat lukuja binäärimuodossa, jossa jokaista lukua edustaa tietty kahden arvon fysikaalinen määrä, kuten ”korkea” tai ”matala”jännite.

MOS 6502-mikroprosessori dual in-line-paketissa, erittäin suosittu 8-bittinen muotoilu.

numeerinen esitys liittyy niiden lukujen kokoon ja tarkkuuteen, joita suoritin voi esittää. Binäärisen suorittimen tapauksessa bitti viittaa merkittävään asemaan niissä luvuissa, joiden kanssa suoritin toimii. Bittien lukumäärää (tai numeroasemia tai numeroita), joita suoritin käyttää numeroiden esittämiseen, kutsutaan usein ”sanakooksi”, ”bittileveydeksi”, ”datapolun leveydeksi” tai ”kokonaislukutarkkuudeksi”, kun käsitellään tiukasti kokonaislukuja (erotuksena liukulukuluvuista). Tämä luku vaihtelee arkkitehtuurien välillä ja usein saman suorittimen eri yksiköiden sisällä. Esimerkiksi 8-bittinen suoritin käsittelee joukon numeroita, joita voidaan esittää kahdeksalla binäärinumerolla, joista jokaisella numerolla on kaksi mahdollista arvoa, ja yhdessä 8 bittiä, joissa on 28 tai 256 diskreettiä lukua. Kokonaisluvun koko asettaa laitteistorajan sille kokonaislukujen vaihteluvälille, jota ohjelmisto ajaa ja jota suoritin voi käyttää suoraan.

kokonaislukualue voi vaikuttaa myös niiden muistipaikkojen määrään, joita suoritin voi käsitellä (paikantaa). Jos esimerkiksi binäärinen suoritin käyttää 32 bittiä edustamaan muistiosoitetta ja jokainen muistiosoite edustaa yhtä tavua (8 bittiä), voi suorittimen osoittaman muistin enimmäismäärä olla 232 tavua eli 4 Gt. Tämä on hyvin yksinkertainen näkymä suorittimen osoiteavaruudesta, ja monet moderna-mallit käyttävät paljon monimutkaisempia osoitemenetelmiä, kuten hakulaitteita, etsiäkseen enemmän muistia kuin sen koko valikoima mahdollistaisi tasaisella osoiteavaruudella.

koko lukualueen korkeammat tasot vaativat enemmän rakenteita ylimääräisten numeroiden käsittelemiseksi, ja siten enemmän monimutkaisuutta, kokoa, energiankäyttöä ja yleensä kustannuksia. Siksi ei ole harvinaista nähdä 4-ja 8-bittisiä mikrokontrollereita, joita käytetään moderna-sovelluksissa, vaikka saatavilla on paljon laajempia (16, 32, 64 ja jopa 128-bittisiä) suorittimia. Yksinkertaisemmat mikrokontrollerit ovat yleensä halvempia, käyttävät vähemmän energiaa ja siten haihduttavat vähemmän lämpöä. Kaikki nämä voivat olla tärkeitä suunnittelun näkökohtia elektronisten laitteiden. Kuitenkin huippuluokan sovelluksissa lisäalueen, (useammin lisäosoiteavaruuden), tuottamat hyödyt ovat merkittävämpiä ja vaikuttavat usein suunnitteluvaihtoehtoihin. Saadakseen joitakin etuja, joita sekä pienemmät että suuremmat bittipituudet tarjoavat, monet suorittimet on suunniteltu eri bittileveyksillä eri laiteasemille. Esimerkiksi IBM System / 370 käytti suoritinta, joka oli pääosin 32-bittinen, mutta käytti 128-bittistä tarkkuutta liukulukuyksiköissään helpottaakseen suurempaa tarkkuutta ja liukulukujen kantamaa. Monissa myöhemmissä SUORITINMALLEISSA käytetään samanlaista bittileveysyhdistelmää, varsinkin kun suoritin on suunniteltu yleiskäyttöön, jossa vaaditaan kohtuullinen tasapaino kokonaisluku-ja liukulukukyvyn välillä.

Kellotaajuusedit

pääartikkeli: Kellotaajuus

useimmat suorittimet ja itse asiassa useimmat peräkkäiset logiikkalaitteet ovat luonteeltaan synkronisia. Toisin sanoen ne on suunniteltu ja toimivat synkronointisignaalin perusteella. Tämä kellosignaalina tunnettu signaali on yleensä jaksollisen neliöaallon muodossa. Laskemalla maksimiajan, jolloin sähkösignaalit voivat liikkua suorittimen monien piirien eri haarukoissa, suunnittelijat voivat valita sopivan ajan kellosignaalille.

tämän ajanjakson pitäisi olla pidempi kuin aika, joka kuluu signaalin liikkumiseen tai pahimmassa tapauksessa leviämiseen. Asettamalla kelloajan paljon suurempaan arvoon pahimmassa tapauksessa etenemisviiveen päälle on mahdollista suunnitella koko suoritin ja sen tapa siirtää dataa kellosignaalin nousun ja laskun ”reunoilla”. Tämän etuna on suorittimen merkittävä yksinkertaistaminen sekä suunnittelunäkökulmasta että komponenttimäärän näkökulmasta. Tämän haittana on kuitenkin myös se, että koko suoritin joutuu odottamaan hitaampia elementtejään, vaikka jotkin sen yksiköt ovat paljon nopeampia. Tämä rajoitus on suurelta osin kumottu useilla menetelmillä suorittimen parallelismin lisäämiseksi (KS.alla).

pelkät arkkitehtuuriset parannukset eivät kuitenkaan ratkaise kaikkia maailmanlaajuisesti synkronoitujen suorittimien haittoja. Esimerkiksi kellosignaaliin vaikuttavat muiden sähkösignaalien viiveet. Yhä monimutkaisempien suorittimien korkeammat kellotaajuudet vaikeuttavat kellosignaalin pitämistä vaiheittain (synkronoituna) koko yksikössä. Tämä on johtanut siihen, että monet moderna-suorittimet vaativat useita identtisiä kellosignaaleja, jotta yhtä signaalia ei hidastettaisi tarpeeksi aiheuttaakseen suorittimen toimintahäiriön. Toinen suuri ongelma, kun kellotaajuus kasvaa dramaattisesti, on suorittimen haihduttama lämmön määrä. Kellosignaali muuttuu jatkuvasti, jolloin monet osat vaihtuvat (tilan muutos) riippumatta siitä, käytetäänkö niitä kulloinkin. Yleensä tilaa muuttava komponentti käyttää enemmän energiaa kuin staattisessa tilassa oleva alkuaine. Näin ollen kellotaajuuden kasvaessa myös lämmöntuotto kasvaa, jolloin suoritin vaatii tehokkaampia jäähdytysratkaisuja.

yksi tapa käsitellä tarpeettomien komponenttien vaihtamista on kelloggaaminen, jossa kellosignaali sammutetaan tarpeettomiksi komponenteiksi, jolloin ne poistetaan tehokkaasti käytöstä. Tätä pidetään kuitenkin usein vaikeasti toteutettavana, joten sille ei ole yhteistä käyttöä hyvin pienitehoisten mallien ulkopuolella. Merkittävä myöhäinen SUORITINRAKENNE, jossa käytetään leveää kelloporttia vähentämään videopelikonsolin tehontarvetta, on IBM: n PowerPC: hen perustuva Xbox 360. Toinen tapa käsitellä joitakin maailmanlaajuisen kellosignaalin ongelmia on sen täydellinen poistaminen. Vaikka yleisen signaalin poistaminen kellosta monin tavoin tekee suunnitteluprosessista huomattavasti monimutkaisemman verrattuna vastaaviin synkronisiin malleihin, asynkronisilla (tai ei-kellomalleilla) on huomattavia etuja virrankulutuksessa ja lämmöntuottamisessa. Vaikka ne ovat harvinaisia, kokonaisia suorittimia on rakennettu ilman globaalia kellosignaalia. Kaksi merkittävää esimerkkiä tästä ovat Amulet, joka toteuttaa ARM arkkitehtuuri, ja MiniMIPS, joka tukee MIPS R3000. Sen sijaan, että kellosignaali poistettaisiin kokonaan, jotkin SUORITINMALLIT sallivat tiettyjen laiteyksiköiden olevan asynkronisia, kuten käyttämällä ALU: ta yhdessä superscalar-putkilinjan kanssa saavuttaakseen joitakin voittoja aritmeettisessa suorituskyvyssä. Vaikka ei ole täysin selvää, pystyvätkö täysin asynkroniset mallit suoriutumaan vastaavalla tai paremmalla tasolla kuin synkroniset vastineensa, on selvää, että ne ainakin kunnostautuvat yksinkertaisimmissa matemaattisissa operaatioissa. Tämä yhdistettynä niiden erinomaiseen virrankulutukseen ja lämmöntuotto-ominaisuuksiin tekee niistä hyvin soveltuvia sulautettuihin järjestelmiin.

Parallelismedit

pääartikkeli: Rinnakkaislaskenta
subscalar-suorittimen malli. Huomaa, että kolmen ohjeen viimeistelyyn menee viisitoista sykliä.

edellisessä osassa tarjottu suorittimen perustoiminnon kuvaus kuvaa yksinkertaisinta muotoa, jonka suoritin voi ottaa. Tämän tyyppinen suoritin, jota yleensä kutsutaan alaluokaksi, toimii ja suorittaa yhden käskyn yhdellä tai kahdella datakappaleella kerrallaan.

tämä prosessi johtaa subscale-suorittimien luontaiseen tehottomuuteen. Koska vain yksi ohje suoritetaan kerrallaan, koko suorittimen on odotettava kyseisen ohjeen valmistumista ennen seuraavaan ohjeeseen siirtymistä. Tämän seurauksena subscalar-suoritin ”halvaantuu” ohjeissa, jotka vievät useamman kellosyklin suorituksen loppuun. Edes toisen suoritusyksikön lisääminen (katso alla) ei paranna suorituskykyä merkittävästi. Sen sijaan, että yksi tie jähmettyisi, nyt kaksi tietä halvaantuu ja käyttämättömien transistorien määrä kasvaa. Tämä rakenne, jossa suorittimen suoritusresurssit voivat toimia vain yhdellä käskyllä kerrallaan, voi vain mahdollisesti saavuttaa skalaarin suorituskyvyn (yhden käskyn kellosykliä kohti). Suorituskyky on kuitenkin lähes aina subscale (vähemmän kuin yksi ohje per sykli).

yritykset saavuttaa skalaari ja parempi suorituskyky ovat johtaneet erilaisiin suunnittelumenetelmiin, joiden vuoksi suoritin käyttäytyy vähemmän lineaarisesti ja enemmän rinnakkain. Suorittimissa käytetään yleensä kahta termiä näiden suunnittelutekniikoiden luokittelemiseksi.

  • Instruction level parallelism (ILP) pyrkii nopeuttamaan käskyjen suorittamista suorittimen sisällä eli lisäämään suoritusresurssien käyttöä tabletilla.
  • Kierretason suuntaisuus (TLP), jonka tarkoituksena on lisätä niiden säikeiden määrää (käytännössä yksittäiset ohjelmat), joita suoritin voi suorittaa samanaikaisesti.

jokainen menetelmä eroaa sekä niiden toteutustavasta että niiden tuottamasta suhteellisesta tehokkuudesta suorittimen suorituskyvyn lisäämisessä sovellukselle.

ILP: segmentointi ja Superscalar architectureEdit

Pääartikkelit: segmentointi (elektroniikka) ja Superscalar.
perus viisiportainen putki. Parhaimmillaan tämä putki voi ylläpitää yhden opetuksen valmistumisastetta per sykli.

yksi yksinkertaisimmista yhdensuuntaisuuden lisäämismenetelmistä on aloittaa opetuksen lukemisen ja purkamisen ensimmäiset vaiheet ennen kuin edellinen opetus on päättynyt. Tämä on yksinkertaisin muoto tekniikka tunnetaan instruction pipelining, ja sitä käytetään lähes kaikissa moderna yleiskäyttöinen suorittimet. Jakamalla suorituspolku erillisiin vaiheisiin putki mahdollistaa useamman kuin yhden käskyn suorittamisen kerralla. Tätä erottelua voidaan verrata liukuhihnaan, jossa ohje tehdään joka vaiheessa täydellisemmäksi, kunnes se poistuu suoritusputkesta ja poistuu siitä.

putkisto kuitenkin tuo mukanaan mahdollisuuden tilanteeseen, jossa edellisen operaation tulos on välttämätöntä lopettaa seuraavan operaation loppuun saattamiseksi; tätä ehtoa kutsutaan usein datariippuvuusristiriidaksi. Selviytyäkseen tästä on huolehdittava erityisen huolellisesti tällaisten olosuhteiden tarkistamisesta, ja jos näin tapahtuu, osa opetusputkesta on viivästettävä. Luonnollisesti tämän saavuttaminen edellyttää ylimääräisiä piirejä, putkitettu prosessorit ovat monimutkaisempia kuin subscales, mutta ei paljon. Putkitetusta prosessorista voi tulla lähes täysin skalaari, jota estävät vain äkilliset putkipysäytykset (ohje, joka kestää useamman kuin yhden kellosyklin kerrallaan).

yksinkertainen superscalar segmentointi. Lukemalla ja lähettämällä kaksi ohjetta kerralla voidaan suorittaa enintään kaksi ohjetta per sykli.

opetusputkituksen ideaan nähden tehty parannus johti menetelmän kehittämiseen, joka edelleen lyhentää suorittimen komponenttien joutoaikaa. Superscalareiksi sanottuihin malleihin kuuluu pitkä opetusputki ja useita identtisiä suoritusyksiköitä. Superscalar-putkessa useita ohjeita luetaan ja välitetään lähettäjälle, joka päättää, voidaanko ohjeet suorittaa rinnakkain (samanaikaisesti). Jos näin on, ne lähetetään käytettävissä oleviin suoritusyksiköihin, jolloin useita ohjeita voidaan suorittaa samanaikaisesti. Yleensä mitä enemmän ohjeita superscalar-suoritin pystyy samanaikaisesti lähettämään valmiustilan suoritusyksiköille, sitä enemmän ohjeita suoritetaan tietyssä syklissä.

superscalar-suoritinarkkitehtuurin suunnittelun suurin vaikeus piilee tehokkaan lähettimen luomisessa. Lähettäjän on kyettävä nopeasti ja oikein määrittämään, voidaanko ohjeet suorittaa rinnakkain, sekä lähettämään ne siten, että mahdollisimman moni suoritusyksikkö pysyy käytössä. Tämä edellyttää, että käskyputki täytetään mahdollisimman usein ja lisää superscalar-arkkitehtuureissa tarvetta merkittäville määrille suorittimen välimuistia. Tämä luo myös tekniikoita välttää vaaroja, kuten haarukka ennustaminen, spekulatiivinen toteutus, ja out-of-order toteutus, ratkaiseva säilyttää korkean suorituskyvyn. Yrittämällä ennustaa, minkä haaran (tai polun) ehdollinen ohje vie, suoritin voi minimoida sen, kuinka monta kertaa koko kanavan on odotettava ehdollisen käskyn valmistumista. Usein spekulatiivinen toteutus tarjoaa vaatimattomia suorituskyvyn lisäyksiä suorittamalla osia koodista, jotka eivät välttämättä ole tarpeen ehdollisen operaation päätyttyä. Suoritusjärjestyksen ulkopuolella se jotenkin muuttaa järjestystä, jossa ohjeet suoritetaan, vähentääkseen viiveitä, jotka johtuvat datariippuvuuksista. Myös yksittäisten ohjeiden useita tietoja-moderni prosessorit, jos olet käsitellyt paljon tietoa samantyyppisiä, voit poistaa osia putken niin, että kun suoritat yhden lauseen monta kertaa, CPU ohittaa kaapata ja purkaa vaiheet ja siten parantaa huomattavasti suorituskykyä tietyissä tilanteissa, erityisesti moottoreissa ohjelmien erittäin yksitoikkoinen kuin ohjelmisto luoda video-ja valokuva käsittely.

jos osa suorittimesta on superscalar ja osa ei, se osa, joka ei ole superscalar, kärsii suorituskyvyssä aikapysähdysten vuoksi. Alkuperäisessä Intel Pentiumissa (P5) oli kaksi superscalar-alusta, jotka pystyivät hyväksymään kukin yhden käskyn kellosykliä kohti, mutta sen FPU ei voinut hyväksyä yhtä ohjetta kellosykliä kohti. Näin ollen P5 oli kokonaislukujen osalta superscalar, mutta ei ollut liukulukujen superscalar. Intelin Pentium-arkkitehtuurin seuraaja, P6, lisäsi liukulukutoimintoihin superscalar-ominaisuuksia ja sai näin aikaan merkittävän parannuksen tällaisten ohjeiden suorituskyvyssä.

sekä superscalar-suunnittelu että yksittäinen kotelo lisäävät suorittimen ILP: tä antamalla yhden suorittimen suorittaa käskyn suorituksen suhteessa, joka ylittää yhden käskyn per sykli (IPC). Useimmat moderna-SUORITINMALLIT ovat ainakin jonkin verran superscalar-malleja, ja viime vuosikymmenellä lähes kaikki Yleiskäyttöiset SUORITINMALLIT ovat superscalar-malleja. Viime vuosina osa korkean ILP-tietokonesuunnittelun painottamisesta on siirtynyt CPU-laitteistosta sen ohjelmistorajapintaan eli ISA: han. Erittäin pitkä opetussana strategia eli VLIW aiheuttaa jonkin verran ILP: n epäsuoraa vaikutusta ohjelmistoon, mikä vähentää suorittimen suorittamaa työmäärää antaakseen ILP: lle merkittävän sysäyksen ja vähentääkseen siten suunnittelun monimutkaisuutta.

Kierretason Parallelismedit

toinen strategia suorituskyvyn saavuttamiseksi on ajaa useita ohjelmia tai säikeitä rinnakkain. Tätä tutkimusaluetta kutsutaan rinnakkaislaskennaksi. Flynnin taksonomiassa tämä strategia tunnetaan nimellä multiple multi-data instructions tai MIMD.

yksi tähän tarkoitukseen käytetty tekniikka oli moniprosessointi (MP). Tämän teknologian aloitus tunnetaan nimellä symmetric multiprocessing (SMP), jossa pieni määrä suorittimia jakaa yhtenäisen kuvan muistijärjestelmästään. Tässä järjestelmässä jokaisella suorittimella on lisälaitteita, joilla ylläpidetään jatkuvasti päivitettyä muistinäkymää. Ummehtuneiden muistikäyntien välttämiseksi suorittimet voivat tehdä yhteistyötä samassa ohjelmassa ja ohjelmat voivat siirtyä suorittimesta toiseen. Yhteistyösuoritinten määrän lisäämiseksi muutamaa Suorittinta laajemmalle otettiin vuonna 1990 käyttöön järjestelmät, kuten non-uniform memory Access (NUMA) ja directory-based coherence protocols. SMP-järjestelmät rajoittuvat pieneen määrään suorittimia, kun taas NUMA-järjestelmiä on rakennettu tuhansilla suorittimilla. Aluksi moniprosessointi rakennettiin käyttämällä useita erillisiä suorittimia ja piirilevyjä suorittimien välisen yhteenliittämisen toteuttamiseksi. Kun prosessorit ja niiden yhteenliittäminen on toteutettu yhdellä piisirulla, tekniikkaa kutsutaan monisiruksi.

myöhemmin huomattiin, että kyseessä oli hyvin läheinen rinnastus yhteen ohjelmaan. Yhdellä ohjelmalla voi olla useita säikeitä (tai toimintoja), joita voidaan ajaa erikseen tai rinnakkain. Jotkut varhaiset esimerkit tästä tekniikasta toteutettu tulo / lähtö käsittely, kuten suora muistiyhteys erillisenä säiettä computed säiettä. 1970-luvulla otettiin käyttöön yleisempi lähestymistapa tähän tekniikkaan, kun järjestelmät suunniteltiin pyörittämään useita laskentaketjuja rinnakkain. Tämä tekniikka tunnetaan nimellä multitreading (MT).

tätä lähestymistapaa pidetään kustannustehokkaampana kuin moniprosessointia, sillä vain pieni määrä suorittimen osia monistetaan tukemaan MT: tä verrattuna koko suorittimeen MP: n tapauksessa. MT: ssä suoritusyksiköt ja muistijärjestelmä välimuisteineen jaetaan useiden säikeiden kesken. Mt: n haittapuolena on se, että monilukutuen laitetuki näkyy ohjelmistoille paremmin kuin MP: n, ja siksi valvojien ohjelmistot ja käyttöjärjestelmät joutuvat tekemään suurempia muutoksia MT: n tueksi. Yksi toteutetuista MT – tyypeistä tunnetaan monisäikeisenä lohkona, jossa säiettä ajetaan, kunnes se halvaantuu odottaessaan datan palautumista ulkoisesta muistista. Tässä järjestelmässä suorittimen olisi sitten nopeasti vaihdettava toiseen kierteeseen, joka on valmis toimimaan, kytkin monta kertaa suorittaa suorittimen kellosyklin, kuten UltraSPARC-tekniikka. Toista MT-tyyppiä kutsutaan samanaikaiseksi monilukemiseksi, jossa monilukuohjeet suoritetaan rinnakkain suorittimen kellosyklin sisällä.

tietojen Rinnakkaisuusedit

Pääartikkelit: Vektoriprosessori ja SIMD.

harvinaisempi mutta yhä tärkeämpi CPU-paradigma (ja oikeastaan tietojenkäsittely ylipäätään) käsittelee vektoreita. Edellä mainittuja prosessoreita kutsutaan tietyntyyppisiksi skalaarilaitteiksi. Nimensä mukaisesti vektoriprosessorit käsittelevät useita datakappaleita yhden käskyn yhteydessä, toisin kuin skalaariprosessorit, jotka käsittelevät yhtä datakappaletta jokaista käskyä kohti. Näistä kahdesta tietojenkäsittelyjärjestelmästä käytetään yleensä nimitystä SISD (single instruction, single data) ja SIMD (single instruction, multiple data). Suuri hyöty tietovektoreita käsittelevien suorittimien luomisessa piilee tehtävien optimoinnissa, jotka yleensä vaativat samaa toimintaa, esimerkiksi summan tai skalaarituotteen, joka suoritetaan suurelle datajoukolle. Joitakin klassisia esimerkkejä tämäntyyppisistä tehtävistä ovat multimediasovellukset (kuvat, video ja ääni) sekä monenlaiset tieteelliset ja tekniset tehtävät. Vaikka skalaarisella suorittimella on suoritettava koko datajoukon jokaisen käskyn ja arvon lukemis -, dekoodaus-ja suoritusprosessi, vektoriprosessori voi suorittaa yksinkertaisen operaation verrattain suurelle datajoukolle yhdellä ohjeella. Tietenkin, tämä on mahdollista vain, kun sovellus on taipumus vaatia monia vaiheita, jotka sovelletaan yhden toiminnon suuri joukko tietoja.

useimmat varhaiset vektorisuorittimet, kuten Cray-1, liitettiin lähes yksinomaan tieteelliseen tutkimukseen ja kryptografiaan. Multimedian siirtyessä suurelta osin digitaaliseen mediaan on kuitenkin yleistajuisissa suorittimissa tullut merkittäväksi tarve jonkinlaiselle SIMD: lle. Pian sen jälkeen, kun yleistyi liukulukuyksiköiden sisällyttäminen yleiskäyttöisiin suorittimiin, alkoi ilmestyä myös SIMD-suoritusyksiköiden spesifikaatioita ja toteutuksia yleiskäyttöisille suorittimille. Jotkut näistä varhaisista SIMD-spesifikaatioista, kuten Intelin MMX, olivat vain kokonaislukuja varten. Tämä osoittautui merkittäväksi esteeksi joillekin ohjelmistokehittäjille, sillä monet SIMD: tä hyödyntäneet Sovellukset käsittelivät enimmäkseen liukulukuja. Vähitellen näitä varhaisia malleja hiottiin ja muutettiin osaksi yleisiä moderna SIMD-spesifikaatioita, jotka yleensä liitetään Isa-standardiin. Merkittäviä moderna-esimerkkejä ovat Intelin SSE ja PowerPC-käyttöön liittyvä AltiVec (tunnetaan myös nimellä VMX).

Vastaa

Sähköpostiosoitettasi ei julkaista.