Alimman ykkösbitin etsintä
|
|
- Annika Hyttinen
- 8 vuotta sitten
- Katselukertoja:
Transkriptio
1 Alimman ykkösbitin etsintä Hannu Peltola hpeltola(at)cs.hut.fi Seminaariesitelmä T Algoritmien virittäminen -seminaari Tietotekniikan laitos Teknillinen korkeakoulu Tiivistelmä Algoritmit koostuvat alkeistoimenpiteistä. Algoritmin aikavaativuuden laskeminen menee helposti väärin, jos jonkin yksittäisen alkeistoimenpiteen suoritusajan riippuvuus syötteestä jää huomaamatta tai oletetaan virheellisesti vakioiksi. Toisinaan joidenkin mutkikkaampien alkeistoimenpiteiden implementointi jätetään määrittelemättä tarkasti. Keskeisten alkeistoimenpiteiden tehokkuus on usein ratkaisevaa koko algoritmin käytännön suorituskyvyn kannalta. SVM-merkkijononhakualgoritmin implementoinnin keskeinen ongelma on se, miten paljon hahmon tarkastelukohtaa voidaan siirtää eteenpäin tekstissä. Siinä tarkoituksessa täytyy etsiä bittivektorista alkaen vähemmän merkitsevistä biteistä seuraava mahdollista kohtaa vastaava bitti. Algoritmissa tämä on määritelty funktioksi BSF. Algoritmin analyysissä BSF on oletettu suoritettavaksi vakioaikaisena konekäskynä. Alkuperäisessä muodossa, jossa ei kurkistella merkkejä etukäteen, siirtymän enimmäispituus on hahmon pituus. Mikään nyt käsiteltävistä BSF:n implementoinneista ei hyödynnä tietoa hahmon pituudesta. Haarukointiin perustuvat versiot ovat siksi enemmän tai vähemmän vakioaikaisia. Tässä esityksessä tarkastellaan BSF:n useiden erilaisten toteutusten käytännön suoritusnopeutta erilaisilla testiaineistoilla. Implementointikokeilut painottuvat ehdollisten hyppykäskyjen nopeuttamiseen ja korvaamiseen laskennalla. Esityksessä keskitytään C-kieleen ja rajoitutaan x86-arkkitehtuuriin sekä gcc-kääntäjään. 1 Johdanto Merkkijononhaussa (engl. string matching) etsitään kohdat, joissa annettu hahmo esiintyy tekstissä. Merkitään n merkin mittaista tekstiä T = t 1 t 2 t n ja m merkin mittaista hahmoa P = p 1 p 2 p m. Bittivektori (engl. bitvector) tarkoittaa biteistä koostuvaa muuttujatyyppiä, jota voidaan käsitellä loogisilla operaattoreilla (maskauksia): (inklusiivinen) OR; & AND; (yhden) komplementti; ˆ XOR, ekslusiivinen OR;! negaatio (ei kovin käyttökelpoinen) sivuttaissiirrot: << vasemmalle ja >> oikealle (tyypillisesti täytetään nollilla). Sivuttaissiirroissa käytetään tyypillisesti samaa rajoitusta kuin C-kielessä: siirron pituuden täytyy olla pienempi kuin operandin bittimäärä. 1
2 vertailuoperaattoreilla: ==,! =, >=, >, <= ja < aritmeettisilla operaattoreilla: + ja harvoin myös kahden komplementti 1 : Paras bittivektorin koko on käytetyn laitteiston rekisterin leveys. Toisaalta gcc-kääntäjä on jo pitkään osannut tuottaa 32-bittistä koodia, joka käsittelee 64 bittisiä muuttujia (useammalla operaatiolla). C-kielessä käyttökelpoisin muuttujatyyppi on etumerkittömissä tarkan levyisissä kokonaisluvuissa (engl. Exact-width integer types); erityisesti uint32 t ja uint64 t 2. Kannattaa muistaa, että x86:n SSE-käskykanta puolestaan käsittelee 128 bittisiä rekistereitä. Muutamissa bittirinnakkaisissa merkkijononhakualgoritmeissa tarvitaan alkeistoimenpidettä, jossa bittivektorista haetaan seuraavaa tietyn arvoista bittiä. Terminologiassa tehtävä on vakiintunut ykkösbitin hakemiseksi; nollabittihän löytyy triviaalisti komplementoimalla argumentti. Jos etsintä aloitetaan vähemmän merkitsevistä biteistä, selvitetään lopussa olevien nollien määrä (engl. number of trailing zeros). Päinvastaiseen suuntaan edetessä ratkaistaan edeltävien nollien määrä (engl. number of leading zeros). Bitin haku -ongelma on vanha ja ratkaisuja on useita [6, s. 15, ss ], mutta suuri osa lienee dokumentoimatta ja julkaisematta. Tässä esityksessä keskitytään Shift-Vector Matching (SVM) algoritmissa [5] tarvittavaan alinta bittiä seuraavan nollabitin etsintätapoihin. Käytännössä useimmissa tapauksissa bittivektoria siirretään ensin bitti oikealle ja komplementoidaan sitten, jolloin itseasiassa haetaan alinta ykkösbittiä. 2 Shift-Vector Matching Tavanomaisilla syötteillä Boyer Moore-algoritmi [2] ja sen eri variaatiot ovat erinomaisia. Niiden akilleen kantapäänä ovat toisteiset hahmot ja tekstit. Sillä tavallinen Boyer Moore-pohjainen algoritmi unohtaa hahmon siirron yhteydessä kaiken näkemästään. Tuon tyyppisten algoritmien aikavaativuuden kannalta keskeistä on hahmon siirtäminen useampia positioita kerrallaan. Jokainen tekstistä tutkittu merkki rajoittaa sitä, missä kohdissa hahmo voi esiintyä tekstissä; näin ei käy, jos hahmo koostuu samasta merkistä ja löydettiin tekstistä juuri se. SVM-algoritmin idea on käyttää bittivektoria, johon talletetaan tieto siitä, missä hahmo ei voi esiintyä. Hahmon siirron yhteydessä bittivektoria päivitetään samanmittaisella sivuttaissiirrolla. SVM-algoritmin [5] pseudokoodi on esitetty seuraavassa Algoritmina 1. Kaikkien mahdollisten merkkien joukkoa aakkostoa merkitään Σ:lla. Koska sivuttaissiirroissa vapautuvat bitit täytetään nollilla, on luontevaa käyttää mahdottoman esiintymiskohdan merkkinä arvoa yksi. Silloin päädytään automaattisesti bittivektorin päivittämiseen OR-operaatioilla. Jotta saadaan mahdollisimman paljon positioita bittivektoriin, täytyy tutkittavana olevaa kohdistusta vastaavan bitin olla jommassa kummassa päässä. Algoritmissa 1 tutkittavana oleva kohta on vähiten merkitsevässä bittissä. Valinnan syynä oli se, että rivillä 8 käytettävä maski 1 on helppo ja nopea muodostaa. Jos eri suuntiin toimivien sivuttaissiirtojen suorituskyvyssä on eroa, niin niiden suunnan muuttamista kannattaa harkita. 1 C:ssä erityisesti tyypeille Exact-width integer types on taattu kahden komplementtiesitys 2 Vielä versio ei osaa 64 bittiä laajempia tyyppejä 2
3 Algoritmi 1 SVM(P = p 1 p 2 p m, T = t 1 t 2 t n ) /* Preprocessing */ 1: for all c Σ do C[c] 1 m 2: for j 1 to m do 3: C[p j ] C[p j ] & 1 j 1 01 m j /* Searching */ 4: epos m; S 0 5: while epos n do 6: S S C[tepos] 7: j 1 8: while (S&1) = 0 do 9: if j m then 10: report an occurrence at epos + 1 m 11: goto Over 12: S S (C[tepos j] >> j) 13: j j : Over: 15: last BSF( (S >> 1))+1 16: S S >> last 17: epos epos + last Funktioon BSF tultaessa nykyinen kohdistus on tutkittu ja voidaan siirtyä ainakin yksi positio eteenpäin. Rivillä 15 olevassa kutsussa bittivektoria on siirretty jo eteenpäin. Siitä seuraa, että bittivektorissa on aina ainakin yksi ehdot täyttävä bitti. Näin helpotetaan funktion BSF toimintaa. Samalla taataan, että bittivektorin tarvittava sivuttaissiirto on laillisen mittainen. SVM-algoritmi tyypillisesti tutkii vähemmän tekstin merkkejä ja tekee keskimäärin pidempiä siirtymiä kuin muut merkkijononhakualgoritmit. Kätevä piirre on muiden bittivektoreita käyttävien algoritmien tapaan se, että esimerkiksi isojen ja pienten kirjainten samaistus hoituu helposti alustuksen yhteydessä. Nykyään prosessoreiden ja muistiväylien nopeutuminen on vienyt siihen suuntaan, että hyvin suoraviivaiset algoritmit toimivat nopeimmin. Esimerkiksi esiintymiä tarkastettaessa (rivillä 8) jokaisen tekstistä poimitun merkin jälkeen tapahtuva testaus lienee hidaste; (rivillä 6) kannattaisi samantien lisätä useamman tekstin merkin tiedot summavektoriin S. Myös BSF on suhteellisen raskas toimenpide. SVM-algoritmi on parhaimmillaan, kun etsittävät hahmot ovat melko pitkiä ja sisältävät samoja merkkejä useammassa positiossa. 3 Mahdollisia tehostuskeinoja 3.1 Likely / Unlikely Linuxin kernelissä totuusarvolausekkeissa on käytössä funktiokutsuilta näyttävät likely() ja unlikely(). Ne ovat itseasiassa makromäärittelyjä, jotka vinkkaavat gcc-kääntäjälle kumpi vaihtoehto on todennäköisempi: 3
4 /* from linux/compiler.h */ #define likely(x) builtin_expect(!!(x), 1) #define unlikely(x) builtin_expect(!!(x), 0) Tavoitteena on generoida sikäli optimaalista konekoodia, että todennäköisemmässä vaihtoehdossa ei tehdä yhtään hyppykäskyä, jotka tyhjentäisivät prosessorin liukuhihnan. Yleisesti likely()- ja unlikely()-makroja neuvotaan käyttämään vain, kun toinen vaihtoehdoista on hyvin paljon todennäköisempi. Kääntäjän sisäisen funktion long builtin expect (long exp, long c) semantiikkana on ilmaista, että todennäköisesti exp == c Haarautumisten poistaminen Haarautumisia ehdolliset, epäsuorat ja suorat (JMP) hyppykäskyt sekä aliohjelmakutsut (CALL) ja paluut pyritään ennustamaan prosessoreissa omassa yksikössä. Haarautumisten vähentäminen parantaa suorituskykyä, koska [9, luku ] mahdollisuus ennustaa väärin poistuu haarautumiskohtapuskurissa (branch targer buffer (BTB)) tarvitaan vähemmän alkioita. Ehdolliset hyppykäskyt, joita ei koskaan suoriteta, eivät kuluta BTB:tä Intelin uusissa prosessoreissa hyppykäskyt eivät mielellään saisi olla kolmea sisäistä käskyä (µops) lähempänä toisiaan [9, luku 3.4.1]. AMD Athlon 64 ja Opteron kykenee ennustamaan 16 tavun alueella enintään kolme haarautumista. Haarautuminen, joka ylittää 16 tavun rajan, kirjataan kohdealueelle. Ennustettujen rajoja ylittävien haarautumisten tapauksessa käskyjen valmistelu pysähtyy. Haarautumiset kannattaisi siis järjestää niin, ettei 16 tavun alueen rajaa ylitetä; täytekäskyjen lisääminen väliin ei ole kannattavaa. (Koskee myös 32-bittistä koodia.) [10, ss ] Haarautumisten poistamisessa viisi keskeistä keinoa ovat [9, luku ] järjestetään ohjelmakoodi niin, että peruslohkot kasvavat puretaan (unroll) silmukoita (osittain tai kokonaan) käytetään ehdollisia siirtokäskyjä x86-arkkitehtuurissa cmov (Intelillä Pentium II ja myöhemmät; AMD:llä K7:sta lähtien) lataamalla totuusarvo rekisteriin x86-arkkitehtuurissa setcc ja käyttämällä näin saatua kahta vaihtoehtoista arvoa käytetään SSE ja SSE2 käskyjä, jotka suorittavat muuten ehdollisia operaatiota: ANDPS, ANDPD, ANDNPS, ANDNPD, CMPPS, CMPSS, CMPPD, CMPSD, MINPS, MINSS, MINPD, MINSD, MAXPS, MAXSS, MAXPD, ORPS, ORPD, PAND, PANDN, PCMPEQB, PCMPEQD, PCMPEQW, PCMPGTB, PCMPGTD, PCMPGTW, PMAXSW, PMAXUB, PMAXSW, PMAXUB, PMINSW, PMINUB, POR, PXOR, XORPS ja XORPD. 32- bittisessä koodissa on käytettävissä 3DNow! käskyistä PCMPGTB, PCMPGTD, PCMPGTW, 3 4
5 PFCMPGT, PFCMPGE, PFMIN, PFMAX, PAND, PANDN, POR, PXOR ja PXOR. [10, s. 136] Hyppykäskyjen poistaminen Ohjelmointikielissä totuusarvoja vastaavat numeeriset arvot 0 ja 1. Ne voidaan muuttaa muiksi kokonaislukuarvoiksi monella tavalla; vaikka kertolaskulla ja sitten yhteenlaskulla. Perinteinen temppu C-kielellä on kahden komplementtimuotoa hyödyntävä lauseke (<totuusarvo>)-1)&<arvo> Toinen vastaava on (-(!<totuusarvo>))&<arvo> Numeerisen arvon muuntaminen totuusarvoksi käy esimerkiksi ( Bool),!! ja ==0. Prosessorivalmistajien optimointioppaissa neuvotaan tyypillisesti hyppykäskyjen poistoa vain symbolisella konekielellä [9, s. 3-8] ja [10, ss ]. C-kielisiä haarautumatonta koodia käyttäviä ratkaisuja löytyy yleisesti minimin tai maksimin laskemiseen. Yleensä ne eivät varaudu mitenkään yli- tai/ja alivuotoihin [6, ss ] Ehdolliset siirtokäskyt Ehdolliset siirtokäskyt (engl. conditional move) [6, s. 8, 38] ovat tehokkaita käskyjä: esimerkiksi minimin tai maksimin laskeminen sujuu kahdella käskyllä. Valitettavasti niiden käyttö C-kielestä ei ole kovin luontevaa ja objektikoodin optimaalisuus heikkenee, jos sivuvaikutusten takia joudutaan käyttämään volatile-tarkenninta. Toisaalta kääntäjät voivat halutessaan generoida ehdollisia siirtokäskyjä. 4 BSF variaatioita Seuraavaksi esitellään joukko BSF-funktion implementointeja C-kielellä. Niissä bittivektorit voivat olla joko 32 tai 64 bittisiä; tyyppimäärittelyinä vastaavasti uint32 t ja uint64 t. Bittivektoreiden bittimäärää ohjataan käännösaikaisella vakiolla BITS, jonka voi halutessaan määritellä käännöskomennossa. Summavektorina käytetään muuttujaa sv (pseudokoodissa S). Apubittivektori x on saman kokoinen. Tutkittavan kohdistuksen loppukohtaan tekstissä osoittaa osoitin s (pseudokoodissa epos). Testiajot on suoritettu 2,8 GHz Pentium D (dual core) prosessorilla, jonka molemmilla loogisilla prosessoreilla on 16 KB L1 data välimuistia ja 1024 KB L2 välimuistia. Keskusmuistia on 1 GB. Käyttöjärjestelmänä on Fedora 8. Prosessin vaihto toiselle prosessorille tyhjentää vaihtelevassa määrin välimuisteja. Tämä hidastaa datan noutoa keskusmuistista ja tuo testiajojen ajanmittauksiin vaihtelua. Tässä tarkoituksessa on käytetty Linux in funktiota sched setaffinity, jolla prosessi on kiinnitetty yhteen (loogiseen) prosessoriin. Testattavat ohjelmat on käännetty gcc-kääntäjän versiolla optimointitasolla -O3. Testiajoissa käytettiin aineistona kolmen tyyppistä tekstiä: englantia, DNA jonoa ja satunnaisesti tasanjakautuneesti kahta merkkiä sisältävää binääridataa. Kunkin tekstin koko on vajaa miljoona merkkiä. Etsittävinä hahmojoukkoina käytettiin vastaavantyyppisiä 200 hahmon joukkoja. Hahmojen pituudet ovat 5, 10, 20, 30, 40, 50 ja 60 merkkiä. Tuloksissa on tilan säästämiseksi annettu tulokset neljältä lyhimmältä hahmojoukolta ja DNA:lta lisäksi 50 mittaisilta hahmoilta. 5
6 Yksittäisen BSF-funktion suorituksen kesto on niin pieni, että sen mittaaminen suoraan on lähes mahdotonta. Koska se on SVM-algoritmin suoritettavassa koodissa ainoa muuttuva kohta, on luontevaa mitata koko algoritmin suoritukseen kuluvaa aikaa. Kunkin hahmon haku on toistettu 50 kertaa, jotta ajanmittaukseen saadaan tarkkuutta. 4.1 BSF-0 Intelin IA-32-arkkitehtuurin käskykannassa on konekäskyt bsfw ja bsfl. bsfw tuo ensimmäisen argumentin osoittamassa kohdassa olevan sanan (word = 16 bittiä) vähiten merkitsevässä päässä olevien nollabittien määrän toisena argumenttina annettuun rekisteriin. Jos ensimmäinen argumentti sisältää pelkästään nollia, prosessorin ZF lippu (flag) asetetaan (eli saa arvon 1). bsfl-käskyn operandina on kaksoissana (longword) ja 64-bitin käskykannassa bsfq-käskyn operandina on nelisana (quadword)[8]. BSF-käsky lisättiin käskykantaan 80386:ssa [3, s. 112]. asm on gcc-kääntäjän laajennus, jolla voidaan sisällyttää ohjelmaan symbolisia konekäskyjä niin, että operandit on määritelty C-kielen tavoin. 4 On myös mahdollista käyttää useampia peräkkäisiä symbolisia konekäskyjä. Seuraavassa on bsfl- ja bsfq-käskyille käytetyt esittelyt: #if defined x86_64 static inline unsigned long asm_bsf(bitv x) { #if BITS==64 asm ("bsfq %0, %0" : "=r" (x) : "0" (x)); #else asm ("bsfl %0, %0" : "=r" (x) : "0" (x)); #elif defined i386 static inline unsigned long asm_bsf(unsigned long x) { asm ("bsfl %0, %0" : "=r" (x) : "0" (x)); #else # error wrong kind of instruction set return x; } Alimman nollabitin etsintä käy edellisten määrittelyjen avulla helposti [1]. Seuraavaa koodia mutkistaa tilanne, jossa 64 bittisiä bittivektoreita käsitellään 32-bittisellä käskykannalla: x = (sv >>= 1); /* where is lowest zero bit in sv */ /* */ /* if bitvectors have 64 bits, but registers only 32 */ #if BITS==64 && defined i386 j = asm_bsf(x); if((j==0) && ((x&0xffffffff)==0)) { 4 6
7 #else } j = asm_bsf(x); sv >>= j; s += j+1; j = 32 + asm_bsf(x>>32); Taulukko 1: Hakuajat BSF-0:lla millisekunteina eri käskykannoilla (KK) ja bittivektoreilla (BV). hahmot Englannin kieli DNA binääri KK / BV / / / / SVM-algoritmin tapauksessa suorituskykyero 64- ja 32-bittisen käskykannan välillä näyttää olevan mitätön ja jopa vähän ristiriitainen: binääridatalla 64-bittinen näyttää olevan nopeampi, mutta muilla aineistoilla hitaampi. Bittivektorin koolla on huomattava merkitys. 64 bittisillä vektoreilla aikaa kuluu jopa yli 20% enemmän kuin 32 bittisillä. Suhteellinen ero ei näytä riippuvan hahmojen pituudesta; ei myöskään tutkittujen merkkien lukumäärästä. Tilanteeseen vaikuttaa mahdollisesti se, että 32 bittisen operandin etumerkin laajennus (sign extension) 64 bittiin on nopeampaa kuin yläosa nollaus (zero extension) [9, luku 9.2.4]. 32-bittisellä koodilla ja 64 bittisillä bittivektoreilla tehty testi osoittaa, että 64-bittisellä koodilla voisi käsitellä 128 bittisiä bittivektoreita vielä siedettävän nopeasti ja hakea hahmoja, joiden pituus on enintään 128 merkkiä. 4.2 BSF-1 Kaikkein yksinkertaisin ratkaisu on siirtää summavektoria yhdellä bitillä oikealle, ja lopettaa, kun nollabitti löytyy: do { /* NOT EFFICIENT, BUT WORKS */ sv >>= 1; s += 1; } while(sv&1); Menetelmän hyviä puolia ovat ne, ettei tarvita mitään valmisteluita eikä lopuksi päivityksiä. Nopeuskin on hyvä, jos nollabitti löytyy pian; näin käy ainakin, kun hahmo on melko lyhyt. Navarro ja Raffinot ovat käyttäneet tätä tekniikkaa implementoidessaan BM BNDM:ää ja TurboBNDM:ää [4]. Vastaava on myös Warrenin kirjassa [6, s. 86] koodina
8 Kannattaa huomata, että kaikki rivit while-silmukassa suoritetaan jokaisella mahdollisella kohdistuksella; siis vähintään n m + 1 kertaa. Tämä saattaa vaikuttaa koko SVM-algoritmin aikavaativuuteen. while-lauseesta generoitavan ehdollisen hyppykäskyn valinta voi vaikuttaa huomattavasti suoritusnopeuteen. Lopetusehdon testauksessa on hyvin luonteva paikka kokeilla likely- ja unlikely-makroja. Koska kyseessä lienee kohdekoneen arkkitehtuurista riippuva tilanne, kokeiltiin käännöksessä vaihtoehtona vipuja -march=nocona -mno-sse3. Testiajon tulokset ovat taulukossa 2. Taulukko 2: Hakuajat BSF-1:lla millisekunteina likely- (L) ja unlikely-makroilla (U). hahmot Englannin kieli DNA binääri versio ei kohdekoneen valintaa BSF BSF-1L BSF-1U kohdekoneen valintana -march=nocona -mno-sse3 BSF BSF-1L BSF-1U Keskim. siirtymä 4,56 7,99 14,10 19,93 3,69 6,33 10,85 15,03 22,52 2,97 5,01 8,68 11,96 Suurin testissä havaittu ero ilmeni BSF-1:llä: kohdekoneen määrittely tuotti selvästi hitaampaa koodia muilla kuin vähintään 30 mittaisilla ja sitä pidemmillä hahmoilla. Toisaalta niillä BSF-1 ei ole muutenkaan kilpailukykyinen. Likely-makroa käyttävästä BSF-1L:stä generoitui nopeampaa koodiaa määrittelemällä kohdekone (paitsi 5 mittaisilla hahmoilla). Unlikely-makrolla varustetulla BSF-1U:lla kävi päinvastoin paitsi yli 30 mittaisilla DNA jonoilla. Perusversioon BSF-1 verrattuna likely- ja unlikely-makroilla näyttää olevan selvää merkitystä vain kun kohdekone valitaan; silloinkin niiden kahden ero on aika pieni. Intel neuvoo, että usein suoritettavissa silmukoissa tulisi olla enintään 16 iteraatiota kullakin suorituskerralla [9, s. 3-7]. Toisaalla todetaan, että Pentium M prosessoreilla ei kannata purkaa silmukoita, joissa on iteraatioita yli 64 [9, s. 3-15]. Englannin kielellä 16 iteraation raja ylittyy melko usein jo 20 merkin mittaisia hahmoilla. DNA:lla 30 mittaisilla hahmojonoilla 16 iteraatiota ylittyy likimain joka toinen kerta. Kun verrataan BSF-1:n (taulukossa 2 ilman kohdekoneen valintaa) BSF-0:n hakuaikoihin (taulukossa 1), havaitaan 5 mittaisilla binäärihahmoilla BSF-1:n olevan nopeampi. Tämä johtuu ilmeisesti siitä, että keskimääräinen hahmon siirto on vain 2,97, kun se on 5:n mittaisilla DNA-hahmoilla 3, BSF-2 Lauseke x & (-x) eristää oikeanpuoleisimman (=vähiten merkitsevän) 1-bitin; tulos on nolla, jos yksikään bitti ei ole viritetty. Toisin sanoen kaikki muut paitsi oikeanpuoleisin 1-bitti nollataan. Ilmeisesti vastaavaa lauseketta vasemmanpuolimmaiselle 1-bitille ei ole [6, ss ]. Edellä olevassa 8
9 lausekkeessa oletetaan kahden komplementtimuoto. Kun täsmälleen yksi bitti on viritetty, BSF ratkaisee itseasiassa kaksikantaisen logaritmin. Kun täsmälleen yksi bitti on viritetty, sen etsintä maskeilla käy puolitusperiaatteella seuraavasti [1]. Käytettävien testien järjestys on vapaa. j = 0; x = (sv >>= 1); x &= -x; /* clear all other but the lowest set bit */ /* where is lowest zero bit in sv */ /* */ #if(bits==32) if(x & 0xffff0000) j += 16; if(x & 0xff00ff00) j += 8; if(x & 0xf0f0f0f0) j += 4; if(x & 0xcccccccc) j += 2; if(x & 0xaaaaaaaa) j += 1; #elif(bits==64) if(x & 0xffffffff ) j += 32; if(x & 0xffff0000ffff0000) j += 16; if(x & 0xff00ff00ff00ff00) j += 8; if(x & 0xf0f0f0f0f0f0f0f0) j += 4; if(x & 0xcccccccccccccccc) j += 2; if(x & 0xaaaaaaaaaaaaaaaa) j += 1; #else abort(); sv >>= j; s += j+1; Tuo implementointi on vakioaikainen. Jos käytettäisiin hyväksi sitä, että siirtymä on enintään hahmon pituinen, aikavaativuus riippuisi pituuden logaritmista. Täysleveät bittimaskit ovat potentiaalinen ongelma: Ainakin Intelin NetBurst-arkkitehtuurissa voi ilmetä hidastumista, jos yli 16 bittisiä vakioita (immediates) käyttävän käskyn perään laitetaan toisia käskyjä, jotka käyttävät vakioita [9, s. 3-4]. 4.4 BSF-3 BSF-2:ssa tavun sisällä olevien bittien haarukointiin kuluu kolme testiä! Tavun sisältä vähiten merkitsevien nollabittien määrä voidaan taulukoida seuraavasti: static const unsigned char lowest_bit_in_byte[] = { 0, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0, 4, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0, 5, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0, 9
10 4, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0, 6, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0, 4, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0, 5, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0, 4, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0, 7, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0, 4, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0, 5, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0, 4, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0, 6, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0, 4, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0, 5, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0, 4, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0 }; Sivuttaissiirroilla tutkittavaa aluetta puolittamalla voidaan ainoan ykkösbitin sisältävä tavu siirtää näppärästi oikeaan laitaan. Tavusta ykkösbitti löytyy nopeasti edellä määritellyn taulukon avulla: j = 0; x = (sv >>= 1); x &= -x; /* clear all other but the lowest set bit */ /* where is lowest zero bit in sv */ #if(bits==32) if(x >> 16) {j += 16; x >>= 16;} if(x >> 8) {j += 8; x >>= 8;} #elif(bits==64) if(x >> 32) {j += 32; x >>= 32;} if(x >> 16) {j += 16; x >>= 16;} if(x >> 8) {j += 8; x >>= 8;} #else abort(); j += lowest_bit_in_byte[x & 0xFF]; sv >>= j; s += j+1; Hahmon pituushan on maksimisiirtymä. Siten BSF-3:ssa on itseasiassa tiedossa, että ensimmäinen if-ehto ei ole tosi koskaan, kun hahmonpituus on enintään puolet bittivektorista. Lisäämällä ensimmäiseen if-ehtoon ja 64 bittisessä tapauksessa myös toiseen unlikely-makro saadaan aikaan BSF-3U. BSF-3 on toteutettavissa myös luvussa esitetyllä tavalla ilman hyppykäskyjä esimerkiksi seuraavasti: #if(bits==32) j = (((x >> 16)==0)-1)&16; /* j gets 0 or 16 */ 10
11 j += (((x >> j+8)==0)-1)&8; #elif(bits==64) j = (((x >> 32)==0)-1)&32; /* j gets 0 or 32 */ j += (((x >> j+16)==0)-1)&16; j += (((x >> j+8)==0)-1)&8; #else abort(); j += lowest_bit_in_byte[(x >> j) & 0xFF]; 4.5 BSF-4 Jos sivuttaissiirtojen suoritusnopeudessa eri suuntiin on eroja, BSF-3:n if-ehdoissa käytetyt sivuttaissiirrot voidaan kääntää, jolloin saadaan seuraava versio: j = 0; x = (sv >>= 1); x &= -x; /* clear all other but the lowest set bit */ /* where is lowest zero bit in sv */ #if(bits==32) if(!(x << 16)) {j += 16; x >>= 16;} if(!(x << 24)) {j += 8; x >>= 8;} #elif(bits==64) if(!(x << 32)) {j += 32; x >>= 32;} if(!(x << 48)) {j += 16; x >>= 16;} if(!(x << 56)) {j += 8; x >>= 8;} #else abort(); j += lowest_bit_in_byte[x & 0xFF]; sv >>= j; s += j+1; Warrenin kirjassa [6, s. 85] koodi 5-15 on samankaltainen; vastaava ylimmän ykkösbitin etsintä on koodissa 5-6. Samaan tapaan kuin BSF-3 on implementoitavissa ilman hyppykäskyjä myös BSF-4 voidaan toteuttaa vaikkapa seuraavasti. Sivuttaissiirtoja oikealle on vain yksi indeksoinnissa! #if(bits==32) j = (((_Bool)(x << 16))-1)&16; j += (((_Bool)(x << 24-j))-1)&8; #elif(bits==64) j = (((_Bool)(x << 32))-1)&32; j += (((_Bool)(x << 48-j))-1)&16; j += (((_Bool)(x << 56-j))-1)&8; 11
12 #else abort(); j += lowest_bit_in_byte[(x>>j) & 0xFF]; Warrenin kirjassa [6, s. 80] on myös etumerkin laajentamiseen perustuva ratkaisu koodina Sitä kutsutaan seuraavassa nimellä BSF-5a. Taulukko 3: Hakuajat BSF-3:lla ja BSF-4:lla perus- ja haarautumattomilla (BF) versioilla millisekunteina. hahmot Englannin kieli DNA binääri versio BSF BSF-3BF BSF BSF-4BF BSF-3U BSF-5a Sivuttaissiirtoihin perustuvien versioiden vertailu on taulukossa 3. BSF-5a ja BSF-3:n versio unlikely-makrolla ovat selvästi toivottoman hitaita. BSF-4 toimii nopeammin kuin BSF-3. Vielä selkeämmin perusversiot ovat nopeampia kuin haarautumattomat versiot. Niiden välinen ero on suurempi lyhyillä kuin pidemmillä hahmoilla. Koska lyhyillä hahmoilla siirtoja on enemmän, tuo ero viittaa siihen, että haarautumaton koodi on huomattavasti hitaampaa. 5 Yhteenvetoa ja täydentäviä havaintoja Liitteessä A taulukon 5 laadinnassa käytetty prosessori on varsin lähellä testeissä käytettyä. Niistä vahvistuu edellisistä testeistä syntynyt epäilys sille, että sivuttaissiirto oikealle on hidas. Erityisen hidasta se näyttää olevan 64 bittisillä tiedolla. Siksi yhteenvetotesti on mielekkästä tehdä 32 bittisillä bittivektoreilla. Taulukko 4: Hakuaikojen (millisekunteina) vertailu 32 bittisillä bittivektoreilla. hahmot Englannin kieli DNA binääri versio BSF BSF BSF-1L BSF BSF BSF Testeissä käytetyssä prosessorissa BSF-konekäskyt ovat suhteellisen hitaita. Niitä kannattaa 12
13 käyttää 32 bittisillä bittivektoreilla vasta, kun keskimääräinen siirtymä on vähintään bittisillä bittivektoreilla kannattavuusraja on alempana. Alle 10 mittaisilla hahmoilla BSF-1 on todennäköisesti paras binääridatalla; muuntyyppisellä aineistolla BSF-4 on paras. Sivuttaissiirrot kannattaa järjestää tällä prosessorilla mahdollisuuksien mukaan vasemmalle. Jos siirretään oikealle, niin käytetään mieluummin 32 kuin 64 bittisiä bittivektoreita. Likely- ja unlikely-makrot eivät näytä hyödyllisiltä. Haarautumaton koodi ei vaikuta nopealta. Core 2 -sarjan prosessoreissa kaikki näyttää olevan toisin ;-) Viitteet [1] Jörg Arndt: Jörgs useful and ugly BIT WIZARDRY page. URL: bitwizardrypage.html. [2] Robert S. Boyer and J Strother Moore: A fast string searching algorithm. Communications of the ACM, 20(10): , [3] Agner Fog: 4. Instruction tables. Lists of instruction latencies, throughputs and micro-operation breakdowns for Intel and AMD CPU s. Copenhagen University Collage of Engineering. (Last updated ) URL: tables.pdf [4] Gonzalo Navarro and Mathieu Raffinot: Fast and flexible string matching by combining bitparallelism and suffix automata. ACM Journal of Experimental Algorithms, 5(4):1 36, [5] Hannu Peltola and Jorma Tarhio. Alternative algorithms for bit-parallel string matching. In String Processing and Information Retrieval, 10th International Symposium, SPIRE 2003, volume 2857 of Lecture Notes in Computer Science, pages 80 94, Springer-Verlag, Berlin, [6] Henry S. Warren, Jr.: Hacker s Delight. ISBN-10: , ISBN-13: Addison-Wesley, 2003 [7] Assembler Instructions with C Expression Operands URL: Extended-Asm.html [8] Intel R 64 and IA-32 Architectures Software Developer s Manual. Volume 2A: Instruction Set Reference, A-M. Order Number: US URL: processor/manuals/ pdf November 2008 [9] Intel R 64 and IA-32 Architectures Optimization Reference Manual. Order Number: URL: December 2008 [10] Software Optimization Guide for AMD64 Processors. Publication # Revision: 3.06 URL: type/white papers and tech docs/25112.pdf September
14 A Eräiden keskeisten käskyjen suorituskykytietoja Operandit i = käskyssä oleva vakio; r = joku rekisteri, r16 = 16 bitin rekisteri, r32 = 32 bitin rekisteri, r64 = 64 bitin rekisteri; m = muistissa oleva operandi; myös epäsuorasti osoitettu. cl tarkoittanee rekisteristä tavun kokoista osaa. µops Ops Dekoodattujen mikrokäskyjen määrä. (Ne talletetaan trace cache een.) Dekoodattujen (sisäisten) makrokäskyjen määrä. Latenssi Minimi määrä kellojaksoja ennenkuin seuraavan riippuvan käskyn suoritus voi alkaa samassa (suoritus)yksikössä. Ei sisällä muistista noutoa, jos operandi voi olla rekisterissä tai muistissa (r/m). Tavallisempi merkitys termille latenssi kuin seuraava. P4 ja P4E prosessoreissa tulee yhden kellojakson ylimääräinen latenssi, kun jossain (suoritus)yksikössä suoritettavan mikrokäskyn (µop) tulosta tarvitaan jossain muussa yksikössä. Läpäisykyky Keskimääräinen määrä kellojaksoja (suorituksen alusta) ennenkuin seuraavan saman tyyppisen riippumattoman käskyn suoritus voi alkaa samassa (suoritus)yksikössä. Esimerkiksi arvo 0.25 tarkoittaa 4 käskyä kellojaksossa (yhdessä threadissä). Harvinaisempi merkitys termille latenssi (issue latency). Taulukko 5: Intel Pentium 4E (Family 15, Model 4) [3]. Käsky operandit µops latenssi läpäisykyky ADD, SUB r,r ADD, SUB r,m ADD, SUB m,r AND, OR, XOR r,r AND, OR, XOR r,m AND, OR, XOR m,r BSF, BSR r,r/m SHL r,i SHL r,cl SHL, SHR m8/16/32,i 3 10 SHL, SHR m8/16/32,cl 2 10 SHR r8/16/32,i SHR r64,i SHR r8/16/32,cl SHR r64,cl
15 Taulukko 6: Intel Core 2 (45nm) (Family 6, Model 23) [3]. Käsky operandit µops latenssi läpäisykyky ADD, SUB r,r/i ADD, SUB r,m ADD, SUB m,r/i AND, OR, XOR r,r/i AND, OR, XOR r,m AND, OR, XOR m,r/i BSF, BSR r,r BSF, BSR r,m 2 1 SHL, SHR r,i/cl SHL, SHR m,i/cl Taulukko 7: AMD K7 (Family 6 Model 6) [3]. Käsky operandit Ops latenssi läpäisykyky ADD, SUB r,r/i 1 1 1/3 ADD, SUB r,m 1 1 1/2 ADD, SUB m,r AND, OR, XOR r,r 1 1 1/3 AND, OR, XOR r,m 1 1 1/2 AND, OR, XOR m,r BSF r,r BSF r,m BSR r,r BSR r,m SHL, SHR r,i/cl 1 1 1/3 Taulukko 8: AMD K8 (Family 15, Model 5) [3]. Käsky operandit Ops latenssi läpäisykyky ADD, SUB r,r/i 1 1 1/3 ADD, SUB r,m 1 1 1/2 ADD, SUB m,r AND, OR, XOR r,r 1 1 1/3 AND, OR, XOR r,m 1 1 1/2 AND, OR, XOR m,r BSF r16/r32,r BSF r64,r BSF r16,m BSF r32,m BSF r64,m BSR r,r BSR r,m SHL, SHR r,i/cl
Ongelma(t): Miten tietokoneen komponentteja voi ohjata siten, että ne tekevät yhdessä jotakin järkevää? Voiko tietokonetta ohjata (ohjelmoida) siten,
Ongelma(t): Miten tietokoneen komponentteja voi ohjata siten, että ne tekevät yhdessä jotakin järkevää? Voiko tietokonetta ohjata (ohjelmoida) siten, että se pystyy suorittamaan kaikki mahdolliset algoritmit?
Lisätiedot815338A Ohjelmointikielten periaatteet Harjoitus 2 vastaukset
815338A Ohjelmointikielten periaatteet 2015-2016. Harjoitus 2 vastaukset Harjoituksen aiheena on BNF-merkinnän käyttö ja yhteys rekursiivisesti etenevään jäsentäjään. Tehtävä 1. Mitkä ilmaukset seuraava
Lisätiedot811120P Diskreetit rakenteet
811120P Diskreetit rakenteet 2016-2017 1. Algoritmeista 1.1 Algoritmin käsite Algoritmi keskeinen laskennassa Määrittelee prosessin, joka suorittaa annetun tehtävän Esimerkiksi Nimien järjestäminen aakkosjärjestykseen
Lisätiedot811120P Diskreetit rakenteet
811120P Diskreetit rakenteet 2018-2019 1. Algoritmeista 1.1 Algoritmin käsite Algoritmi keskeinen laskennassa Määrittelee prosessin, joka suorittaa annetun tehtävän Esimerkiksi Nimien järjestäminen aakkosjärjestykseen
LisätiedotTIEP114 Tietokoneen rakenne ja arkkitehtuuri, 3 op. Assembly ja konekieli
TIEP114 Tietokoneen rakenne ja arkkitehtuuri, 3 op Assembly ja konekieli Tietokoneen ja ohjelmiston rakenne Loogisilla piireillä ja komponenteilla rakennetaan prosessori ja muistit Prosessorin rakenne
LisätiedotOngelma(t): Miten mikro-ohjelmoitavaa tietokonetta voisi ohjelmoida kirjoittamatta binääristä (mikro)koodia? Voisiko samalla algoritmin esitystavalla
Ongelma(t): Miten mikro-ohjelmoitavaa tietokonetta voisi ohjelmoida kirjoittamatta binääristä (mikro)koodia? Voisiko samalla algoritmin esitystavalla ohjelmoida useita komponenteiltaan ja rakenteeltaan
LisätiedotAlgoritmit 2. Luento 13 Ti Timo Männikkö
Algoritmit 2 Luento 13 Ti 30.4.2019 Timo Männikkö Luento 13 Simuloitu jäähdytys Merkkijonon sovitus Horspoolin algoritmi Ositus ja rekursio Rekursion toteutus Algoritmit 2 Kevät 2019 Luento 13 Ti 30.4.2019
LisätiedotLOAD R1, =2 Sijoitetaan rekisteriin R1 arvo 2. LOAD R1, 100
Tiedonsiirtokäskyt LOAD LOAD-käsky toimii jälkimmäisestä operandista ensimmäiseen. Ensimmäisen operandin pitää olla rekisteri, toinen voi olla rekisteri, vakio tai muistiosoite (myös muuttujat ovat muistiosoitteita).
LisätiedotAlgoritmit 1. Luento 3 Ti Timo Männikkö
Algoritmit 1 Luento 3 Ti 17.1.2017 Timo Männikkö Luento 3 Algoritmin analysointi Rekursio Lomituslajittelu Aikavaativuus Tietorakenteet Pino Algoritmit 1 Kevät 2017 Luento 3 Ti 17.1.2017 2/27 Algoritmien
Lisätiedot13. Loogiset operaatiot 13.1
13. Loogiset operaatiot 13.1 Sisällys Loogiset operaatiot AND, OR, XOR ja NOT. Operaatioiden ehdollisuus. Bittioperaatiot. Loogiset operaatiot ohjausrakenteissa. Loogiset operaatiot ja laskentajärjestys.
LisätiedotTIEP114 Tietokoneen rakenne ja arkkitehtuuri, 3 op. Assembly ja konekieli
TIEP114 Tietokoneen rakenne ja arkkitehtuuri, 3 op Assembly ja konekieli Tietokoneen ja ohjelmiston rakenne Loogisilla piireillä ja komponenteilla rakennetaan prosessori ja muistit Prosessorin rakenne
Lisätiedot12. Javan toistorakenteet 12.1
12. Javan toistorakenteet 12.1 Sisällys Yleistä toistorakenteista. Laskurimuuttujat. While-, do-while- ja for-lauseet. Laskuri- ja lippumuuttujat. Tyypillisiä ohjelmointivirheitä. Silmukan rajat asetettu
Lisätiedot12. Javan toistorakenteet 12.1
12. Javan toistorakenteet 12.1 Sisällys Yleistä toistorakenteista. Laskurimuuttujat. While-, do-while- ja for-lauseet. Laskuri- ja lippumuuttujat. Tyypillisiä ohjelmointivirheitä. Silmukan rajat asetettu
LisätiedotTiedon esitysmuodot. Luento 6 (verkkoluento 6) Lukujärjestelmät Kokonaisluvut, liukuluvut Merkit, merkkijonot Äänet, kuvat, muu tieto
Luento 6 (verkkoluento 6) Tiedon esitysmuodot Lukujärjestelmät Kokonaisluvut, liukuluvut Merkit, merkkijonot Äänet, kuvat, muu tieto Ohjelman esitysmuoto Rakenteellinen tieto 1 Tiedon tyypit Kommunikointi
LisätiedotTietokonearitmetiikka
Tietokoneen rakenne Luento 6 Tietokonearitmetiikka Stallings: Ch 9 Kokonaislukuesitys Kokonaislukuaritmetiikka Liukulukuesitys Liukulukuaritmetiikka Luento 6-1 ALU: Aritmeettis-Looginen Yksikkö ALU = Aritmetic
LisätiedotPerusteet. Pasi Sarolahti Aalto University School of Electrical Engineering. C-ohjelmointi Kevät Pasi Sarolahti
C! Perusteet 19.1.2017 Palautteesta (1. kierros toistaiseksi) (Erittäin) helppoa Miksi vain puolet pisteistä? Vaikeinta oli ohjelmointiympäristön asennus ja käyttö Ei selvää että main funktion pitikin
LisätiedotTietotyypit ja operaattorit
Tietotyypit ja operaattorit Luennossa tarkastellaan yksinkertaisten tietotyyppien int, double ja char muunnoksia tyypistä toiseen sekä esitellään uusia operaatioita. Numeeriset tietotyypit ja muunnos Merkkitieto
Lisätiedot13. Loogiset operaatiot 13.1
13. Loogiset operaatiot 13.1 Sisällys Loogiset operaatiot AND, OR, XOR ja NOT. Operaatioiden ehdollisuus. Bittioperaatiot. Loogiset operaatiot ohjausrakenteissa. Loogiset operaatiot ja laskentajärjestys.
LisätiedotPerusteet. Pasi Sarolahti Aalto University School of Electrical Engineering. C-ohjelmointi Kevät Pasi Sarolahti
C! Perusteet 19.1.2017 Palautteesta (1. kierros toistaiseksi) Toistaiseksi helppoa Miksi vain puolet pisteistä? Vaikeinta oli ohjelmointiympäristön asennus ja käyttö Vaikeaa eroavuudet Pythonin ja C:n
LisätiedotSisällys. 12. Javan toistorakenteet. Yleistä. Laskurimuuttujat
Sisällys 12. Javan toistorakenteet Ylstä toistorakentsta. Laskurimuuttujat. While-, do-while- ja for-lauseet. Laskuri- ja lippumuuttujat. Tyypillisiä ohjelmointivirhtä. Silmukan rajat asetettu kierroksen
LisätiedotAlkuarvot ja tyyppimuunnokset (1/5) Alkuarvot ja tyyppimuunnokset (2/5) Alkuarvot ja tyyppimuunnokset (3/5)
Alkuarvot ja tyyppimuunnokset (1/5) Aiemmin olemme jo antaneet muuttujille alkuarvoja, esimerkiksi: int luku = 123; Alkuarvon on oltava muuttujan tietotyypin mukainen, esimerkiksi int-muuttujilla kokonaisluku,
LisätiedotTietokonearitmetiikka
Luento 6 ALU: Aritmeettis-Looginen Yksikkö Tietokonearitmetiikka Stallings: Ch 9 Kokonaislukuesitys Kokonaislukuaritmetiikka Liukulukuesitys Liukulukuaritmetiikka Luento 6-1 ALU = Aritmetic Logic Unit
LisätiedotOhjelmoinnin perusteet Y Python
Ohjelmoinnin perusteet Y Python T-106.1208 25.1.2010 T-106.1208 Ohjelmoinnin perusteet Y 25.1.2010 1 / 41 Valintakäsky if Tähänastiset ohjelmat ovat toimineen aina samalla tavalla. Usein ohjelman pitäisi
LisätiedotOhjelmoinnin peruskurssi Y1
Ohjelmoinnin peruskurssi Y1 CSE-A1111 21.9.2016 CSE-A1111 Ohjelmoinnin peruskurssi Y1 21.9.2016 1 / 22 Mahdollisuus antaa luentopalautetta Goblinissa vasemmassa reunassa olevassa valikossa on valinta Luentopalaute.
Lisätiedot815338A Ohjelmointikielten periaatteet Harjoitus 3 vastaukset
815338A Ohjelmointikielten periaatteet 2015-2016. Harjoitus 3 vastaukset Harjoituksen aiheena ovat imperatiivisten kielten muuttujiin liittyvät kysymykset. Tehtävä 1. Määritä muuttujien max_num, lista,
LisätiedotKoottu lause; { ja } -merkkien väliin kirjoitetut lauseet muodostavat lohkon, jonka sisällä lauseet suoritetaan peräkkäin.
2. Ohjausrakenteet Ohjausrakenteiden avulla ohjataan ohjelman suoritusta. peräkkäisyys valinta toisto Koottu lause; { ja } -merkkien väliin kirjoitetut lauseet muodostavat lohkon, jonka sisällä lauseet
LisätiedotAlgoritmit 2. Luento 12 To Timo Männikkö
Algoritmit 2 Luento 12 To 3.5.2018 Timo Männikkö Luento 12 Geneettiset algoritmit Simuloitu jäähdytys Merkkijonon sovitus Horspoolin algoritmi Algoritmit 2 Kevät 2018 Luento 12 To 3.5.2018 2/35 Algoritmien
LisätiedotJohnson, A Theoretician's Guide to the Experimental Analysis of Algorithms.
Kokeellinen algoritmiikka (3 ov) syventäviä opintoja edeltävät opinnot: ainakin Tietorakenteet hyödyllisiä opintoja: ASA, Algoritmiohjelmointi suoritus harjoitustyöllä (ei tenttiä) Kirjallisuutta: Johnson,
Lisätiedot11. Javan toistorakenteet 11.1
11. Javan toistorakenteet 11.1 Sisällys Laskuri- ja lippumuuttujat. Sisäkkäiset silmukat. Tyypillisiä ohjelmointivirheitä: Silmukan rajat asetettu kierroksen verran väärin. Ikuinen silmukka. Silmukoinnin
LisätiedotOhjelmoinnin perusteet Y Python
Ohjelmoinnin perusteet Y Python T-106.1208 26.1.2009 T-106.1208 Ohjelmoinnin perusteet Y 26.1.2009 1 / 33 Valintakäsky if syote = raw_input("kerro tenttipisteesi.\n") pisteet = int(syote) if pisteet >=
Lisätiedot52480S TIETOKEARKKITEHTUURIT Tentti 6.2.1998
S Ä H K Ö T E K N I I K A N O S A S T O 548S TIETOKEARKKITEHTUURIT Tentti 6..998 Oulu 8..999. Selosta lyhyesti käsitteet: a. set associative memory b. conflict miss c. consistency of cached data d. access
LisätiedotOsoitin ja viittaus C++:ssa
Osoitin ja viittaus C++:ssa Osoitin yksinkertaiseen tietotyyppiin Osoitin on muuttuja, joka sisältää jonkin toisen samantyyppisen muuttujan osoitteen. Ohessa on esimerkkiohjelma, jossa määritellään kokonaislukumuuttuja
LisätiedotTAMPEREEN TEKNILLINEN YLIOPISTO
TAMPEREEN TEKNILLINEN YLIOPISTO Digitaali- ja Tietokonetekniikan laitos TKT-3200 Tietokonetekniikka ASSEMBLER: QSORT 06.09.2005 Ryhmä 00 nimi1 email1 opnro1 nimi2 email2 opnro2 nimi3 email3 opnro3 1. TEHTÄVÄ
LisätiedotTietorakenteet ja algoritmit - syksy 2015 1
Tietorakenteet ja algoritmit - syksy 2015 1 Tietorakenteet ja algoritmit - syksy 2015 2 Tietorakenteet ja algoritmit Johdanto Ari Korhonen Tietorakenteet ja algoritmit - syksy 2015 1. JOHDANTO 1.1 Määritelmiä
LisätiedotOhjelmoinnin perusteet Y Python
Ohjelmoinnin perusteet Y Python T-106.1208 24.1.2011 T-106.1208 Ohjelmoinnin perusteet Y 24.1.2011 1 / 36 Luentopalaute kännykällä alkaa tänään! Ilmoittaudu mukaan lähettämällä ilmainen tekstiviesti Vast
LisätiedotAlgoritmit 2. Luento 14 Ke Timo Männikkö
Algoritmit 2 Luento 14 Ke 3.5.2017 Timo Männikkö Luento 14 Ositus ja rekursio Rekursion toteutus Kertaus ja tenttivinkit Algoritmit 2 Kevät 2017 Luento 14 Ke 3.5.2017 2/30 Ositus Tehtävän esiintymä ositetaan
LisätiedotA ja B pelaavat sarjan pelejä. Sarjan voittaja on se, joka ensin voittaa n peliä.
Esimerkki otteluvoiton todennäköisyys A ja B pelaavat sarjan pelejä. Sarjan voittaja on se, joka ensin voittaa n peliä. Yksittäisessä pelissä A voittaa todennäköisyydellä p ja B todennäköisyydellä q =
LisätiedotIntel Pentium Pro -prosessori. tietokonearkkitehtuurit, syksy -96 Ari Rantanen
Intel Pentium Pro -prosessori tietokonearkkitehtuurit, syksy -96 Ari Rantanen Tarkasteltavat aiheet Katsaus Pentium Pro:n ominaisuuksiin Käskyn suoritus Pentium Pro:n liukuhihnalla Pentium Pro:n suorituskyky
LisätiedotOhjelmoinnin perusteet Y Python
Ohjelmoinnin perusteet Y Python T-106.1208 2.3.2009 T-106.1208 Ohjelmoinnin perusteet Y 2.3.2009 1 / 28 Puhelinluettelo, koodi def lue_puhelinnumerot(): print "Anna lisattavat nimet ja numerot." print
LisätiedotOhjelmoijan binaarialgebra ja heksaluvut
Paavo Räisänen Ohjelmoijan binaarialgebra ja heksaluvut www.ohjelmoinaan.net Tätä opasta saa vapaasti kopioida, tulostaa ja levittää ei kaupallisissa tarkoituksissa. Kuitenkaan omille nettisivuille opasta
LisätiedotNumeropelissä 3x3-ruudukko sisältää luvut 1, 2,, 9. Tehtäväsi on järjestää ruudukko näin:
A Numeropeli Numeropelissä 3x3-ruudukko sisältää luvut 1, 2,, 9. Tehtäväsi on järjestää ruudukko näin: 1 2 3 4 5 6 7 8 9 Voit jokaisella siirrolla vaihtaa keskenään kaksi vierekkäistä lukua vaaka- tai
LisätiedotAlgoritmit 1. Luento 10 Ke Timo Männikkö
Algoritmit 1 Luento 10 Ke 14.2.2018 Timo Männikkö Luento 10 Algoritminen ongelmanratkaisu Suunnittelumenetelmät Raaka voima Järjestäminen eli lajittelu Kuplalajittelu Lisäyslajittelu Valintalajittelu Permutaatiot
LisätiedotOhjelmoinnin perusteet Y Python
Ohjelmoinnin perusteet Y Python T-106.1208 25.2.2009 T-106.1208 Ohjelmoinnin perusteet Y 25.2.2009 1 / 34 Syötteessä useita lukuja samalla rivillä Seuraavassa esimerkissä käyttäjä antaa useita lukuja samalla
LisätiedotHarjoitustyö: virtuaalikone
Harjoitustyö: virtuaalikone Toteuta alla kuvattu virtuaalikone yksinkertaiselle olio-orientoituneelle skriptauskielelle. Paketissa on testaamista varten mukana kaksi lyhyttä ohjelmaa. Ohjeita Noudata ohjelman
LisätiedotTietokonearitmetiikka
Tietokoneen rakenne Luento 6 Tietokonearitmetiikka (Computer Arithmetic) Stallings: Ch 9 Kokonaislukuesitys Kokonaislukuaritmetiikka Liukulukuesitys Liukulukuaritmetiikka Luento 6-1 ALU: Aritmeettis-Looginen
LisätiedotTieto ja sen osoite (3) Jakso 3 Konekielinen ohjelmointi (TTK-91, KOKSI) Osoitinmuuttujat. Tieto ja sen osoite (5)
Jakso 3 Konekielinen ohjelmointi (TTK-91, KOKSI) Muuttujat Tietorakenteet Kontrolli Optimointi Tarkistukset 1 Tieto ja sen osoite (3) X DC LOAD, =X LOAD R2, X int x =; symbolin X arvo muuttujan X arvo
LisätiedotIDL - proseduurit. ATK tähtitieteessä. IDL - proseduurit
IDL - proseduurit 25. huhtikuuta 2017 Viimeksi käsiteltiin IDL:n interaktiivista käyttöä, mutta tämä on hyvin kömpelöä monimutkaisempia asioita tehtäessä. IDL:llä on mahdollista tehdä ns. proseduuri-tiedostoja,
LisätiedotTietokonearitmetiikka
Luento 6 ALU: Aritmeettis-Looginen Yksikkö Tietokonearitmetiikka (Computer Arithmetic) Stallings: Ch 9 Kokonaislukuesitys Kokonaislukuaritmetiikka Liukulukuesitys Liukulukuaritmetiikka Luento 6-1 ALU =
LisätiedotATK tähtitieteessä. Osa 3 - IDL proseduurit ja rakenteet. 18. syyskuuta 2014
18. syyskuuta 2014 IDL - proseduurit Viimeksi käsiteltiin IDL:n interaktiivista käyttöä, mutta tämä on hyvin kömpelöä monimutkaisempia asioita tehtäessä. IDL:llä on mahdollista tehdä ns. proseduuri-tiedostoja,
LisätiedotHarjoitustyön testaus. Juha Taina
Harjoitustyön testaus Juha Taina 1. Johdanto Ohjelman teko on muutakin kuin koodausta. Oleellinen osa on selvittää, että ohjelma toimii oikein. Tätä sanotaan ohjelman validoinniksi. Eräs keino validoida
LisätiedotAlgoritmit 2. Luento 8 To Timo Männikkö
Algoritmit 2 Luento 8 To 4.4.2019 Timo Männikkö Luento 8 Algoritmien analysointi Algoritmien suunnittelu Rekursio Osittaminen Rekursioyhtälöt Rekursioyhtälön ratkaiseminen Master-lause Algoritmit 2 Kevät
LisätiedotTähtitieteen käytännön menetelmiä Kevät 2009 Luento 4: Ohjelmointi, skriptaus ja Python
Tähtitieteen käytännön menetelmiä Kevät 2009 Luento 4: Ohjelmointi, skriptaus ja Python 31. tammikuuta 2009 Ohjelmointi Perusteet Pythonin alkeet Esittely Esimerkkejä Muuttujat Peruskäsitteitä Käsittely
LisätiedotSisällys. 11. Javan toistorakenteet. Laskurimuuttujat. Yleistä
Sisällys 11. Javan toistorakenteet Laskuri- ja lippumuuttujat.. Tyypillisiä ohjelmointivirheitä: Silmukan rajat asetettu kierroksen verran väärin. Ikuinen silmukka. Silmukoinnin lopettaminen break-lauseella.
LisätiedotOhjelmoinnin perusteet Y Python
Ohjelmoinnin perusteet Y Python T-106.1208 20.1.2010 T-106.1208 Ohjelmoinnin perusteet Y 20.1.2010 1 / 40 Arvon pyytäminen käyttäjältä Käyttäjän antaman arvon voi lukea raw_input-käskyllä. Käskyn sulkujen
LisätiedotOhjelmoinnin perusteet Y Python
Ohjelmoinnin perusteet Y Python T-106.1208 11.2.2009 T-106.1208 Ohjelmoinnin perusteet Y 11.2.2009 1 / 33 Kertausta: listat Tyhjä uusi lista luodaan kirjoittamalla esimerkiksi lampotilat = [] (jolloin
LisätiedotAlgoritmit 1. Luento 1 Ti Timo Männikkö
Algoritmit 1 Luento 1 Ti 10.1.2017 Timo Männikkö Luento 1 Algoritmi Algoritmin toteutus Ongelman ratkaiseminen Algoritmin tehokkuus Algoritmin suoritusaika Algoritmin analysointi Algoritmit 1 Kevät 2017
LisätiedotAlgoritmit 2. Luento 7 Ti Timo Männikkö
Algoritmit 2 Luento 7 Ti 4.4.2017 Timo Männikkö Luento 7 Joukot Joukko-operaatioita Joukkojen esitystapoja Alkiovieraat osajoukot Toteutus puurakenteena Algoritmit 2 Kevät 2017 Luento 7 Ti 4.4.2017 2/26
LisätiedotTietorakenteet ja algoritmit
Tietorakenteet ja algoritmit Rekursio Rekursion käyttötapauksia Rekursio määritelmissä Rekursio ongelmanratkaisussa ja ohjelmointitekniikkana Esimerkkejä taulukolla Esimerkkejä linkatulla listalla Hanoin
LisätiedotTIE448 Kääntäjätekniikka, syksy 2009. Antti-Juhani Kaijanaho. 7. joulukuuta 2009
TIE448 Kääntäjätekniikka, syksy 2009 Antti-Juhani Kaijanaho TIETOTEKNIIKAN LAITOS 7. joulukuuta 2009 Sisällys Sisällys Seuraava deadline Vaihe F maanantai 14.12. klo 12 rekisteriallokaatio Arvostelukappale
LisätiedotTietorakenteet, laskuharjoitus 7, ratkaisuja
Tietorakenteet, laskuharjoitus, ratkaisuja. Seuraava kuvasarja näyttää B + -puun muutokset lisäysten jälkeen. Avaimet ja 5 mahtuvat lehtisolmuihin, joten niiden lisäys ei muuta puun rakennetta. Avain 9
LisätiedotJava-kielen perusteet
Java-kielen perusteet Tunnus, varattu sana, kommentti Muuttuja, alkeistietotyyppi, merkkijono, literaalivakio, nimetty vakio Tiedon merkkipohjainen tulostaminen 1 Tunnus Java tunnus Java-kirjain Java-numero
LisätiedotSisällys. 16. Ohjelmoinnin tekniikkaa. Aritmetiikkaa toisin merkiten. Aritmetiikkaa toisin merkiten
Sisällys 16. Ohjelmoinnin tekniikkaa Vaihtoehtoisia merkintöjä aritmeettisille lauseille. Useiden muuttujien esittely ja alustaminen yhdellä lauseella. For-lause lyhemmin. If-else-lause vaihtoehtoisesti
LisätiedotKappale 20: Kantaluvut
Kappale 20: Kantaluvut 20 Johdanto: Kantaluvut... 328 Kantalukujen syöttäminen ja muuntaminen... 329 Matemaattiset toiminnot Hex- ja Bin-luvuilla... 330 Bittien vertaileminen ja manipulointi... 331 Huom!
LisätiedotLaitteistonläheinen ohjelmointi
Laitteistonläheinen ohjelmointi 4 op Luennoija: Pertti Lehtinen Luennot: Perjantai 12-14 TB104 Esitiedot: Mikroprosessorit Perusohjelmointikurssi Kurssin osat: luennot, harjoitustyö, tentti Materiaali:
LisätiedotSisällys. 3. Muuttujat ja operaatiot. Muuttujat ja operaatiot. Muuttujat. Operaatiot. Imperatiivinen laskenta. Muuttujat. Esimerkkejä: Operaattorit.
3. Muuttujat ja operaatiot Sisällys Imperatiivinen laskenta. Muuttujat. Nimi ja arvo. Muuttujan nimeäminen. Muuttujan tyyppi.. Operandit. Arvon sijoitus muuttujaan. Aritmeettiset operaattorit. Arvojen
Lisätiedot1. Keskusyksikön rakenne
1. Keskusyksikön rakenne Kuvassa on esitelty TTK-91 esimerkkikoneen keskusyksikkö. Oikeiden tietokoneiden keskusyksiköt ovat luonnollisesti monimutkaisempia, mutta tämä riittää oikein mainiosti asian havainnollistamiseen.
LisätiedotTAMPEREEN TEKNILLINEN YLIOPISTO
TAMPEREEN TEKNILLINEN YLIOPISTO Digitaali- ja Tietokonetekniikan laitos TKT-3200 Tietokonetekniikka ASSEMBLER: QSORT 11.08.2010 Ryhmä 00 nimi1 email1 opnro1 nimi2 email2 opnro2 nimi3 email3 opnro3 1. TEHTÄVÄ
LisätiedotOlkoon S(n) kutsun merge-sort(a, p, q) tilavaativuus kun p q + 1 = n. Oletetaan merge toteutetuksi vakiotyötilassa (ei-triviaalia mutta mahdollista).
Esimerkki Lomitusjärjestäminen merge-sort(a, p, q): var k % paikallinen muuttuja, vakiotila 1. if p < q then 2. r := (p + q)/2 3. merge-sort(a, p, r) 4. merge-sort(a, r + 1, q) 5. merge(a, p, r, q) Olkoon
Lisätiedot16. Ohjelmoinnin tekniikkaa 16.1
16. Ohjelmoinnin tekniikkaa 16.1 Sisällys Vaihtoehtoisia merkintöjä aritmeettisille lauseille. Useiden muuttujien esittely ja alustaminen yhdellä lauseella. For-lause lyhemmin. If-else-lause vaihtoehtoisesti
Lisätiedot815338A Ohjelmointikielten periaatteet Harjoitus 6 Vastaukset
815338A Ohjelmointikielten periaatteet 2015-2016. Harjoitus 6 Vastaukset Harjoituksen aiheena on funktionaalinen ohjelmointi Scheme- ja Haskell-kielillä. Voit suorittaa ohjelmat osoitteessa https://ideone.com/
LisätiedotVIII. Osa. Liitteet. Liitteet Suoritusjärjestys Varatut sanat Binääri- ja heksamuoto
Osa VIII Liitteet Liitteet A B C Suoritusjärjestys Varatut sanat Binääri- ja heksamuoto Osa VIII A. Liite Operaattoreiden suoritusjärjestys On tärkeää ymmärtää, että operaattoreilla on prioriteettinsa,
LisätiedotJakso 3 Konekielinen ohjelmointi (TTK-91, KOKSI)
Jakso 3 Konekielinen ohjelmointi (TTK-91, KOKSI) Muuttujat Tietorakenteet Kontrolli Optimointi Tarkistukset 1 Muuttujan X osoite on 230 Muuttujan X arvo on 12 Symbolin X arvo on 230 symbolit ovat yleensä
LisätiedotC-kielessä taulukko on joukko peräkkäisiä muistipaikkoja, jotka kaikki pystyvät tallettamaan samaa tyyppiä olevaa tietoa.
Taulukot C-kielessä taulukko on joukko peräkkäisiä muistipaikkoja, jotka kaikki pystyvät tallettamaan samaa tyyppiä olevaa tietoa. Taulukon muuttujilla (muistipaikoilla) on yhteinen nimi. Jokaiseen yksittäiseen
LisätiedotOhjelmoinnin perusteet Y Python
Ohjelmoinnin perusteet Y Python T-106.1208 21.1.2009 T-106.1208 Ohjelmoinnin perusteet Y 21.1.2009 1 / 32 Tyypeistä Monissa muissa ohjelmointikielissä (esim. Java ja C) muuttujat on määriteltävä ennen
LisätiedotAlgoritmit 1. Luento 11 Ti Timo Männikkö
Algoritmit 1 Luento 11 Ti 14.2.2017 Timo Männikkö Luento 11 Algoritminen ongelmanratkaisu Osittaminen Lomituslajittelu Lomituslajittelun vaativuus Rekursioyhtälöt Pikalajittelu Algoritmit 1 Kevät 2017
LisätiedotJava-kielen perusteet
Java-kielen perusteet Tunnus, varattu sana, kommentti Muuttuja, alkeistietotyyppi, merkkijono, Vakio Tiedon merkkipohjainen tulostaminen Ohjelmointi (ict1tx006) Tunnus (5.3) Javan tunnus Java-kirjain Java-numero
LisätiedotOhjelmoinnin perusteet Y Python
Ohjelmoinnin perusteet Y Python T-106.1208 17.2.2010 T-106.1208 Ohjelmoinnin perusteet Y 17.2.2010 1 / 41 Sanakirja Monissa sovelluksissa on tallennettava rakenteeseen avain arvo-pareja. Myöhemmin rakenteesta
Lisätiedot16. Ohjelmoinnin tekniikkaa 16.1
16. Ohjelmoinnin tekniikkaa 16.1 Sisällys For-lause lyhemmin. Vaihtoehtoisia merkintöjä aritmeettisille lauseille. Useiden muuttujien esittely ja alustaminen yhdellä lauseella. If-else-lause vaihtoehtoisesti
LisätiedotTietorakenteet ja algoritmit Johdanto Lauri Malmi / Ari Korhonen
Tietorakenteet ja algoritmit Johdanto Lauri Malmi / Ari 1 1. JOHDANTO 1.1 Määritelmiä 1.2 Tietorakenteen ja algoritmin valinta 1.3 Algoritmit ja tiedon määrä 1.4 Tietorakenteet ja toiminnot 1.5 Esimerkki:
LisätiedotTietokoneen rakenne: Harjoitustyö. Motorola MC68030 -prosessori
kevät 2004 TP02S-D Tietokoneen rakenne: Harjoitustyö Motorola MC68030 -prosessori Työn valvojat: Seppo Haltsonen Pasi Lankinen RAPORTTI 13.5.2004 Sisällysluettelo sivu Tiivistelmä... 1 Lohkokaavio... 2
Lisätiedot811312A Tietorakenteet ja algoritmit, , Harjoitus 3, Ratkaisu
811312A Tietorakenteet ja algoritmit, 2018-2019, Harjoitus 3, Ratkaisu Harjoituksessa käsitellään algoritmien aikakompleksisuutta. Tehtävä 3.1 Kuvitteelliset algoritmit A ja B lajittelevat syötteenään
LisätiedotOngelma(t): Miten jollakin korkeamman tason ohjelmointikielellä esitetty algoritmi saadaan suoritettua mikro-ohjelmoitavalla tietokoneella ja siinä
Ongelma(t): Miten jollakin korkeamman tason ohjelmointikielellä esitetty algoritmi saadaan suoritettua mikro-ohjelmoitavalla tietokoneella ja siinä olevilla komponenteilla? Voisiko jollakin ohjelmointikielellä
LisätiedotNumeeriset menetelmät
Numeeriset menetelmät Luento 2 To 8.9.2011 Timo Männikkö Numeeriset menetelmät Syksy 2011 Luento 2 To 8.9.2011 p. 1/33 p. 1/33 Lukujen tallennus Kiintoluvut (integer) tarkka esitys aritmeettiset operaatiot
LisätiedotJava-kielen perusteita
Java-kielen perusteita valintalauseet 1 Johdantoa kontrollirakenteisiin Tähän saakka ohjelmissa on ollut vain peräkkäisyyttä eli lauseet on suoritettu peräkkäin yksi kerrallaan Tarvitsemme myös valintaa
LisätiedotPerinteiset tietokoneohjelmat alkavat pääohjelmasta, c:ssä main(), jossa edetään rivi riviltä ja käsky käskyltä.
TIETOKONEOHJELMIEN RAKENNE Perinteiset tietokoneohjelmat alkavat pääohjelmasta, c:ssä main(), jossa edetään rivi riviltä ja käsky käskyltä. Teollisuusautomaation ohjelmiin on lainattu runsaasti perinteisen
LisätiedotTietueet. Tietueiden määrittely
Tietueet Tietueiden määrittely Tietue on tietorakenne, joka kokoaa yhteen eri tyyppistä tietoa yhdeksi asiakokonaisuudeksi. Tähän kokonaisuuteen voidaan viitata yhteisellä nimellä. Auttaa ohjelmoijaa järjestelemään
Lisätiedot1.3Lohkorakenne muodostetaan käyttämällä a) puolipistettä b) aaltosulkeita c) BEGIN ja END lausekkeita d) sisennystä
OULUN YLIOPISTO Tietojenkäsittelytieteiden laitos Johdatus ohjelmointiin 81122P (4 ov.) 30.5.2005 Ohjelmointikieli on Java. Tentissä saa olla materiaali mukana. Tenttitulokset julkaistaan aikaisintaan
LisätiedotTAMPEREEN TEKNILLINEN YLIOPISTO Digitaali- ja tietokonetekniikan laitos. Harjoitustyö 4: Cache, osa 2
TAMPEREEN TEKNILLINEN YLIOPISTO Digitaali- ja tietokonetekniikan laitos TKT-3200 Tietokonetekniikka I Harjoitustyö 4: Cache, osa 2.. 2010 Ryhmä Nimi Op.num. 1 Valmistautuminen Cache-työn toisessa osassa
LisätiedotLuku 6. Dynaaminen ohjelmointi. 6.1 Funktion muisti
Luku 6 Dynaaminen ohjelmointi Dynaamisessa ohjelmoinnissa on ideana jakaa ongelman ratkaisu pienempiin osaongelmiin, jotka voidaan ratkaista toisistaan riippumattomasti. Jokaisen osaongelman ratkaisu tallennetaan
Lisätiedot7.4 Sormenjälkitekniikka
7.4 Sormenjälkitekniikka Tarkastellaan ensimmäisenä esimerkkinä pitkien merkkijonojen vertailua. Ongelma: Ajatellaan, että kaksi n-bittistä (n 1) tiedostoa x ja y sijaitsee eri tietokoneilla. Halutaan
LisätiedotJakso 3 Konekielinen ohjelmointi (TTK-91, KOKSI)
Jakso 3 Konekielinen ohjelmointi (TTK-91, KOKSI) Muuttujat Tietorakenteet Kontrolli Optimointi Tarkistukset 1 Muuttujan X osoite on 230 Muuttujan X arvo on 12 Symbolin X arvo on 230 Tieto ja sen osoite
LisätiedotAlgoritmit 1. Luento 4 Ke Timo Männikkö
Algoritmit 1 Luento 4 Ke 18.1.2017 Timo Männikkö Luento 4 Tietorakenteet Pino Pinon toteutus Jono Jonon toteutus Lista Listaoperaatiot Algoritmit 1 Kevät 2017 Luento 4 Ke 18.1.2017 2/29 Pino Pino, stack,
LisätiedotLuento 3 (verkkoluento 3) Ttk-91 konekielinen ohjelmointi. Ohjelman esitysmuoto Konekielinen ohjelmointi ttk-91:llä (Titokone, TitoTrainer)
Luento 3 (verkkoluento 3) Ttk-91 konekielinen ohjelmointi Ohjelman esitysmuoto Konekielinen ohjelmointi ttk-91:llä (Titokone, TitoTrainer) 1 Suorituksenaikainen suorittimen ja muistin sisältö muisti suoritin
Lisätiedot811312A Tietorakenteet ja algoritmit 2015-2016. I Johdanto
811312A Tietorakenteet ja algoritmit 2015-2016 I Johdanto Sisältö 1. Algoritmeista ja tietorakenteista 2. Algoritmien analyysistä 811312A TRA, Johdanto 2 I.1. Algoritmeista ja tietorakenteista I.1.1. Algoritmien
LisätiedotANSI/IEEE Std
Digitaalitekniikan matematiikka Luku 9 Sivu 1 (26) Lukujärjestelmät ja lukujen esittäminen ANSI/IEEE Std 754-2008 0 1 0 1 1 0 0 0 B = Σ B i 2 i Digitaalitekniikan matematiikka Luku 9 Sivu 2 (26) Johdanto
LisätiedotMäärittelydokumentti
Määrittelydokumentti Aineopintojen harjoitustyö: Tietorakenteet ja algoritmit (alkukesä) Sami Korhonen 014021868 sami.korhonen@helsinki. Tietojenkäsittelytieteen laitos Helsingin yliopisto 23. kesäkuuta
LisätiedotTeemun juustokakku Rekisterien, välimuistin, muistin, levymuistin ja magneettinauhan nopeudet suhteutettuna juuston hakuaikaan juustokakkua tehdessä?
Tietokonejärjestelmän rakenne ttk-91 ja sillä ohjelmointi 27.1.2011 Tietokone suoritin (CPU) väylä tai väylät laiteohjaimet muiden koneiden kanssa Ethernet, modeemi,... laitteiden kanssa Levy, DVD, CD,
LisätiedotSisällys. 17. Ohjelmoinnin tekniikkaa. Aritmetiikkaa toisin merkiten. for-lause lyhemmin
Sisällys 17. Ohjelmoinnin tekniikkaa for-lause lyhemmin. Vaihtoehtoisia merkintöjä aritmeettisille lauseille. Useiden muuttujien esittely ja alustaminen yhdellä lauseella. if-else-lause vaihtoehtoisesti
Lisätiedot811120P Diskreetit rakenteet
811120P Diskreetit rakenteet 2016-2017 2. Lukujen esittäminen ja aritmetiikka 2.1 Kantajärjestelmät ja lukujen esittäminen Käytettävät lukujoukot: Luonnolliset luvut IN = {0,1,2,3,... } Positiiviset kokonaisluvut
LisätiedotSisältö. 2. Taulukot. Yleistä. Yleistä
Sisältö 2. Taulukot Yleistä. Esittely ja luominen. Alkioiden käsittely. Kaksiulotteinen taulukko. Taulukko operaation parametrina. Taulukko ja HelloWorld-ohjelma. Taulukko paluuarvona. 2.1 2.2 Yleistä
Lisätiedot