[컴퓨터 구조 - 하드웨어 - 프로세서]
참고한 자료:
Computer Organization and Desgin 5th edition
,
Digital Design with an Introduction to the Verilog HDL 5th edition
Input
유닛은 Memory
에 데이터를 쓰고, Output
유닛은 Memory
에서 데이터를 읽는다.
Datapath
는 데이터를 세이브/로드하는 역할 및 연산 수행을 담당하고, Control
유닛은 컴퓨터 내부의 명령을 해석 및 실행하는 역할로 명령에에 따라 데이터패스, 메모리, 입출력의 동작을 결정하는 신호를 보낸다.
이 때, Control
유닛과 Datapath
유닛을 합쳐 Processor
라고 한다.
Processor
는 CPU를 보조하며 연산/제어의 핵심부를 담당하는데, 시간이 흐름에 따라 Processor
라는 용어가 점차적으로 CPU라는 용어를 대체하여 현재는 동일한 의미로 통한다고 볼 수 있다.
CPU
는 중앙 처리 장치로, 메모리에 저장된 명령어를 읽어들이고, 읽어들인 명령어에 대한 interpret 와 implement를 담당한다.
진부한 표현이지만, CPU는 결국 컴퓨터에 있어 두뇌 역할을 하는 장치이다.
ALU
는 산술 연산 (덧셈, 뺄셈, 곱셈, 나눗셈)과 논리 연산 (AND, OR, NOT, XOR) 을 수행하는 연산 장치이다.
CU
는 산술 연산 (덧셈, 뺄셈, 곱셈, 나눗셈)과 논리 연산 (AND, OR, NOT) 을 수행하는 연산 장치이다.
Register
는, clock을 공유하는 n개의 Flipflop으로 구성되어 n개의 비트를 통해 binary 정보를 저장하는 장치이다.
cf. FlipFlop
전자 회로에서 1bit 정보를 저장하는 기억 소자
Cache
는 CPU와 RAM 메인 메모리 사이 데이터 전동 속도를 높이기 위해 사용되는 고속 저장장치이다.
예시 시나리오에 대해 CPU가 처리하는 과정을 살펴보자. 사용자가 15 + 57을 계산한다고 가정하자.
CPU는 Instruction Cycle을 통해 (Fetch -> Decode -> Execute -> Store)
다음과 같은 단계를 거친다.
위 시나리오에서는 다음과 같은 일련의 명령어 집합을 수행해야 한다.
LOAD 15
ADD 57
STORE RESULT
CPU는 메인 메모리에서 코드 데이터를 읽어오며, 위 instruction들에 대해 PC가 첫 번째 명령어 LOAD 15
를 가리킨다. 해당 명령어를 Instruction Register에 가져오고, PC는 다음 명령어를 처리할 수 있게 증가한다.
Instruction Decoder가 처리할 명령어에 대해 해석 과정을 거친다. 명령어 LOAD 15
에 대해, Operator인 LOAD는 적재 명령어임을 해석하고, Operand인 15는 메모리에서 가져와 Register에 저장한다.
앞서 decode된 내용을 바탕으로 작업을 수행한다.
LOAD 15
에 경우, decode된 내용은 적재, 15이므로 accumulator에 15를 저장한다.
PC가 앞선 fetch과정에서 증가했기에, 두 번째 명령어인 ADD 57
명령어를 가리킨다. 이 명령어를 가져오고, PC는 다시 증가한다.
명령어 ADD 57
에 대해, Operator인 ADD 덧셈 산술 연산 명령어임을 해석하고, Operand인 57 메모리에서 가져와 Register에 저장한다.
ADD 57
의 경우, decode된 내용은 덧셈 산술 연산, 57이므로 accumulator에 저장된 값 (15)에 메모리에서 가져온 피연산자 57에 대한 산술 연산을 처리하여 결과값(72)을 다시 accumulator에 저장한다.
accumulator에 저장된 계산 결과를 메모리 위치에 저장한다. 앞서서 from memory to register의 방향으로 처리한 load 적재와 반대로, store 저장은 register에서 memory로 데이터를 보낸다.
이러한 일련의 과정 속에서, 앞서 설명했듯이
레지스터는 메모리로부터 데이터를 가져와 저장하고,
ALU는 산술/논리 연산을 수행하며
CU는 instruction의 실행 순서를 관리한다.
양자 모두 CPU 내부에서 데이터를 저장하는 메모리 역할을 하지만 그 용도와 작동 방식은 다르다.
register의 경우,
cache의 경우,
위의 예시 시나리오에서 간단한 명령어 집합을 처리했지만, CPU는 위 예시 이외에도 다양한 복잡한 명령어를 처리해야 한다. 모든 명령어가 같은 길이의 클럭 사이클을 가지게 된다면 단일 사이클 설계만으로 처리가 수월하겠지만, 부동소수점 유닛을 포함한 복잡한 명령어 집합에 대해서는 그렇지 못하다.
이러한 단일 사이클 구현은 Common Case Fast
라는 설계 원칙에 위반되기 때문에, 여러 명령어가 중첩되어 실행되는 구현 기술인 Pipelining
을 보편적으로 사용한다.
ex. 앞선 시나리오에서 예를 들면,
단일 사이클이라면,
첫 번째 명령어 LOAD 15
의 처리 사이클을 마친 이후
두 번째 명령어 ADD 57
에 대해 수행될 것이다.
파이프라이닝을 적용하면,
첫 번째 명령어 LOAD 15
의 Decoding 이후,
LOAD 15
의 Execution을 처리하면서 동시에 ADD 57
을 Decoding하고, 다음 명령어를 가져올 수 있다.
정리하자면, Pipelining은 적용하면
cycle time 자체를 단축시키지는 못하나
throughput을 증가시킴으로 병령 처리를 통해 전체 명령어 집합 처리 시간을 단축시킨다.
우리는 종종 성능에 대해 추상적으로 성능 최적화, 성능을 효율적으로 한다는 등 너무 추상적으로 성능에 대해 잘못 표현하는 실수를 저지르곤 한다. 위와 같은 말은 성능에 대해 너무나 부족한 정보를 가진 말이기 때문에 언제나 performance와 관련해서는 엄밀한 척도에 대한 정의가 필요하다.
개개인 유저 입장에서는 Response Time
응답시간으로서의 요청을 보낸 시점부터 응답이 도착하기까지 걸리는 시간, 혹은 Execution Time
실행시간으로서 프로세스 관점에서 전체 작업 개시에서 종료까지의 시간이 성능 측정 척도일 것이다.
반면, 시스템 관리자에게는 단위 시간당 완료하는 태스크의 수와 관련한 Bandwidth
나 Throughput
이 중요할 것이다.
클록 사이클은 하나의 클록 주기를 의미하며, 시스템의 클록이 한 번 완전히 변하는 시간이다.
클록 사이클은 CPU나 다른 디지털 시스템에서 동작을 정기적으로 동기화하는 기준이 된다.
간단히, positive edge에서 다음 positive edge까지 걸린 시간이다.
클록 속도는 시스템 클록의 주파수로, 1초 동안 클록 사이클이 얼마나 발생하는지를 나타냅니다. 측정 단위로 Hz(헤르츠)가 사용되며 초당 발생하는 클록 사이클 수를 의미한다.
(clock rate는 cct의 역수 관계)
단위 시간 동안의 positive edges의 수를 의미한다.
cf. Positive Edge
Positive Edge
는 clock signal이 낮은 상태에서 높은 상태로 변화할 때 발생하는 ( 0 -> 1) 상승 엣지 순간을 의미한다.예를 들어, flipflop이나 register 같은 순차 회로는 positive edge에서 데이터를 읽거나 저장한다.
CPU 시간
= Instruction 개수
X CPI (Clock cycles per Instruction)
X Clock Cycle Time
cf. cpu와 관련하여 알면 좋을 CA 쪽 지식들
ISA, 명령어 집합 구조란 CPU가 이해하고 실행하는 명령어 집합 및 인터페이스를 정의한 추상적 모델이다.
어셈블리 기계어 단의 low level의 하드웨어와
high level단의 응용의 소프트웨어 간의 인터페이스를 정의하는 명령어 집합이다.
종류: Intel사의 x86, AMD사의 AMD64(x86-x64), ARM사의 ARM ISA, MIPS, AVR, etc.
x86
Intel 사가 설계한 x86 은 복잡한 명령어 셋으로 높은 성능과 다양한 sw를 지원하지만 높은 전력 소모가 발열에 문제점을 가지고 있다. 명령어 집합으로는 CISC를 택했으며, 16bit / 32bit을 사용한다.
MIPS
MIPS는 RISC 기반의 ISA로 단순한 명령어 셋과 고효율적인 설계로 전력 소모와 발열이 상대적으로 적은 장점을 가졌기에 embedded, IoT, 네트워크 장치 등에 널리 사용된다.
CISC는 복잡하고 다양한 명령어를 포함한 CPU 설계 철학으로, 고급 명령어를 제공하며 SW에 가깝게 high level단으로 프로그래머의 편의성에 초점을 둔 설계 방식이다.
설계 방식에서의 가장 큰 특징은 복잡한 명령어의 개수가 많다는 점이다. 이 특징이 가져오는 장단점은 다음과 같다.
RISC는 간소화된 명령어 집합을 포함한 CPU 설계 원칙으로, HW에 가깝게 Low level 단으로 고효율 고성능의 하드웨어 설계에 초점을 둔 설계 방식이다.
다음과 같은 장단점을 가진다.