T2.1 / T2.2 / T2.3 / T3.1 Instruksjoner Flashcards
Hva er de tre designprinsippene for instruksjonssettdesign?
- Regelmessighet forenkler
- Mindre er raskere
- Gode løsninger krever gode kompromiss
- Instruksjonssett
Vokabulær av kommandoer forstått av en gitt arkitektur, vi bruker RISC-V
Regelmessighet forenkler; Hva er motivasjonen for dette prinsippet?
- Registere har en fast størrelse, og er typisk et begrenset antall.
- Jo flere man har, jo lengre tid tar de å aksessere
- Register
- Et lagringselement
Mindre er raskere; Hva er motivasjonen for dette prinsippet?
- Registre er raskere å aksessere, har høyere gjennomstrømning og bruker mindre energi enn minnet
- Mange programmer har flere variabler enn datamaskiner har register - derfor brukes spilling
- Små konstanter er vanlige, vi har derfor varianter av instruksjoner der en av operandene er en konstant
- Spilling
Å putte mindre brukte variabler, eller de som trengs senere, i minnet istedenfor i registre
- Minne
En tabell med registerverdier - typisk adresserbar
- Minneinstruksjoner / Data overførings instruksjoner
En kommando som overfører data mellom minnet og registre
- Load instruksjoner
En minneinstruksjon som kopierer verdier fra minnet til registre
- Store instruksjoner
En minneinstruksjon som kopierer verdier fra registre til minnet
- Instruksjon
En streng med 1ere og 0ere
- Maskinkode
Den numeriske versjonen av en instruksjon
- Felt
Hvert segment med instruksjoner
Gode løsninger krever gode kompromiss; Hva er motivasjonen for dette prinsippet?
- Man har flere instruksjonsformat, som er likest mulig
- Skiller mellom instruksjonsformat i RISC-V ved å se på verdiene i opcode feltet
- R-type instruksjoner har ikke plass til konstanter og instruksjoner blir enkle å dekode hvis alle instruksjoner er like lange og har samme format –> Løsning: flere instruksjonsformat
- Instruksjoner og Iron Law: Jo likere formatene er, jo enklere blir det for maskinen å dekode instruksjonene… Men blir formatene for begrensende må vi bruke mange instruksjoner til å uttrykke programmet
Hva er instruksjonsformatene i RISC-V?
- R-format: Brukes for aritmetiske og logiske operasjoner med to registre som operander. Inkluderer felter for opcode, to kilde- og ett målregister. F.eks. add
- I-format: Brukes for instruksjoner med én operand fra et register og en umiddelbar verdi (konstant). Typisk for lastinstruksjoner og instruksjoner som legger en konstant til et register. F.eks. addi og lw
- S-format: Brukes for lagringsinstruksjoner, der en verdi i et register lagres til minne. Har felt for baseadresse (fra et register) og offset. F.eks. sw
- B-format: Brukes for betingede hoppinstruksjoner. Inkluderer registre som sammenlignes, samt en forskyvning (offset) for måladressen.
- U-format: Brukes for instruksjoner med store umiddelbare verdier, som last av umiddelbare verdier til register. Typisk for instruksjoner som setter høyere biter i et register.
- J-format: Brukes for ubetingede hoppinstruksjoner, med en stor forskyvning for måladresse.
Hvorfor er instruksjonsformatene i RISC-V definert slik som de er?
- Enkelhet
- Effektivitet: De ulike formatene er optimalisert for spesifikke typer operasjoner, gir raskere behandling og mindre kompleksitet i dekoding av instruksjoner.
- Parallellisering: RISC-V-formatene tillater enklere parallellisering av instruksjoner, noe som bidrar til høyere ytelse i moderne prosessorer.
- Fleksibilitet: Arkitekturen er utformet for å være modulær, slik at nye funksjoner kan legges til ved å definere nye instruksjoner uten å forstyrre eksisterende systemer.
- Redusert kodestørrelse: Ved å bruke umiddelbare verdier og direkte adressering i formatene, kan instruksjoner være mer kompakte, noe som reduserer minnebruken og øker hastigheten på instruksjonslasten.
Hvordan lagres instruksjoner i minnet?
Vi vil at maskinen skal kunne beregne alle beregnbare funksjoner, da trenger vi:
- Aritmetiske instruksjner
- Minneinstruksjoner
- Instruksjoner som tar beslutninger
- Overflyt
Når resultatene av en operasjonen er større enn det som kan representeres i et register
Hvordan utnytter man hvordan instruksjoner lagres i minnet til å implementere kontrollflyt?
Instruksjoner for beslutninger og forgreininger (branch instructions) brukes for å endre programflyten basert på spesifikke verdier. En forgreiningsinstruksjon tester en verdi og, avhengig av testens resultat, kan programmet hente neste instruksjon fra en ny adresse i stedet for den neste linjen. Dette kan for eksempel gjøres med betingede hopp som beq (branch if equal) eller ubetingede hopp som jal (jump and link).
Programtelleren (PC, Program Counter) holder styr på adressen til nåværende instruksjon. PC oppdateres normalt til å peke på neste instruksjon (adresse + 4), men kan i forgreiningsinstruksjoner endres til en annen adresse. Dette gjør at programmet kan hoppe frem til en annen del av koden når spesifikke betingelser er oppfylt.
Basic blocks er sekvenser uten interne forgreininger og med en startadresse. Disse gir struktur til koden mellom forgreninger, og forgreiningene selv sørger for kontrollflyt som endres avhengig av betingelser.
- Forgreining
En instruksjon som tester en verdi og legger til rette for en subsekvent overføring av kontroll til en ny adresse i programmet basert på testens resultat
*Basic block
En sekvens av instruksjoner uten forgreininger, bortsett fra til slutt, og uten forgreiningsmål eller “label”, bortsett fra helt på begynnelsen
- Programteller
Et spesielt register til å holde styr på adressen til den nåværende instruksjonen