순차 실행과 비순차 실행의 차이점 정리

순차 실행 CPU는 명령어를 프로그램 순서대로 발행해 실행합니다. 앞의 명령어가 캐시 미스 등으로 대기하면 뒤의 명령어도 멈춥니다. 비순차 실행 CPU는 의존 관계를 조사해 준비된 명령어부터 먼저 실행하고, 결과는 리오더 버퍼(ROB)에서 프로그램 순서대로 확정합니다. 대기 시간 동안 다른 명령어를 진행할 수 있어 IPC가 높아지지만, 레지스터 리네이밍과 명령어를 선택하는 회로가 필요해 회로 규모와 전력이 커집니다.

비교 항목순차 실행비순차 실행
명령어 발행·실행 순서프로그램 순서준비된 명령어부터 순서를 바꿔 실행합니다
결과 확정(리타이어)프로그램 순서리오더 버퍼(ROB)에서 프로그램 순서대로 확정합니다
앞의 명령어가 대기 중일 때뒤의 명령어도 멈춥니다(스톨)의존하지 않는 뒤의 명령어를 먼저 진행합니다
데이터 해저드 대응포워딩과 스톨. 명령어 배치는 컴파일러에 의존합니다포워딩에 더해 하드웨어가 동적으로 명령어를 스케줄링합니다
가짜 의존(WAR·WAW)순서를 지키므로 기본적으로 문제가 되기 어렵습니다레지스터 리네이밍으로 물리 레지스터를 재할당해 제거합니다
주요 추가 회로적음. 단순한 파이프라인리네이밍 테이블, 물리 레지스터, 발행 큐, ROB, 로드·스토어 큐
캐시 미스의 영향큼. 미스할 때마다 파이프라인이 멈추기 쉽습니다수백 명령어 분량의 윈도 안에서 다른 명령어를 진행해 대기 시간의 일부를 숨길 수 있습니다
IPC낮은 편. 같은 발행 폭이라면 비순차 실행보다 낮습니다높음. 넓은 발행 폭과 결합해 1을 크게 넘습니다
회로 규모와 전력작음. 면적이나 전력당 성능을 높이기 쉽습니다큼. 명령어를 선택하는 회로와 ROB의 면적과 전력이 늘어납니다
사용처마이크로컨트롤러, 임베디드용 소형 코어, 저전력을 우선하는 코어의 일부, GPU의 연산 코어PC·서버·스마트폰의 고성능 코어

수치는 대략적인 자릿수 기준이며, 공정 세대와 제품에 따라 달라져요.

상황별 선택 기준

순차 실행
면적과 전력을 작게 억제하고 싶을 때, 실행 시간을 예측하기 쉽게 하고 싶을 때. 마이크로컨트롤러나 임베디드용 코어, 다수의 작은 코어를 나열하는 설계 등에 사용합니다.
비순차 실행
스레드 하나를 가능한 한 빠르게 실행하고 싶을 때. PC, 서버, 스마트폰의 고성능 코어에 사용합니다.
함께 사용
하나의 칩에 비순차 실행 고성능 코어와, 순차 실행이나 규모를 줄인 비순차 실행 저전력 코어를 함께 배치하는 구성이 있습니다. 무거운 처리는 고성능 코어에, 가벼운 처리는 저전력 코어에 할당해 성능과 전력을 양립시킵니다.

자주 묻는 질문

비순차 실행으로 프로그램의 결과가 바뀌는 일은 없나요?

스레드 하나 안에서는 바뀌지 않습니다. 실행 순서를 바꾸더라도 진짜 데이터 의존(RAW)은 지키고, 결과는 리오더 버퍼에서 프로그램 순서대로 확정하기 때문입니다. 분기 예측 실패나 예외가 발생하면 그 이후 명령어의 결과를 버리고 올바른 상태로 되돌리므로, 밖에서 보면 프로그램 순서대로 실행한 것처럼 보입니다.

순차 실행에서도 1사이클에 여러 명령어를 실행할 수 있나요?

할 수 있습니다. 순서를 지킨 채 이웃한 의존 없는 명령어를 동시에 발행하는 순차 실행 슈퍼스칼라가 있습니다. 다만 앞의 명령어가 멈추면 뒤도 진행할 수 없으므로 비순차 실행만큼 IPC가 오르지는 않습니다.

레지스터 리네이밍과 ROB는 각각 무엇을 하나요?

레지스터 리네이밍은 같은 레지스터 이름을 재사용해 생기는 가짜 의존(WAR과 WAW)을 물리 레지스터 재할당으로 제거해, 병렬로 실행할 수 있는 명령어를 늘립니다. ROB는 순서를 바꿔 실행한 명령어의 결과를 보관하고 프로그램 순서대로 확정해 정확한 예외를 실현합니다.

순차 실행 CPU에서 성능을 높이려면 어떻게 하나요?

컴파일러가 명령어 배치를 궁리해, 로드 결과를 사용하는 명령어를 떨어뜨려 두는 등 대기가 잘 생기지 않는 순서로 나열합니다. 포워딩으로 스톨을 줄이는 것 외에, 캐시 미스를 줄이는 데이터 배치나 프리페치도 효과가 있습니다.

이해도 확인

명령어의 의존 관계를 조사해, 실행할 수 있는 명령어부터 프로그램 순서와 다른 순서로 실행하여 성능을 높이는 방식은?

  1. A순차 실행(인오더)
  2. B비순차 실행(아웃오브오더)
  3. C싱글 사이클 실행
정답과 해설 보기

정답: B. 비순차 실행(아웃오브오더)

비순차 실행에서는 앞선 명령어의 결과나 메모리의 데이터를 기다리는 명령어를 뒤로 미루고, 준비된 뒤쪽 명령어를 먼저 실행합니다. 특히 캐시 미스의 대기 시간에 다른 일을 진행할 수 있다는 것이 큰 이점입니다. 수백 명령어 분량의 윈도우에서 실행 가능한 명령어를 찾는 회로, 레지스터 리네이밍, 결과를 순서대로 확정하는 리오더 버퍼 등이 필요하여 회로와 전력이 커집니다.

비순차 실행 CPU에서 순서를 바꿔 실행한 명령어의 결과를 프로그램 본래의 순서대로 확정(리타이어)시키기 위한 구조는?

  1. A리오더 버퍼
  2. B스눕 필터
  3. CTLB
정답과 해설 보기

정답: A. 리오더 버퍼

리오더 버퍼는 순서를 바꿔 실행된 명령어의 결과를 일시적으로 보관했다가 프로그램 순서대로 확정(리타이어)시키는 구조이며, 최근 고성능 코어에서는 수백 명령어 분량의 크기입니다. 분기 예측 실패나 예외가 발생했을 때 그 이후 명령어의 결과를 버리고 올바른 상태로 되돌릴 수 있어, 외부에서 보면 프로그램대로 실행된 것처럼 보입니다(정확한 예외).

비순차 실행 CPU에서 사용되는 레지스터 리네이밍의 주된 목적은?

  1. A레지스터 수를 줄여 회로를 작게 한다
  2. B프로그램이 쓰는 레지스터 이름은 바꾸지 않고 물리 레지스터를 다시 할당하여 겉보기 의존(WAR, WAW)을 제거한다
  3. C레지스터 값을 암호화한다
정답과 해설 보기

정답: B. 프로그램이 쓰는 레지스터 이름은 바꾸지 않고 물리 레지스터를 다시 할당하여 겉보기 의존(WAR, WAW)을 제거한다

명령어 세트의 레지스터 수는 16~32개 정도로 한정되어 있어 같은 레지스터 이름이 재사용되고, 실제 데이터 흐름과는 무관한 의존(역의존 WAR, 출력 의존 WAW)이 생깁니다. 레지스터 리네이밍은 수백 개의 물리 레지스터를 동적으로 할당하여 쓰기마다 새로운 물리 레지스터를 사용함으로써 이를 제거하고 병렬로 실행할 수 있는 명령어를 늘립니다. 진짜 의존(RAW)은 제거할 수 없습니다.

  1. 1클록 사이클에 여러 명령어를 동시에 발행·실행하는 프로세서 방식을 무엇이라 하는가?
  2. 파이프라인에서 앞선 명령어의 결과를 다음 명령어가 곧바로 사용할 때(데이터 해저드), 레지스터에 쓰기를 기다리지 않고 연산 결과를 곧바로 다음 명령어에 전달하는 기법은?
  3. 1클록당 실행할 수 있는 명령어 수를 나타내는 지표는?

CPU와 아키텍처 문제 풀기

주요 용어 설명

비순차 실행(Out-of-Order Execution)
명령의 의존 관계를 조사하여 실행 가능한 명령부터 프로그램 순서와 다른 순서로 실행해 성능을 높이는 방식. 결과는 리오더 버퍼에서 본래 순서대로 확정한다.
슈퍼스칼라(Superscalar)
1클록 사이클에 여러 명령을 동시에 발행·실행하는 프로세서 방식. 여러 연산기를 나란히 두고 서로 의존하지 않는 명령을 병렬로 처리한다.
IPC
Instructions Per Cycle의 약자로, 1클록당 실행할 수 있는 명령 수. CPU 설계상의 효율을 나타내며 성능은 대체로 IPC와 클록 주파수의 곱이 된다. 역수는 CPI.
파이프라인 처리(Pipelining)
명령 처리를 인출·해독·실행 등의 단계로 나누어, 여러 명령을 조금씩 어긋나게 동시에 처리하는 방식.
분기 예측(Branch Prediction)
조건 분기의 결과를 실행 전에 예측하여 파이프라인을 멈추지 않고 다음 명령을 처리하는 기술. 예측이 빗나가면 처리를 다시 한다.

관련 비교