[컴퓨터구조] Advanced Processor Architecture
Instruction-Level Parallelism (ILP)
ILP란 프로세서가 한 번에 여러 개의 instruction을 동시에 실행하는 것을 말한다. 지금까지의 포스트에서 ILP를 위한 대표적 방법인 Pipelining을 살펴봤었다. 더욱 더 ILP를 향상시키기 위해서는 어떻게 해야 할까? 대표적 방법으로 Pipelining 깊이 늘리기와 Multiple issue가 있다.
Superpipelined Processors
먼저, Pipeline stage 개수를 늘리는 방법에 대해 살펴보자. 이렇게 만들어진 프로세서를 Superpipeined Processor라 한다. 이렇게 하면 pipeline의 각 stage별 처리해야 하는 작업의 수가 줄어들기 때문에, clock speed를 늘릴 수 있다.
하지만 pipeline depth를 계속해서 늘린다고 항상 성능이 높아지는 것은 아니다. stage를 하나 추가하면 각 stage를 연결하는 register의 delay도 추가로 발생하기 때문에, 특정 시점부터는 stage를 추가하면 오히려 처리 속도가 줄어들게 된다. 또한 pipeline이 깊어질수록 고려해야 할 hazard가 늘어나며, branch misprediction의 패널티도 증가한다. 따라서 depth를 무한정 늘리는 것은 좋은 디자인이라고 할 수 없다.
Multiple-Issue
한번에 여러 instruction을 pipeline에 진입시키고 동시에 병렬로 실행시키는 것을 Multiple-issue라고 한다.
Static multiple issue는 컴파일러가 동시에 실행할 instruction 여러 개를 묶어서 issue slot에 넣고, 프로세서가 issue slot에 있는 inst를 한번에 실행한다. hazard를 감지해 이를 피하는 것도 컴파일러에게 맡기는 방식이다. Very Long Instruction Word (VLIW) processor가 이러한 방식에 해당한다.
Dynamic multiple issue는 CPU가 직접 instruction stream을 살펴보고, issue할 inst들을 직접 선택하는 방식이다. 이 방식에서는 CPU가 runtime에 직접 hazard를 감지하고 해결한다. 물론 컴파일러가 inst를 재배치하여 성능 향상에 도움을 줄 수는 있다. Superscalar processor가 이러한 방식에 해당한다.
Dynamic multiple issue에서는 CPU가 프로그램의 구조를 파악하고, 데이터 처리 순서를 보존하는 선에서 inst의 순서를 바꾸어 실행하기도 한다. (Out-of-order, OOO라고 한다.) out-of-order execution을 통해, data hazard 등에 의한 stall을 우회할 수 있다. 하지만 issue와 commit(즉, write back)은 in-order로 수행해야 한다. 데이터를 쓰는 순서는 지켜야 data dependency에 의한 문제가 발생하지 않기 때문이다.
Multithreading
Multithreading이란 단일 프로세서 위에서 여러 thread, 즉 여러 control flow를 처리하는 기술이다.
Multiple issue processor에서, multithreading 방식에는 다음 방식들이 있다.
(1) Coarse MT: 한 thread를 실행하다 long stall이 발생하면 thread를 교체
(2) Fine MT: 매 cycle마다 thread를 교체
(3) Simultaneous MT (SMT): 한 cycle 내에서, 복수 thread의 inst를 가져와 동시에 issue
이중 SMT는 실제 사용되는 물리적 프로세서가 하나이지만, 밖에서 보면 복수의 논리적 프로세서가 작동하고 있는 것처럼 보이게 한다. 프로세서 자원을 매우 효율적으로 사용할 수 있게 하는 기술이며, Hyper-threading이라고도 부른다.
Dennard Scaling
잠시 CPU의 발전사를 살펴보자. 2000년대까지는 Moore의 법칙에 따라 CPU의 집적도가 빠르게 늘어났다. 프로세서를 구성하는 트랜지스터들의 크기가 줄어들면 CPU의 Power에는 어떤 영향을 미칠까?
예를 들어 트랜지스터 크기가 k=0.7배로 작아졌다고 생각해 보자.
그러면 칩의 면적(A)은 k²배,
전기용량(C)은 k배,
그리고 delay가 k배 줄어 최대 clock freqency는 (1/k)배가 된다.
이때 칩이 소모하는 전력 P는 대략 CV²f로 구할 수 있으므로, P가 k²배가 됨을 알 수 있다.
따라서, 칩이 소모하는 단위 면적당 전력 P/A는 1로, 변하지 않는다.
즉 칩의 집적도를 올리고 clock frequency를 올리더라도 필요한 전력은 그대로이다.
이 법칙에 기반해, CPU는 집적도를 계속해서 올리며 발전해왔다. 그러나 현대에는 소자 크기를 더 줄이기가 어려워지며, Moore의 법칙과 함께 Dennard Scaling의 시대가 끝나고 있다. 현대 CPU의 발전이 당면한 세 가지 문제는 다음과 같다.
(1) Memory Wall: CPU에 비해 메모리의 성능 향상이 느리다. 캐시 기술에도 한계가 존재한다.
(2) ILP Wall: Control, Data dependancy를 해결하기 위해 점점 더 많은 하드웨어가 필요해지고, ILP를 늘림으로써 얻는 성능 향상이 감소하고 있다.
(3) Power Wall: CPU의 집적도를 늘리고 clock 주파수를 늘릴수록 발열 문제가 증가한다. 특히 칩이 동작할 때 사용되는 Dynamic power는 clock frequency의 세제곱에 비례한다.
이러한 문제들을 극복하기 위해, 단일 프로세서의 성능을 높이는 대신 프로세서를 여러 개의 코어로 구성하는 Multi-core 프로세서가 등장하였다.
Multi-core
Power Wall에 주목해 보자. clock 주파수가 k배 늘어나면, 소모되는 전력은 대략 k³에 비례해서 늘어나고, 그만큼 발열 문제도 심각해진다.
예를 들어, 주파수를 13% 늘려 k=1.13이라면 power는 그 세제곱인 1.73배가 된다.
그런데, clock 주파수를 오히려 13% 낮추는 대신 같은 코어 두 개를 동시에 사용하면 어떨까?
k=0.87이고, power는 그 세제곱인 0.51배가 된다.
이 코어 두 개가 있다고 생각하면, 성능은 원래의 1.73배, 소모 power는 1.02배가 된다.
주파수를 낮춘 코어 2개를 사용함으로써, 성능을 크게 늘리면서도 소모 power는 거의 그대로로 만들 수 있게 되었다. 이것이 멀티코어 컴퓨팅이 CPU의 발열 문제를 극복하는 원리이다.
References
- D. Patterson, J. Hennessy (2021). Computer Organization and Design: RISC-V edition (2nd ed). Morgan Kaufmann.
- Lecture Notes from SNU CSE (김지홍 교수님 강의노트)