Thread란?
Thread는 메모리와 레지스터 상태에 대한 명령어 흐름을 나타내며, CPU가 실행하는 기본 단위이다. Thread가 실행 중일 때, 그 상태는 register states로 표현되며 이를 Thread Context라고 부른다. Thread는 프로그램의 병렬 실행을 가능하게 하며, 현대 프로세서 설계에서 중요한 요소이다.
Multithreading이란?
Multithreading은 하나의 프로세서가 여러 Thread Context를 가지는 구조를 말한다. 이를 통해 하나의 프로세서가 여러 작업을 병렬적으로 처리할 수 있다. 이러한 방식은 CPU의 유휴 시간을 줄이고 자원의 활용도를 극대화하여 성능을 향상시킬 수 있다.
Multithreading의 장점
Multithreading은 다양한 장점을 제공한다. 첫째, 지연 시간(Latency)을 줄여 프로세서가 한 작업의 대기 시간 동안 다른 작업을 처리할 수 있다. 둘째, System Throughput을 증가시켜 주어진 시간 동안 처리되는 명령어의 수를 극대화할 수 있다. 마지막으로, 전통적인 프로세스 간 전환에서 발생하는 Context Switch Penalty를 줄여 스레드 간 빠른 전환이 가능하다.
Multithreading의 단점
Multithreading에는 단점도 존재한다. 가장 큰 문제는 하드웨어 비용 증가이다. 각 스레드의 독립성을 유지하기 위해 레지스터, 캐시와 같은 추가적인 리소스가 필요하다. 또한, 단일 스레드 성능이 저하될 수 있다. 이는 리소스를 공유하면서 발생하는 경쟁과 Switching Penalty로 인해 작업의 진행 속도가 느려질 수 있기 때문이다.
Multithreading 종류
Multithreading은 크게 Fine-Grained Multithreading, Coarse-Grained Multithreading, Simultaneous Multithreading (SMT) 세 가지로 나뉜다.
1. Fine-grained MT
Fine-Grained Multithreading은 Cycle마다 스레드 전환이 이루어지는 방식이다. 이 방식은 Pipeline 효율을 높이고 Control/Data Hazard를 줄이며, 전반적인 지연 시간을 감소시킬 수 있다. 각 스레드는 독립적인 Program Counter(PC)와 Register File을 가지고 있어 병렬 처리가 용이하다. 그러나 Cycle마다 전환이 일어나기 때문에 단일 작업의 진행 속도가 느려질 수 있다.
2. Coarse-grained MT
Coarse-Grained Multithreading은 특정 이벤트(예: Cache Miss, 느린 I/O 접근, 부동소수점 연산)로 인해 스레드가 Stall 상태일 때만 전환이 발생하는 방식이다. 이 방식은 Fine-Grained와 비교했을 때 전환 빈도가 낮아 오버헤드가 줄어들지만, 이벤트가 없을 경우에는 Pipeline 활용률이 떨어질 수 있다.
event가 발생하면 기존에 실행하고 있던 thread의 정보는 memory에 내리고 다른 thread의 정보를 가져온다. 때문에 switch시에 오버헤드가 발생할 수 있지만 fine-grained의 경우 thread들에 대한 정보를 모두 들고 있기 때문에 오버헤드가 발생하지 않는다. 이렇듯 fine-grained가 성능 자체는 좋을 순 있지만 thread들을 번갈아가며 실행하므로 작업을 하나씩 하는 유저의 입장에서는 느리다는 느낌을 받을 수 있다.
3. Simultaneous MT (SMT)
Simultaneous Multithreading(SMT)은 한 사이클에 여러 스레드의 명령어를 동시에 Dispatch하는 방식이다. 이 방식은 자원 활용을 극대화하여 효율성을 높이는 데 탁월하다. 그러나 높은 하드웨어 복잡도와 비용이 요구되며, 설계와 최적화가 중요하다.
여기 하나의 예시를 살펴보자.
width가 4인 superscalar가 있을 때 빨간 색이 실행되는 instruction이고 흰 색이 dependency issue로 인해 stall이 난 부분이다. 그렇다면 여기에 Fine-grained MT를 적용해보자.
색깔마다 각각 다른 스레드이고, 여러 스레드를 반복해서 실행한 결과 아까보다 stall이 더 적은 것을 확인 할 수 있다. 하지만 빨간색이 아까보다 오히려 줄어든 것으로 보아 각 스레드의 진행 정도는 오히려 이전 보다 줄었다.
SMT의 경우에는 한 사이클에 여러 개의 스레드들을 실행할 수 있기 때문에 효율이 크게 높아진다.
SMT를 구현하기 위해서는 하드웨어 리소스를 복제하거나 공유해야 한다. 복제는 스레드 간 독립성을 유지하기 위해, 공유는 자원의 효율성을 높이기 위해 필요하다.
복제되는 리소스로는 Program Counter(PC), Register Map, Return Address Stack, Global History Register(GHR) 등이 있다. 이들 리소스는 각 스레드가 독립적으로 실행되도록 설계되며, 특히 GHR은 분기 예측의 정확도를 높이기 위해 스레드별로 독립적으로 유지된다.
공유되는 리소스로는 Register File, Instruction Queue, L1 및 L2 캐시, Translation Lookaside Buffer(TLB), Branch Predictor 등이 있다. 공유 리소스는 하드웨어 자원을 최적화하는 데 필수적이며, 효율적인 스케줄링 및 캐시 관리 정책이 필요하다.
'학교공부 > 컴퓨터구조' 카테고리의 다른 글
[컴퓨터구조] Cache (0) | 2023.06.09 |
---|---|
[컴퓨터 구조] Memory Hierarchy (0) | 2023.06.03 |
[컴퓨터 구조] Handling Dependences (0) | 2023.05.08 |
[컴퓨터 구조] Pipelining (0) | 2023.04.25 |
[컴퓨터 구조] ISA (0) | 2023.04.24 |