[MP] Week05
Review
- 메모리 연산은 로드와 스토어 두 개 있다.
- ld 2x 4(x1)
- load instruction은 4가지가 있다.
- ld x3 4(x1)
- lw x2 16(x5)
- lh x6 0(x2)
- lb x6 0(x2)
- 변수의 세 가지 속성: 크기, 식별자(주소),
- ld ->
- 3x -> register
- base reggster: 메모리 주소를 가지고 있는 register, offset과 base register의 값을 더한다.
- base register를 사용하는 이유는 배열과 같은 자료형을 쉽게 처리할 수 있다.
- sd x3 4(x1): x3는 source고, 4(x1)이 목적지다.
- sw x2 16(x5) / sh x6 0(x2)
- load를 할 때는 주소 안에 담긴 값을 사용해야 한다.(indirection)
Register Spill
- 컴파일러가 잘해야 하는 것이 register와 메모리를 mapping하는 것이다.
- 그래서 컴파일러는 변수의 수명 lifetime을 본다.
- 스터디룸을 사용하고 싶은 사람이 굉장히 많다고 하자. 사용하고자 하는 시간이 서로 겹치지 않는다면 아무 문제가 되지 않는다.
- b[i] = a[i] + a[i + 1]
- 인접한 노드에 같은 색을 칠하지 않는다. 알고리즘에서..
- 조합이 많아지는 문제에 대해서 경우의 수가 기하급수적으로 증가하기 때문에 컴퓨터가 잘 못 풀 수 있다.
- 세계지도에서 인접한 국가에 다른 색을 칠하려면 몇 개의 색이 필요한가?
- 가장 적은 경우를 찾아내는 알고리즘을 찾기 어렵다.
- 가장 적은 수의 레지스터를 만들어서 레지스터가 넘치지 않게 하는 것은 컴파일이 하는 일 중 어려운 편이다.
- 메모리에 임시로 백업을 해둔다. 어디에 백업을 하는지에 대한 이야기는 하지 말자.
- load와 store는 비싼 instruction이라 부담이 많이 간다.
- risc의 모든 연산은 레지스터 안에서 이루어진다.
- instruction 하나 수행하는 데 한 클락 사이클이 필요하다고 한다면(실제로 그렇다.), 메모리 한 번 나갈 때 수 백 사이클을 손해본다. 이 동안 프로세서를 아무것도 안 하고 기다려야 한다.
- 책 10페이지 읽을 때마다 무엇이 필요할 때마다 도서관에 가서 책을 가져오는 것과 같다.
- 새로운 책을 그때마다 가져오는 것이 아니라 위치가 비슷하면 일단 한 번에 가져오는 것이다.
- 그래서 나온 것이 cache라는 시스템이다.(5장)
- cache는 한 번에 강의실에 가져와서 쌓아두는 개념이다. 그리고 필요할 때 도서관을 가지 않고 강의실에 가져와 쌓아둔 책을 먼저 보는 것이다. 매번 프로세서 밖으로 나가는 것을 막기 위함이다.
- 그렇다면 모든 책을 강의실에 가져올 수는 없다. 그렇기 때문에 언젠가는 도서관에 가야 하는데 그에 해당하는 명령어가 load와 store다.
Sign Extension
- register의 크기는 8바이트(64bits)
- lw라는 것은
- default가 signed다.
- MSB를 음수면 1 양수면 0
- 1111 1111(2의 보수) = -1
- 1111 1111 = 2^8 - 1 = 255 -> 어렇게 보지 않는다는 것이다.
- 모든 컴퓨터는 2의 보수를 사용하여 음수를 표현한다.
- 8byte보다 작은 값을 가져올 때는 lw, lh(load half word)는 sign으로 가져온다.
- 빈자리를 0으로 채울까 1로 채울까?
- signed int a[10]
- unsigned (int) a[10] -> 1111 1111을 511로 본다. 이때는 빈자리를 0으로 채운다.
- lbu( u -> unsigned ) -> 남는 비트에 0을 넣어라.
- sign extension을 할지 zero extension을 할지 결정한다.
- memory는 byte 연속적이지만 resigter는 4byte 단위다. store에서는 memory는 연속된 공간이기 때문에 extesion할 필요가 없다.
- load는 extension이 있지만 store는 extension이 없다.
- 8진수로 표현된 -2를 16진수로 쓰려할 때 앞에 다 0을 써버리면 양수가 되고 맨 앞만 1을 쓰고 나머지 0 쓰고 원래 숫자 쓰면 안 되는 이유는 … 다른 수가 된다.
Representing Instructions
16진수를 2진수로 바꾸는 방법
RISC-V R-format Instructions
- Instruction에서의 field라 한다.
- 왜 역순으로 설정했을까? -> decoding에서 더 효율적이기 때문이다.
- R: Register의 약자다. 32의 비트를 해석하는 방법
- R-format이라는 것을 아는 순간 명령어가 그에 맞는 규칙으로 해석된다. format을 알고서 그것에 대한 decoding을 실행해야 한다.
- 어떤 format인지에 대한 정보를 어떻게 알 수 있을까? -> opcode의 일부가 그 역할을 한다.
- 프로세서는 opcode를 보고 어떤 format인지 판단한다.
RISC-V-format Instructions
- addi는 어디에 들어가야 할까? -> opcode
- addi x5, x3, 48
- addi -> opcode
- x5 -> rd
- x3 -> rs
- 48 -> immediate
- instruction이 32bits로 제한된다.
- 1000번지에서 시작할 때 최고치 이상으로 가야 한다면 상한 주소를 넣어두고 그곳을 임시 베이스 주소로 한다.
- 비트 수 할당의 장단점을 비교해서 다음의 규칙이 생긴 것이다.
- immediate에서 5비트밖에 없다고 해보자. 표현할 수 있는 범위가 줄어든다.
- A[19]
- x1 : 1000
- x2 : 2016
- ld x5 3(x2)
- RISC-V-format Instruction은 왜 이렇게 된 건지 어떤 tradeoff가 있는지 이해하는 것이 중요하다.
- base address에 있는 값으로 가서
- 512까지 저장할 수 있는데 514를 저장하고 싶을 때 다른 곳에 저장한 후에 32를 쓰고
- 2^11 - 1 = 2047
- ㅌ10. 1000
- ㄹ = 4 + A[520]
- lw x5 2080(x10)
- register instruction을 64비트로 하면 어떤 단점이 있을까?
- 이 instruction은 기본적으로 메모리에 있다. 기계어가 메모리에 올라간다. 그렇다면 하나 명령 수행하는 데 가져오는 게 32비트 대신 64비트를 가져와야 한다. 그러면 시간적 손해가 생긴다.
- instruction은 매번 memoey에서 가져와야 한다. 64비트라면 비용이 두 배가 된다.
- immediate field가 12bits인 걸 어떻게 극복할 수 있는지에 대한 설명을 했다.
- 숙제를 내지 않아도 risc-v s-format instruftion에 대한 많은 연습을 해보기 바란다.
RISC-V S-format Instructions
- field가 나뉜 것은 R format과 비슷한다.
- imm이 있다.
- ld x5 … 에서 x5는 destionation, sd x5 ..에서 x5는 source다.
- risc에서는 rs2
- instruction의 개수가 100개 이상이다.
- instruction 17개다.