3 minute read

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개다.

Tags:

Categories: ,

Updated: