Scheduling 관련 문서나 논문을 읽다보면, Coarse-grained 와 Fine-grained 용어가 나오는 경우가 있다. 사전적 의미만 가지고는 그 의미 유추가 힘들어서, 한번 정리를 해보았다. Multithreading 에서의 Coarse-grained 와 Fine-grained 개념에 대해 알아본다.
Multithreaded processors 개념은 여러개의 thread를 동시에 실행시키는 것이다. 이렇게 하면, latency를 숨길 수 있다. latency를 숨기다는 것이 어떤 의미인지, 예를 들어살펴보자.
Thread A의 동작을 상상해보자. Thread A는 정해진 동작을 수행, 어느 순간 cache miss가 발생할 것이다. 이때, 메모리에 데이터를 로드하는 동작을 수행하게 된다. core level 에서는 DRAM으로 data를 요청하고, 대기하게 된다. DRAM에 data를 로드하는 데까지, 상당 시간이 흘러갈 것이다. 이렇게 long-latency가 포함된 동작이 실행된 경우, 그 latency 동안에 다른 thread를 실행할 수 있다. DRAM에는 data 로드를 요청해두고, processor는 해당 작업이 완료될때까지, Thread B를 실행하는 것이다. Thread B를 수행하다가 다시 Thread A로 돌아가면 DRAM 로드가 완료되고 작업을 이어서 할 수 있을 것이다. 이렇게 Thread A->B를 이동하면, latency가 발생해도, processor 입장에서는 동작을 계속 할 수 있다.
thread의 실행을 교체하는 것을(Thread A 실행 -> Thread B 실행) context switching 이라고 한다. 이 context switching 자체도 다소 큰 overhead 가 발생하므로, context swtiching을 언제/어떻게 수행할 것인지도 큰 설계 고려사항이다.
Multithread Models 는 크게 2가지 방법으로 분류한다.
1. Coarse-grained Multithreading (block interleaving)
사전적 의미로 coarse는 "(피부나 천이) 거친, (알갱이?올 등이) 굵은"의 뜻을 가지고 있다. Multithread Models 에서의 coarse 의 의미는 촘촘하지 못한 것을 의미하며, Multithreading 동작이 큰 단위로 발생한다는 것을 암시한다. Coarse-grained Multithreading은 위에서 언급했던 memory stall 등과 같은 long latency 동작이 발생할때까지, 동작 중인 thread를 계속 동작시키는 것이다. long latency 이벤트가 발생하면, context switching 이 수행한다. 따라서, Coarse-grained Multithreading은 context switching이 상대적으로 적게 발생한다.
2. Fine-grained Multithreading (cycle-by-cycle interleaving)
사전적 의미로 fine은 "(알갱이가) 고운"으로 사용되었다. Multithreading 동작이 촘촘하게(작은 단위)로 발생한다는 것을 암시한다. Fine-grained Multithreading은 thread switching이 cycle 단위로 발생한다. cycle 단위로, 동작할 thread를 변경하는 것이다. cycle 단위로 switching이 수행되면 매우 큰 switching overhead가 당연해보인다. 따라서, Fine-grained Multithreading 방식은 thread swithching 동작을 수행할 hardware logic 이 포함된다. 이 logic으로 switching overhead를 매우 작게 만들어 수행한다. processor 내에 충분한 수의 레지스터를 설계하여, context switching이 수행될때, 레지스터에 대한 save/restore 동작이 필요없게 만드는 식이다.