CPU 멀티스레딩과 SMT·멀티코어 병렬 실행 구조
Superscalar CPU의 멀티스레딩 방식과 SMT, CMP의 차이, 자원 공유와 스레드 스케줄링의 운영 관점을 정리한다.
2026-08-14 · 최초 발행 2026-01-02
명령어 수준 병렬성만으로는 실행 유닛을 채우기 어렵다
수퍼스칼라 프로세서는 하나의 스레드에서 독립적인 명령어를 찾아 여러 실행 유닛에 배분한다. 그러나 명령어 의존성은 단일 스레드의 Instruction-Level Parallelism(ILP)을 제한한다. 캐시 미스나 메모리 지연으로 파이프라인이 멈추면 실행 유닛도 빈다.
멀티스레딩은 이 빈 시간을 다른 스레드의 작업으로 메우는 방식이다. 하나의 프로세서 칩에서 여러 스레드를 실행하고 실행 유닛을 공유해 Thread-Level Parallelism(TLP)을 만든다. 대기 시간을 숨기고 단위 시간당 처리 명령어 수를 늘리는 것이 핵심이다.
대화형 애플리케이션에서는 포그라운드 작업과 백그라운드 작업을 함께 진행해 응답성을 높일 수 있다. 서버와 데이터베이스처럼 요청이 동시에 들어오는 환경에서는 처리량을 확보하는 수단이 된다.
ILP와 TLP가 채우는 빈자리
수퍼스칼라는 한 스레드 내부의 여러 독립 명령어를 한 클록에 수행한다. 반면 멀티스레딩은 여러 스레드의 명령어를 처리한다. 각 스레드는 Program Counter를 별도로 유지하므로 실행 위치가 분리되며, 서로 다른 스레드의 작업을 활용해 단일 스레드의 의존성 제약을 완화할 수 있다.
두 기법은 경쟁 관계가 아니다. 수퍼스칼라의 넓은 발행 능력과 멀티스레딩의 TLP를 결합하면, 한 스레드에서 채우지 못한 실행 자원을 다른 스레드가 사용할 수 있다. 현대 고성능 프로세서에서 이 조합이 쓰이는 이유다.
스레드를 교체하거나, 함께 발행하거나, 코어를 나눈다
시간에 따라 스레드를 바꾸는 Temporal Multithreading
Temporal multithreading, 또는 Super Threading은 한 번에 하나의 스레드만 파이프라인을 사용한다. 어느 시점에 스레드를 교체하는지에 따라 성격이 갈린다.
Interleaved multithreading(Fine-Grain)은 매 클록 사이클마다 스레드를 바꾼다. 각 사이클에는 한 스레드의 명령어만 발행하며, 스톨이 생기면 다른 스레드로 곧바로 넘어갈 수 있다. 짧은 지연에도 대응해 CPU 유휴 시간을 줄이는 대신, 개별 스레드는 사이클당 1개 명령어만 실행하므로 실행 속도가 낮아지고 컨텍스트 스위칭 오버헤드가 생긴다.
Blocked multithreading(Coarse-Grain)은 한 스레드를 계속 실행하다가 캐시 미스나 메모리 지연처럼 긴 지연이 발생할 때 다른 스레드로 전환한다. 지연이 없다면 스레드를 유지하므로 캐시 지역성과 스위칭 비용 측면에서 유리하다. 반대로 짧은 스톨은 활용하지 못하며, 파이프라인 플러시가 필요할 때는 오버헤드가 발생한다.
여러 스레드를 같은 사이클에 발행하는 SMT
Simultaneous Multithreading(SMT)은 수퍼스칼라 프로세서에서 여러 스레드의 명령어를 한 사이클에 동시에 발행한다. 여러 스레드 컨텍스트를 유지하면서 넓은 발행 능력을 활용하는 방식이며, 특정 파이프라인 스테이지에서도 여러 스레드의 명령어가 함께 처리될 수 있다.
Intel Hyper-Threading은 SMT의 대표적 구현이다. 2개 스레드를 지원하며 논리적 2개 코어처럼 동작하지만, 물리적 1개 코어의 실행 자원을 공유한다. ILP와 TLP를 함께 활용해 높은 처리량과 자원 활용도를 얻을 수 있다.
그 대가로 하드웨어는 복잡해지고, 캐시와 메모리 대역폭을 두고 스레드가 경쟁한다. Spectre, Meltdown 등의 보안 취약점과 스레드 간 정보 유출 가능성, speculative execution 취약점, side-channel 공격도 고려 대상이다.
물리 코어를 집적하는 CMP
Chip-Level Multiprocessing(CMP), 즉 멀티코어는 하나의 칩에 여러 프로세서 코어를 집적한다. 각 코어는 독립적으로 스레드를 실행하며, 실행 유닛과 파이프라인을 물리적으로 분리한다. 각 코어가 완전한 프로세서로 동작하고 캐시도 독립적으로 둘 수 있어 확장성과 성능 안정성에 강점이 있다.
듀얼코어, 쿼드코어, 옥타코어처럼 코어 수만큼 병렬 처리가 가능하다. 다만 칩 면적과 전력 소비가 늘고 비용도 올라간다.
현대 프로세서는 CMP 위에 SMT를 더하기도 한다. 예를 들어 4코어에 각 코어 2-way SMT를 적용하면 논리적 8코어가 된다. Intel Core i7/i9는 다중 코어와 Hyper-Threading을, AMD Ryzen은 다중 코어와 SMT를 결합한다.
하드웨어가 유지해야 하는 스레드 상태
멀티스레딩은 실행 유닛만 공유한다고 끝나지 않는다. 하드웨어는 스레드별 현재 실행 위치를 추적할 수 있어야 한다. 스레드가 전환될 때 Program Counter를 저장하고 복원하려면 다수의 PC 레지스터가 필요하다.
레지스터 구성도 구현 방식에 따라 달라진다. SMT는 레지스터 파일을 공유하고 논리적으로 분할하며, CMP는 코어마다 독립 레지스터 파일을 둔다. 레지스터 리네이밍 역시 이 구조에 맞춰 확장되어야 한다.
어떤 스레드의 명령어를 발행할지는 하드웨어 스케줄러가 결정한다. 우선순위, 공정성, 성능을 고려해 동적으로 조정해야 한다. 캐시와 메모리도 함께 설계 대상이다. SMT에서는 L1 캐시를 스레드 ID로 구분해 공유할 수 있고, CMP에서는 각 코어의 L1 캐시와 공유 L2/L3 캐시가 공존한다. 이때 캐시 간섭을 관리하지 못하면 스레드 간 경쟁이 성능 저하로 이어진다.
처리량을 얻는 대신 함께 다뤄야 할 문제
멀티스레딩은 CPU 유휴 시간을 활용하고 대기 시간을 은폐해 처리량을 높인다. 기존 실행 유닛을 활용하므로 CMP보다 적은 하드웨어 증가로 비용 대비 성능을 얻을 수 있으며, 여러 작업을 함께 진행해 멀티태스킹 응답성도 개선한다.
반면 다수의 PC와 레지스터, 스케줄링 로직이 필요해 설계와 검증이 어려워진다. 공유 캐시와 메모리 대역폭은 스레드 간 간섭을 만들고, 최악의 경우 성능을 떨어뜨릴 수 있다. 성능 구성으로만 보지 않고 자원 경쟁과 보안 취약점까지 포함해 판단해야 하는 이유다.
서버부터 모바일까지의 활용 맥락
웹 서버와 데이터베이스는 다수의 클라이언트 요청을 동시에 처리해야 하므로 SMT와 CMP를 결합해 처리량을 확보할 수 있다. 행렬 연산과 시뮬레이션처럼 독립적인 작업이 많은 과학 계산에서는 멀티코어와 SMT를 병렬 알고리즘에 활용한다.
데스크톱에서는 여러 애플리케이션을 실행하면서 인덱싱과 백업 같은 백그라운드 작업을 처리하는 데 쓰인다. 모바일 디바이스의 big.LITTLE 구성은 작은 코어와 큰 코어를 작업에 따라 선택해 성능과 배터리 수명의 균형을 맞춘다.