수퍼스칼라 프로세서의 명령어 병렬 실행 구조
수퍼스칼라 프로세서가 다중 발행과 실행 유닛으로 ILP를 활용하는 방식, 의존성 처리와 멀티스레딩의 관계를 정리한다.
2026-08-14 · 최초 발행 2026-01-02
여러 실행 유닛에 명령어를 나누는 방식
수퍼스칼라 프로세서는 한 클록 사이클에 여러 명령어를 수행할 수 있도록 설계된 프로세서다. 명령어를 여러 실행 유닛에 분배하고, 서로 독립적인 작업을 동시에 진행해 명령어 레벨 병렬성(Instruction-Level Parallelism, ILP)을 끌어낸다.
이 구조가 겨냥하는 것은 단위 시간당 실행 명령어 수를 늘리고 CPI(Cycles Per Instruction)를 낮추는 일이다. 클록 속도를 높이지 않고 성능을 개선할 수 있으며, 여러 실행 유닛의 유휴 시간을 줄여 IPC(Instructions Per Cycle)를 높인다. 멀티스레딩의 스레드 레벨 병렬성(Thread-Level Parallelism, TLP)과도 결합할 수 있다.
다중 발행을 뒷받침하는 실행 자원
실행 유닛은 CPU 내부에서 실제 연산을 수행하는 하드웨어, 즉 실행 자원이다. 수퍼스칼라 구조는 이 자원을 여럿 두고 발행 가능한 명령어를 적절한 유닛으로 보낸다.
정수 연산과 덧셈·뺄셈·논리 연산은 ALU(Arithmetic Logic Unit)가 맡는다. FPU(Floating Point Unit)는 부동소수점 연산을 처리하며 과학 계산과 그래픽스에서 쓰이고, 별도 파이프라인을 둔다. Load/Store Unit은 데이터의 로드·저장과 캐시 인터페이스를 담당한다. Branch Unit은 분기 명령어와 분기 예측 결과를 처리해 프로그램 흐름을 제어한다.
다중 발행(Multiple Issue)은 독립적인 명령어를 골라 여러 실행 유닛에 배분하는 과정이다. 2-way Superscalar는 한 사이클에 2개 명령어를, 4-way Superscalar는 한 사이클에 4개 명령어를 발행한다. 6-way 또는 그 이상의 구성도 가능하다.
스칼라 파이프라인이 한 사이클에 1개 명령어를 단일 실행 유닛으로 발행하는 전통적 방식이라면, 수퍼스칼라 파이프라인은 한 사이클에 N개 명령어를 여러 실행 유닛으로 보낸다. 파이프라인 구조에 병렬 처리를 더한 형태다.
병렬로 실행할 수 있는 명령어와 의존성
ILP는 명령어 사이에 존재하는 병렬 수행 가능성을 뜻한다. 독립적인 명령어가 많을수록 같은 시점에 실행할 수 있는 명령어 수도 늘어난다.
컴파일러는 정적 스케줄링(Static Scheduling)으로 의존성을 분석하고 명령어 순서를 재배치할 수 있다. 이 결정은 컴파일 시간에 이뤄진다. 반면 동적 스케줄링(Dynamic Scheduling)은 실행 시간에 프로세서가 명령어 순서를 조정하는 방식이며, Out-of-Order Execution을 통해 런타임 최적화를 수행한다.
병렬 실행을 막는 대표적인 요인은 의존성이다. 데이터 의존성에는 진정한 의존성인 RAW(Read After Write), 반의존성인 WAR(Write After Read), 출력 의존성인 WAW(Write After Write)가 있다. 제어 의존성은 분기 명령어에서 발생하며, 분기 예측으로 완화할 수 있다.
ADD R1, R2, R3 // R1 = R2 + R3
SUB R4, R1, R5 // R4 = R1 - R5 (RAW 의존성, R1 대기)
MUL R6, R7, R8 // R6 = R7 * R8 (독립적, 병렬 수행 가능)
프로그램의 의존성이 많으면 병렬성은 줄어든다. 일반적으로 평균 ILP는 2-4 정도다. 분기 예측이 실패하면 파이프라인을 플러시해야 하며, 메모리 의존성과 캐시 미스도 지연을 만든다.
수퍼스칼라와 멀티스레딩이 다루는 병렬성
수퍼스칼라는 하나의 스레드 안에서 여러 명령어를 병렬로 수행하는 ILP 중심의 방식이다. 하나의 프로그램 흐름을 대상으로 하므로 명령어 간 독립성이 필요하고, 의존성이 하드웨어 병렬성을 제약한다.
멀티스레딩은 여러 스레드의 명령어를 동시에 처리하는 TLP 중심의 방식이다. 여러 프로그램 흐름을 다루며 스레드 간 독립성을 활용한다. 실행 자원은 스레드가 공유한다.
두 방식을 결합하면 ILP와 TLP를 함께 활용할 수 있다. 예를 들어 4-way Superscalar + 2-way SMT 구성에서는 한 사이클에 최대 8개 명령어(2스레드 × 4명령어)를 처리한다. 이는 자원 활용을 높이고 두 병렬성 방식의 제약을 상호 보완한다.
명령어 발행 폭을 활용하는 하드웨어 기법
여러 명령어를 한 번에 인출하려면 Instruction Cache에서 블록 단위로 읽고, 분기 예측으로 다음 명령어를 추측해야 한다. 이후 여러 디코더가 명령어 타입과 오퍼랜드를 동시에 분석한다.
레지스터 리네이밍(Register Renaming)은 WAR와 WAW 의존성을 없애기 위한 기법이다. 논리 레지스터를 물리적 레지스터에 매핑하고, 같은 논리 레지스터에도 서로 다른 물리적 레지스터를 사용할 수 있게 해 병렬성을 높인다.
비순차 실행(Out-of-Order Execution)은 프로그램에 적힌 순서와 다르게, 준비된 명령어를 먼저 실행한다. Reservation Station은 실행 대기 명령어를 저장하고 오퍼랜드 준비 상태를 감지해 실행 유닛으로 발행한다. Reorder Buffer(ROB)는 완료된 명령어를 버퍼링한 뒤 프로그램 순서에 맞춰 커밋하므로 예외 처리의 정확성을 보장한다.
추측 실행(Speculative Execution)은 분기 결과를 예측해 명령어를 미리 실행하고, 예측이 틀리면 롤백한다. Load/Store 순서와 메모리 주소 충돌을 다루기 위한 메모리 의존성 예측도 여기에 포함된다.
성능 향상과 설계 비용의 교환 관계
수퍼스칼라는 여러 실행 유닛을 동시에 사용해 처리량과 IPC를 높이고, 유휴 시간을 줄인다. 클록 속도를 올리지 않고 성능을 높일 수 있다는 점도 장점이며, 클록 대비 전력 효율성을 기대할 수 있다.
그 대가로 다수의 실행 유닛과 복잡한 스케줄링 로직이 필요하다. 설계와 검증은 어려워지고, 추가 하드웨어와 동적 스케줄링 오버헤드는 전력 소비를 높인다. 프로그램 의존성 때문에 평균 ILP가 2-4로 제한되며, 실행 유닛을 계속 늘려도 수확은 체감한다. 복잡한 설계는 개발 비용과 칩 면적 증가로도 이어진다.
상용 프로세서에서의 구성
Intel Pentium은 2-way Superscalar이며 첫 x86 Superscalar 프로세서다. Intel Core i7/i9는 6-way+ Superscalar, Out-of-Order Execution, Hyper-Threading(SMT)을 사용한다.
AMD Ryzen은 Zen 아키텍처를 기반으로 4-6 way Superscalar와 SMT를 지원한다. ARM Cortex-A Series는 다양한 Superscalar 구성을 제공하며 모바일과 서버에서 전력 효율성을 중시한다.
수퍼스칼라 프로세서는 ALU, FPU, Load/Store 같은 실행 유닛으로 독립 명령어를 분배해 ILP를 활용한다. 레지스터 리네이밍, 비순차 실행, 추측 실행은 의존성으로 생기는 제약을 완화한다. 높은 성능과 자원 활용도는 하드웨어 복잡도, 전력 소비, ILP 한계라는 트레이드오프와 함께 검토해야 한다.