TDT4160: Datamaskiner og digitalteknikk
# Chapter 1
## Von Neumann arcitecture
A von Neumann architecture machine, designed by physicist and mathematician John von Neumann (1903–1957) is a theoretical design for a stored program computer that serves as the basis for almost all modern computers. A von Neumann machine consists of a central processor with an arithmetic/logic unit and a control unit, a memory, mass storage, and input and output.

## Stored program computer
A stored-program computer is a computer that stores program instructions in electronic memory. This contrasts with machines where the program instructions are stored on plugboards or similar mechanisms.
Often the definition is extended with the requirement that the treatment of programs and data in memory be interchangeable or uniform.
A computer with a von Neumann architecture stores program data and instruction data in the same memory; a computer with a Harvard architecture has separate memories for storing program and data. Both are stored-program designs.
## Moore's law
Moore's law is the observation that the number of transistors in a dense integrated circuit doubles about every two years. The observation is named after Gordon Moore, the co-founder of Fairchild Semiconductor and Intel, whose 1965 paper described a doubling every year in the number of components per integrated circuit,and projected this rate of growth would continue for at least another decade. In 1975, looking forward to the next decade, he revised the forecast to doubling every two years. The period is often quoted as 18 months because of a prediction by Intel executive David House (being a combination of the effect of more transistors and the transistors being faster)

# Chapter 2
## Parallelism
Computer architects are constantly striving to improve performance of the machines they design. Parallelism comes in two general form, namely, instruction-level parallism and processor-level parallelism. In the former, parallism is exploited within individual instructions to get more instructions/sec out of the machine. In the latter, multiple CPUs work together on the same porbelm. Each approach has its own merits.
### Instruction level parallelism (ILP)
Instruction-level parallelism (ILP) is a measure of how many of the instructions in a computer program can be executed simultaneously.
__Pipelining__: Does fetching, decoding, and execution on top of eachother. First the computer fetches data, then while that data it's getting decoded, fetch the 2nd data, whiel the first data is being executed, the 2nd data is being decoded, and the 3rd data is being fetched.


__Superscalar Architectures__: The use of multiple pipelines.
### Processor-level parallelism
Designing computers with multiple CPUs in order to increase computer performance. Parallel computing works by dividing larger problems into smaller problems which are then solved at the same time. __SIMD__ and __MIMD__ are two different parallel computing architectures. They both perform similar basic functions, however they differ both practically and technically.
__Single Instruction stream Multiple Data stream__ or __SIMD processor__ consists of a large number of identical processors that perform the same sequence of instructions on different sets of data.
__Multiple Instruction stream Multiple Data stream__ or __MIMD__ consists of multiple processors that perform multiple actions simultaneously on numerous data pieces. Mathematical calculations such as addition and multiplication is an example. They are performed simultaneously in order to solve a complex math problem with several separate components.
__SIMD__ is typically used for problems requiring lots of computations with processors performing the same operation in parallell. __MIMD__ is frequently used for problems that break down algoritms into separate and independent parts, with each part assigned to a different processor for simultaneous solution.
## Memory Hierarchy
Different types of memories can be arranged in a hierarchy with fastest, smallest, and most expensive at the top, and slowest, largest, and least expensive at the bottom.

## Processor memory gap
Processor performance has improved a lot faster than memory access time.
![Uploading file...]()
## Static and dynamic RAM
Det fins to typer vanlige RAM.
__Statisk RAM__: Fast, Big memorycell (area), uses a lot of power, does not need to be refreshed, simple interface.
__Dynamic RAM__: Not as fast, small memorycell (area),uses less power, needs to be refreshed, complicated interface.
## Cache
Small, fast memory. The most heavily used memory words are kept in the cache. When the CPU needs a word, it first looks in the cache. Only if the word is not there does it go to main memory. If a substantial fraction of the words are in the cache, the average access time can be greatly reduced.
# Chapter 3
## Gates
Computer's concists of a large number of small componetns called gates, which takes in input and produces an output.
Types of gates: NOT, NAND, NOR; AND, OR.
These can be combined, resulting in large complicated circuits, which can do complicated things. Boolean algebra is applied when working which gates.
Everything can be made with combinations of NOR or NAND gates.
# Prosessorer
Prosessesorer kan referer til flere forskjellige styre- og behandlingsenheter i elektroniske maskiner. I all hovedsak prater man om prosessorer i sammenheng med CPU (Central Prosessing Unit) og mikroprosessorer. Slike enheter utgjør kjernen av en moderne datamaskin, som står for all behandling av digitale og analoge signaler som mottas og sendes ut igjen til datamaskinen.
##CPU
En Central Processing Unit (CPU) er "hjernen" til moderne datamaskiner. Hovedfunksjonen til en CPU er å utføre instruksjoner som er gitt av et dataprogram. Disse dataprogrammene er lagret i hovedlageret til CPUen. Dette gjøres ved at instruksjoner hentes inn til hovedprosessoren hvor den inspiserer og så sekvensielt kjører hver instruks. Hver av disse "instruksjonsettene" ligger i en _buss_.
###Buss
En buss er en samling med parallelle ledninger som overfører adresser, rå data og kontrollsignaler. En buss kan eksistere som både en intern og ekstern komponent til en CPU.
###Organisering i CPU
En CPU består av 3 hoveddeler, en aritmetisk logisk enhet (ALU), en rekke registere og en kontrollenhet. prosessoren består også av et hovedminne som inneholder midlertidige resultater fra utregninger gjort i hovedprosessoren.
####ALU
En Aritmetisk logisk enhet er en enhet som gjør utregninger på de inputene i fra et dataregister. Disse registerene ligger sammen med ALUen i det som heter datapath. Operasjoner foregår ved at en instruksjon forteller ALUen at den skal gjøre operasjoner på to registere som ligger i data path. Disse to registeren hentes inn som input hvor det gjøres en operasjon på de, før resultatet blir enten lagret tilbake til registeret, eller at det lagres på minnet til maskinen. ALU kan gjøre grunnleggende aritmetiske operasjoner som addisjon og subtraksjon.
## Array processor
Mange identiske prosessorer som synkront gjør de samme operasjonene på datasett med lik struktur og ulikt innhold. Dette lar maskinen utføre store mengder arbeid parallellt, nyttig f.eks. for å analysere vitenskapelig data.
## Vector processor
Lignende idé som _array processor_. Dataene som skal jobbes med puttes i en vektor og sendes samlet gjennom en prosessor spesialdesignet for å håndtere slike vektorer.
# Hurtigbuffer | Cache
Hurtigbufferet holder informasjon på samme måte som hovedminnet. Det er mye mindre plass til informasjon i hurtigbufferet, men det går også mye raskere å hente informasjon fra det til prosessoren.
##Ord | Word
En benevnelse som benyttes om den naturlige datastørrelsen i en gitt datamaskin. Et ord er ganske enkelt en samling av bit som håndteres samtidig av maskinen. Antallet bit i et ord, kalt ordstørrelsen, er et viktig kjennetegn ved enhver datamaskinarkitektur. Vanlige ordstørrelser i dagens PC-er er 32 og 64 bit. De fleste registrene i en datamaskin har størrelsen til et ord.
## Locality of reference | Lokalitetsprinsippet
Når man ber om ett ord fra hovedminnet, antar man at man kommer til å trenge det ordet flere ganger, og at man også kommer til å trenge noen av naboene. Derfor blir ordet sammen med noen av naboene kopiert til hurtigbufferet.
## Gjennomsnittlig minneaksesstid | mean memory access time
Lokalitetsprinsippet betyr at for å bruke ett ord `k` ganger trenger man ett tregt kall til hovedminnet og deretter `k - 1` raske kall til hurtigbufferet. Ved hjelp av `k` kan man regne seg fram til et gjennomsnitt på hvor raskt prosessoren kan jobbe.
mean access time = c + (1 - h) * m
- `c` er _cache access time_, tiden det tar programmet å hente informasjon fra hurtigbuffer.
- `m` er _memory access time_, tiden det tar å hente informasjon fra hovedminnet.
- `h = (k - 1)/k` er _trefforholdstall_ (_hit ratio_), andelen av referanser som kan hentes fra hurtigbufferet i stedet for hovedminnet. `(1 - h)` er dermed _miss ratio_, andelen som må hentes fra hovedminnet.
# Logiske kretser
## Adderere
||__A__ (inn)||__B__ (inn)||__Sum__ (ut)||__Mente__ (ut)||
||0||0||0||0||
||0||1||1||0||
||1||0||1||0||
||1||1||0||1||
Når man adderer to bits sammen har man de fire mulighetene som tabellen viser. Kretskomponenten som adderer to bits kaller man en __halvadderer__ (_half adder_).
For å addere et ord som består av flere bits, må man ha en __ripple-carry adder__. Det kan man lage ved å lenke sammen flere __fulladderere__.
Fulladdereren består av en halvadderer som adderer de to bitene, og en annen halvadderer som adderer resultatet fra den første halvaddereren med carry-biten fra addisjonen av de forrige bitene. Summen herfra lagres som resultat-bit, og hvis en eller begge av addisjonene i dette steget produserte en carry-bit sendes en cassy-bit videre til neste fulladderer.
# Arkitektur
## Pipelining
### Raw dependence / true dependence
Når ett steg vil lese en verdi som ikke enda er ferdig skrevet at ett annet sted. _RAW, Read After Write_. Da må vi bare vente til verdien er klar før nye steg kan starte.
# Andre ressurser
<http://datagk.stianj.com>