11 minute read

  • 프로그램은 위에서 아래로 실행되는데 분기라는 개념이 있기 때문에 다양한 제어가 있을 수 있다.
  • Break는 가장 가까운 분기만을 탈출한다.

Branch Addressing

  • 메모리는 프로세서 밖에 있는 큰 저장 공간이다.
  • 데이터를 사용하는 프로그램도 메모리에 존재한다.
  • Instruction이 메모리에 있기 때문에 결국에 label은 Memory Address다.
  • Address는 몇 비트일까?
  • 32비트 프로세서 대신 64비트 프로세서를 사용하는 주된 이유는 주소에 할당할 공간을 늘리기 위함이다.
  • 32비트인 4GB보다 더 큰 2^64 정도의 공간을 address에 할당할 수 있다.
  • 어떤 컴퓨터에서는 2^48만큼으로 address 할당을 제한하기도 한다.
  • 1TB까지 메모리가 장착된다. 512GB도 많이 사용된다.
  • 32비트 안에 label 크기가 64비트인 것은 말이 안 된다.

Branch Addressing Example

  • Branch Target: 일반적인 흐름이 바뀌는 부분
  • 상대주소로 바꾸어서 그 값을 줄인다.
  • 현재 branch의 instruction을 base address로 잡는다.
  • PC(Program Counter) -relate addressing
  • a register: 현재 수행하는(할) 명령어의 주소를 저장
  • Loop: slli
  • add
  • ld
  • bne x9, x24, Exit -> 4byte 1000번지라 하면
  • addi x22, x22, 1 : 1004번지
  • beq .. : 1008번지
  • Exit : 1012번지 <- 여기로 가고 싶다.
  • 12를 exit 자리에 넣어야 하고 Loop 자리에서 -20를 넣어야 하는데 2로 나눠서 6과 -10을 넣는다.
  • 그 수를 줄일 때 어떤 장점이 있을까?
  • 12비트면 충분히 표현할 수 있지만 instruction의 길이가 4byte이기 때문에 instruction의 주소는 4의 배수단위일 것이다.
  • 그럼 그냥 4로 나누면 안 될까? 만약 그렇다면 2bits를 아껴 다른 곳에서 쓸 수 있다. 그런데 왜 2로 나눌까?
  • RISC5가 4byte instruction만 있는 것이 아니라 2byte instruction이 있기 때문이다.

Why RISC-V

  • c : 16bit 인코딩이 있다. 작은 메모리를 가진다.
  • RISC-V는 2byte instruction을 지원하기 때문에 4로 나누지 않고 2로 나눈다.
  • 만약 2byte instruction이 두 개 들어갔다고 가정하면 왜 2로 나누는지 알 수 있을 것이다.

Branch Addressing_

  • store는 7 + 5 bit로 나뉘어 있다.
  • 아까 6과 -10을 SB format에 나눠서 넣어야 한다.
  • 0 0 0 0 0 0 0 0 0 1 1 0
  • 0 … 01010(=10)
  • 1 … 10101(0과 1을 바꾸고) + 1(1을 더하면) = 1 … 10110 (<-10의 보수)
  • 80023 자리에 왜 63이 있을까?
  • 111111 = 1000000 - 1 : 2^n-1은 다 일이다.
  • 1이 6개 있는 것이다.
  • 가장 중요한 것은 4로 나누지 않고 2로 나눈다는 것이다.
  • Target address = PC + immediate * 2 <- 2를 곱하는 이유
  • slli
  • 64비트 이상을 shift하는 것은 의미가 없기 때문에 앞에 0이 온다.
  • funct3 = 1 / opcode 19
  • pc register는 하드코딩한다. branch address를 알 필요 없다.
  • load나 store할 때 address를 저장하는 방법은 offset를 얻는 것이다.
  • 별도로 명시할 필요가 없다.
  • offset에 2를 곱해서 memory에 저장해야 한다.

RISC-V Encoding Summary

  • Uj-type은 안 배웠으니까 들어가지 않는다.
  • R, I, S, SB에 대한 문제가 출제된다.
  • doubleword로 load나 store할 때 offset이 …
  • 2byte instruction이 있을 수 있기 때문에 2로 나눈다. 그래서 바이트 단위로 복원할 때 2를 곱하는 것이다.
  • 2btype instruction이 있어도 동일한 공식이 유지된다. 1층에 instruction 2개가 들어가기 때문이다.
  • Q. 4byte와 2byte을 어떻게 구별할까 -> 모름
  • 2byte는 흔하게 사용된다.
  • 어디에서 가져와라가에 대한 정보가 PC에 담겨있다.
  • PC는 특별한 Register다.
  • 하드웨어와 소프트웨어 사이에 규약이 필요하다. 2를 곱할 테니 너는 나눠라 등

Introduction

  • 동기화: 약속된 시간에 동작하는 것
  • clock cycle time(주기) -> 다음과 같이 컴퓨터에 제시된다.
  • 12th Gen Intel(R) Core(TM) i7-12700 2.10Ghz
  • 약 0.5ns
  • 보통 clok cycle을 진동수로 이야기한다.
  • 일반적으로 한 사이클에서 한 가지 일을 수행한다. 한 사이클에 한 명령어를 수행하는 것이 보편적이다.
  • 진동수: 단위 시간당 이 만큼의 일을 한다.
  • G = 10^9 = billion = 20억
  • 1초에 20억 개의 명령어를 수행
  • 예를 들어 코어가 8core면 1초에 160억 개의 명령어를 수행한다.
  • 우리는 여러 사이클이 걸리는 simplified version을 본다.
  • 시간이 다 다르다.
  • memory type instruction과 r type instruction을 비롯한 몇 가지 instruction을 공부한다.
  • beq: sb instruction이다.
  • r format이 가장 쉽다.
  • 어떤 것이 가장 오래 시간이 걸릴까? 구현하기 나름이지만 일반적으로 메모리에 접근하는 것은 칩을 나간다.
  • branch 연산은 메모리를 나가지 않는다. address를 가지고 fetch를 하지 않는다.
  • 시간적으로 브랜치가 시간이 가장 오래 걸린다.
  • 일반적으로 load가 store가 오래 걸린다.
  • store는 register에서 읽고 memory에 던진다.
  • load는 rd에 담긴 값을 다시 갱신한다.(?)
  • 브랜치 연산은 무엇일까?

CPU Overview

  • 이 전체가 프로세서다.
  • 프로세서 안에 두 개의 메모리가 있다.
  • instruction architecture
  • PC는 register다.
  • machine code를 저장하는 memory와 data memory가 있는데 둘은 서로 다르다.
  • 프로세서 안에 메모리
  • 프로세서가 메모리 연산을 할 때마다 메모리로 가야 한다면 컴퓨터가 너무 느리다.
  • 5장에서 배울 빠른 캐쉬 메모리로서 DRam에 있는 것의 사본을 가지고 있는 memory(sram):
  • 컴퓨터 구조에서 cache를 배우면 자세히 알 수 있다.
  • instruction cache와 data cache다. instructino은 instrcution cache에 담기고 data의 사본은 data memory에 담긴다.
  • Address에 연결되는 부분을 port라고 한다. input port로 Address가 있고 output port로 Instruction port가 있다.
  • source operand, opcode 등을 따로 뽑아서 입력받는 걸 Register file이라 부른다.
  • 32개 짜리 word를 가지고 있는 작은 메모리다.
  • Register에 들어가는 DATA는 무엇일까?
  • 주어지는 값
  • source operand가 x2, x3에 있다 하면
  • ALU가 가장 뚱뚱하고 복잡하다.
  • data memory에 접근하는 명령어가 ld, store다.
  • base address와 offset을 더해 시작주소를 구하고 register로 간다.
  • Add에서는 4byte가 더해진다. 주소를 +4로 갱신한다.
  • 하드웨어가 이렇게 생겼으니..
  • ALU의 Output이 Data memory를 거치지 않고 가는 화살표가 있다.

Control

  • Register의 data 인풋은 ALU에서 오는 것이 있고 Data memory에서 오는 것이 있다. 둘 중 하나를 선택한다.
  • 멀티플렉서가 필요하다. 원하는 동작을 하기 위해서. 2대1 mux가 필요하다.
  • 마치 기차의 철로가 두 개로 합쳐지는 것과 같다. 내려갔을 때는 input 0, 올라갔을 때는 input 1이 들어가도록 하는 제어와 같다. data path가 있는데 그것들이 하나로 합쳐질 때 제어가 필요하다. 이것을 control이라고 한다. 이것이 효율적이다.
  • 명령어 없이 주어진 일만 하는 프로세서라면 예를 들어 암호를 풀어라처럼 별다른 제어 없이 그것만 하면 된다.
  • 프로세서는 다양한 조합으로 명령어를 표현한다. 이러한 하드웨어이기 때문에 hardwired된 걸 쓸 수 없다.
  • 90년대에는 칩 크기를 줄이는 것이 중요했는데 지금은 저전력이 중요하다. Processing에서 발생하는 열이 Processor의 성능을 저하시킨다. 칩을 많이 넣는 것이 중요한 것도 아니지만 칩을 효율적으로 활용하는 것이 중요해졌다.
  • 서로 다른 명령어들이 적어도 6개의 명령어를 보더라도 6개를 모두 다르게 만드는 것이 아니라 공통된 부분은 일치하게 만들고 mux로 control하는 것이 효율적이다.
  • 지금까지 미리 큰 그림을 본 것이다.

Clocking Methodology

  • clock cycle 안에서 모든 것이 발 맞춰서 움직여야 한다.
  • 스위치의 종류를 and gate, or gate
  • 덧셈기 만드는 거 기억나?
  • 그런 것들이 굉장히 많은 스위치를 gate로 가지고 있는데 한 gate를 통과할 때마다 시간이 걸린다.
  • 500ps를 넘어가는 일이 발생한다.
  • 구현하고자 하는 명령어가 RISC…
  • RISC Architecture를 사용하는 CPU는 명령어 집합을 단순하게 유지하고 파이프라인을 사용하여 명령어를 병렬 처리함으로써 처리 속도를 높이는 것이 목적이다. 이를 위해 Hardware적인 최적화를 통해 지연 시간을 최소화하고 클럭 주기를 빠르게 하여 CPU 성능을 극대화하고 있다.
  • a^b를 계산하는 연산기는 없다. 그냥 a를 b번 곱한다.
  • 가장 느린 명령어 구현 때문에 다른 것들도 그 시간을 맞춰야 한다. 따라서 Cycle time을 줄이는 것이 쉽지 않다.

Instruction Fetch

  • 별도의 하드웨어를 두었다는 것은 병렬이라는 뜻이다.
  • 상수 4를 더해서 PC의 input port로 들어간다.
  • 그러면 1000 -> 1004 -> 1008…? 이렇게 되는 것인가?

Sequential Elements

  • 데이터의 흐름은 clock이 조절한다. register가 clock의 입력을 받아서 clock이 뜰 때만 입력을 받는다.
  • postive edge에서 입력값이 반영된다. 중간에 입력값이 들어온다하더라도 다음 postive edge 전까지는 반영되지 않는다.
  • 하드웨어가 0과 1로 바뀌는데 waveform ..
  • 다음 클락 전까지는 1004와 관련된 명령어만이 수행된다.
  • Q. 다음 positive edge가 되기 전까지 1004와 관련된 명령어가 다 수행되지 않을 수 있나?
  • 4btye로 가정한 하드웨어만 본다 우리는

R-Format Instructions

  • decoding 하는 하드웨어가 있어야 하는데 생략되어 있고 다루지 않는다.
  • 위 그림에서는 data 포트가 위에 있었는데 지금 그림에서는 아래에 있다 이런 것에는 의미를 두지 않아도 된다.
  • Read data1은 64bits 짜리다.
  • Register에서 32개의 x0에서 x31까지가 있다.
  • write를 지정하는 건 없다. 하려면 쓸 데이터를 함께 제공해야 한다.(?)
  • 나온 데이터는 그대로 ALU에 연결된다.
  • ALU는 다양한 걸 수행하는 데 4가지를 가지고 있다면 총 2^4 = 16가지 명령을 수행할 수 잇다.

R-Type Instruction (RISC-V)

  • 회색 부분은 무시하고 검정색에 집중하면 방금까지를 다 합친 것이다.
  • 모든 instruction은 명령어를 fetch하는 것은 동일하다.
  • instruction 자체에 피연산자가 있는 것으로 addi가 있다.
  • 파란색이 제어신호다.
  • 입력이 왔을 때 신호를 주어야 계산을 수행할까?
  • full carry에서 …
  • 조합회로는 입력이 들어오면 무조건 입력에 의한 결과가 나온다.
  • add 연산은 조합회로다. 즉 그 결과가 바로 나온다.
  • 시간을 복잡하면 동작 주파수가 낮다. (주기가 기니까.)
  • 복잡한 조합회로다.
  • Zero라는 control signal 입력이 아닌다. …
  • ALU는 rd를 관리하는 register로 가야 한다.
  • address를 받아본다. pc 값이 address를 가지고 있다.
  • 써 있는 위치가 다 그 위치다.
  • x20 : 111, x21 : 22가 들어 있다고 가정하자. 시간이 한참 지나야 333이 나올 텐데 cycle time을 그 후로 해야 한다.
  • 한 명령어가 한 사이클 안에서 다 수행되어야 한다.
  • R format이 가장 빠르고 가장 느린 것은 load다.
  • Cycle time은 가장 느린 명령어가 수행되는 데 걸리는 시간보다 길게 설정되어야 한다.
  • MIPS를 넣어놓은 이유는 비교하면서 보라는 것이다. 시험에 내지는 않지만 봐라
  • MIPS에서 파생된 RISC-V와 서로 비슷하다.

HW 02

  • 하는 것은 컴파일을 하는 법을 배워서 수행하는 것이다.
  • 실행해보는 것이 아니다.
  • 코드만 보기 위함이다.
  • os에 관계 없이 사용하기 위해 docker를 사용한다.
  • cross compiler를 하는 이유는 risc-v에서 사용하는 machine code를 compile하기 위해서
  • 스마트폰에서 돌아가는 코드를 컴파일하기 위해
  • target processor와 compile porcessor가 다를 때 cross processor라고 한다.
  • C코드를 주고 RISC-V를 보는 것이다.
  • 손으로 작성한 코드를 컴파일러가 어떻게 뱉는지를 볼 것이다.
  • 갈 코드까지만 얻어냈다.
  • compiler는 gcc(open source code)다 gcc를 쓰면 된다.
  • cross compile이기 때문에 riscv64…………뒤에 쭉 써야 한다.
  • native compiler가 아니라 cross compiler이기 때문에
  • 리눅스 환경에서도 쓴다.
  • 도커 이미지를 만들어야 한다.

모르는 것

  • Branch: 조건 분기나 루프 등 프로그램의 제어 흐름을 변경하는 명령어
  • Branch Addressing에서 rs1, rs2, rd가 뭘까? 피연산자일까?
  • add x9, x20, x21 -> rd: x9 / rs1: x20 / rs2: x21
  • 여기서 x는 무슨 의미일까?
  • Branch Addressing에서 순서가 왜 뒤죽박죽일까?
  • Q. What relationship do MIPS and RISC-V have?
  • A. MIPS와 RISC-V는 모두 RISC(Reduced Instruction Set Computer) arthitecture를 사용하는 CPU design이다. MIPS는 MIPS Technologies에서 개발한 RISC 아키텍처입니다. 초기에는 고성능 컴퓨팅을 위한 아키텍처로 개발되었지만, 이후에는 임베디드 시스템, 네트워크 장비, 멀티미디어 장비 및 게임 콘솔에서 널리 사용되었습니다. MIPS 아키텍처는 선형적인 명령어 집합과 고성능의 분기 예측 기술로 유명합니다. 반면에, RISC-V는 UC Berkeley에서 개발한 오픈 소스 RISC 아키텍처입니다. MIPS와 유사한 목적으로 개발되었지만, 오픈 소스로 개발된 RISC-V는 라이선스 비용을 지불하지 않아도 무료로 사용할 수 있다는 장점이 있습니다. RISC-V는 적은 명령어 세트를 사용하여 하드웨어 구현이 단순하며, 성능과 에너지 효율성도 높습니다. 따라서, MIPS와 RISC-V는 모두 RISC 아키텍처를 사용하지만, MIPS는 상용 라이선스 아키텍처이고, RISC-V는 오픈 소스 아키텍처입니다.
  • Q. How may bits do Processor use?
  • A. 현재 most process use 64bits based architecture. 64bits architecture를 사용하면 한 번에 처리할 수 있는 데이터의 양이 많아지므로 높은 처리 성능을 제공할 수 있다. 또한 memory address apace도 더 크게 지원할 수 있어서 더 많은 메모리를 사용할 수 있다. 예전에서 32bits architecture를 기반으로 하는 프로세서가 많이 사용되었고 일부 임베디드 시스템에서는 아직도 8bits나 16bits architecture를 사용하는 경우도 있다. 이는 처리 속도나 memory 요구사항 등에 따라 architecture를 선택하기 때문이다.
  • Q. What meaning do rs1 have?
  • A. rs1은 RISC-V architecture에서 사용되는 용오 중 하나로 레지스터 파일에서 첫 번째 source register를 나타낸다. RISC-V에서는 instruction format을 통해 해당 명령어가 어떤 레지스터들을 사용하는지 명시하고 이때 rs1 필드는 첫 번째 source register를 지정하는 데 사용된다.
  • Q. How do i pronounce V in RISC-V?
  • A. not Five, Five-vee. This is for representing that RISC-V is derived from RISC-FIVE
  • Q. What instruction do use SB format?
  • A. beq와 bne와 같은 조건 분기 명령어와 메모리 저장 명령어
  • Q. What do x mean in the RISC-V?
  • A. RISC-V assembly language에서 x는 register를 나타내는 prefix이다. RISC-V에서는 32개의 정수 register와 32개의 부동 소수점 register를 지원하며 각각 0~31까지의 번호를 가지고 있다.
  • Q. How many bits is assigned in immediate in sb format of RISC-V?
  • A. In RISC-V’s sb (store byte) format, the immediate field is 12 bits wide. It is used to store the 12-bit offset of the target address relative to the address of the instruction, allowing for branching within a range of -2048 to 2046 bytes.
  • Q. SB format은 몇 비트야?
  • A. RISC-V의 sb 형식은 총 16비트(2바이트)다. 이 16bits는 immediate field(12bits) + rs1 field(5bits) + func3 field(3bits) + opcode field(6bits)
  • Q. opcode는 무엇을 나타낼까?
  • Q. 자바를 컴파일하면 C와 동일한 코드가 나올까?
  • A. C language and Java use another assembly language. C language는 compiler가 C 코드를 해당 플랫폼의 machine code로 번역하게 되며 이 machine code는 해당 CPU architecture에 종속된다. 따라서 C language는 다양한 CPU architecture를 지원하는 다양한 assembly language가 존재한다. 반면 Java는 Virtual Machine 상에서 동작하는 언어다. Java code는 compiler에 의해 bytecode라는 중간 언어로 변환되며 이후 Virtual machine에서 실행된다. 이러한 구조로 인해 Java는 CPU architecture에 종속되지 않으며 동일한 bytecode를 다양한 플랫폼에서 실행할 수 있다. 따라서 Java는 CPU architecture에 상관 없이 공통된 assembly language를 사용하지 않는다.
  • Q. M1 Macbook Air의 사양
  • A. Total number of cores = 8 / Memory = 8GB
  • Q. Central Processing Unit에 있는 두 메모리의 이름이 뭘까?
  • A. 1. Cache Memory: Cache memory는 CPU Core 내부에 위치한 작고 빠른 memory로 CPU Core가 자주 사용되는 Data나 Instruction을 저장한다. Cache Memory는 주 메모리(RAM)보다 훨씬 빠르기 때문에 CPU가 데이터를 읽고 쓰는 데 소요되는 시간을 줄여 전체 시스템 성능을 향상시킨다. 2. Register: 레지스터는 CPU가 작업을 처리할 때 필요한 데이터나 명령어를 일시적으로 저장한다. Register는 CPU Core 내부에 직접 존재하기 때문에 Cache memory보다 더 빠른 속도로 데이터를 처리할 수 있다. Register는 Cpu 내부에서도 여러 개의 Register가 존재하며 각각의 register는 특정한 용도로 사용된다. 예를 들어 산술 논리 연산을 수행하는 register와 주소 값을 저장하는 register가 있다.
  • Q. Main Memory는 뭘까?
  • A. Main memory(주 메모리): 컴퓨터 시스템 전체어서 사용되는 대규모 메모리로 프로그램 코드 및 데이터 운영체제 등이 저장된다. CPU는 Main memory에서 data를 읽고 쓰며 cache memory에 있는 data나 instruction이 main memory와 일치하지 않을 경우 main memory에서 새로운 데이터를 가져와 cache memory에 업데이트한다.
  • Q. CPU 내부에 있는 메모리와 CPU 외부에 있는 Memory는 어떤 점이 다를까?
  • A. CPU 밖에 있는 Memory는 Secondary Storage(보조기억장치)로 불리며 주로 Hard Disk Drive(하드디스크)나 Solid State Drive(SSD)와 같은 기기에서 사용된다. 다음과 같은 차이점이 있다. 1. 접근 속도: CPU 내부의 Cache Memory는 CPU Core에 가까이 위치하기 때문에 매우 빠른 접근이 가능하지만 CPU 밖에 있는 Memory는 상대적으로 접근 속도가 느리다. 2. 용량: CPU 내부의 Cache Memory는 CPU Core와 직접 연결되어 있기 때문에 수 MB 이내의 매우 작은 용량을 가진다. 반면 CPU 밖에 있는 메모리는 대개 GB 혹은 TB 단위로 용량이 크다. 가격: CPU 내부의 Cache Memory는 비싸고 용량이 작기 때문에 주 메모리나 보조기억장치에 비해 비용이 더 비싸다.
  • Q. Fetch가 뭘까?
  • A. Fetch는 컴퓨터에서 명령어를 가져오는 과정을 말한다. CPU가 명령어를 수행하기 위해서는 Memory에서 해당 명령어를 가져와야 한다. 이때 CPU는 Memory 주소를 참조하여 해당 주소에 있는 명령어를 가져오는 과정을 Fetch라고 한다. Fetvch는 컴퓨터의 명령어 사이클 중 첫 번째 단계로 CPU가 Memory에서 명령어를 가져와 다음 단계인 Decode 단계에서 명령어를 해독하는 데 사용된다. 모든 명령어가 Fetch 단계에서 동일하게 수행되지만 다른 단계에서 명령어가 어떻게 처리되는지에 따라 명령어의 수행 시간이 방식이 다를 수 있다.

Tags:

Categories: ,

Updated: