슈퍼스칼라

CPU 내에 파이프라인을 여러 개 두어 명령어를 동시에 실행하는 기술

슈퍼스칼라(superscalar)는 CPU 내에 파이프라인을 여러 개 두어 명령어를 동시에 실행하는 기술이다. ILP를 최대한 적용하여 실행하면 CPU 처리 속도가 빨라진다. 파이프라인이 하나라면 클럭당 하나의 명령어만 완료할 수 있었다 (다시 말해 IPC가 1이다). 이 값을 높이려면 파이프라인을 여러 개 두어 명령어를 동시에 실행시켜야 한다. 파이프라인이 2개라면 이상적으론 클럭마다 최대 2 개의 명령어를 처리할 수 있어 IPC=2가 된다. 보통 슈퍼스칼라 프로세서는 동시에 처리(투입/완료)가 가능한 명령어 개수에 따라 N-이슈, N-와이드(wide), N-웨이(way) 슈퍼스칼라라고 표현한다. 이상적으로는 N개의 명령어를 읽어 파이프 라인에 넣을 수 있지만(fetch), 실제로는 명령어 캐시의 제약, 명령어 사이의 의존성, 분기문 때문에 N개보다 작은 명령어만 넣을 수 있을 때가 일반적이다.

명령어 사이에 데이터 의존성, 자원 의존성, 프로시저 의존성이 존재하는 경우에는 동시실행에 제한이 있다.

데이터 의존성 편집

ADD와 DIV 두 가지 명령어를 사용하여 데이터 의존성을 설명해보자.

  • ADD R1, R2, R3 : R2와 R3를 더해서 R1에 저장한다.
  • DIV R4, R1, R5 : R1을 R5로 나누어서 R4에 저장한다.

다음과 같은 값이 주어질 때

R1 = 8
R2 = 1
R3 = 3
R5 = 2

두 명령어를 순차적으로 실행하면 다음과 같으며

R1 = 4
R4 = 2

실행 순서를 바꿔 실행하면 다음과 같이

R1 = 4
R4 = 4

R4에 잘못된 결과가 저장된다.

첫 번째 명령어에 의해 값이 정해지는 데이터를 두 번째 명령어에서 읽게 되는 경우에는 두 명령어의 실행 순서가 변경되어서는 안 되며, 이것을 'READ AFTER WRITE 의존성'이라고 한다.