파이프라이닝을 통한 명령어 병렬 처리
명령어 병렬 처리(ILP)는 여러 명령어를 동시에 실행해 CPU의 성능을 극대화하는 기법이다. 대표적인 방법으로 명령어 파이프라이닝이 있다.
명령어 파이프라이닝은 명령어 처리 과정을 단계별로 나누어 이해해야 한다.
- 명령어 인출(Instruction Fetch)
- 명령어 해석(Instruction Decode)
- 명령어 실행(Execute Instruction)
- 결과 저장(Write Back)
각 단계가 겹치지 않으면 CPU는 각 단계를 동시에 실행할 수 있다. 예를 들어, CPU는 하나의 명령어가 인출
되는 동안 다른 명령어인 실행
을 할 수 있다.
이처럼 공장의 생산 라인처럼 명령어를 파이프라인에 넣어 동시에 처리하는 방식을 명령어 파이프라이닝이라고 한다.
슈퍼스칼라
오늘날 대부분의 CPU는 여러 개의 파이프라인을 이용한다. 이처럼 CPU 내부에 여러 명령어 파이프라인을 포함하는 구조를 슈퍼스칼라라고 한다.
CPU 명령어 집합은 명령어 파이프라이닝과 같은 병렬 처리에 유리하거나 불리한 경우가 있다. 대표적인 명령어 집합 유형으로는 파이프라이닝 성능에 차이를 보이는 CISC와 RISC가 있다.
CISC는 복잡하고 다양한 기능의 명령어로 구성된 명령어 집합으로, 적은 수의 명령어로 프로그램을 실행할 수 있다.
RISC는 간단하고 규격화된 명령어를 사용하며, 대부분 1 클럭 내외로 실행되도록 설계된 명령어 집합이다. 동일한 프로그램이라도 RISC에서는 CISC보다 더 많은 명령어가 필요하다.
표면적으로는 CISC가 RISC보다 우월해 보일 수 있다. 하지만 CISC는 복잡하고 다양한 기능을 가진 명령어 때문에 크기가 일정하지 않고, 실행 시간이 들쑥날쑥하며 여러 클럭 주기가 필요하다. 이로 인해 파이프라이닝 효율이 낮아질 수 있다.
반면, RISC는 간단하고 규격화된 명령어 구조와 짧은 실행 시간(1클럭 내외) 덕분에 파이프라이닝에 더 적합하다.
파이프라인이 CPU 성능 향상에 실패하는 경우
파이프라이닝이 실패하여 성능 향상이 이루어지지 않는 상황은 파이프라인 위험(Pipeline hazard)이라고 부르며, 데이터 위험과 제어위험, 구조적 위험으로 구분할 수 있다.
데이터 위험(Data hazard)은 명령어 간 데이터 의존성으로 인해 발생한다. 이전 명령어의 결과를 다음 명령어가 필요로 할 때, 이전 명령어가 완료되기 전에 다음 명령어가 실행되면 파이프라인이 오작동할 수 있다. 예를 들어, 다음 두 명령어에서 명령어 2는 명령어 1의 결과에 의존한다.
- 명령어1: 데이터를 계산하여 저장
- 명령어2: 명령어1의 결과를 사용
이 경우, 명령어1의 처리가 끝난 후에야 명령어 2를 실행할 수 있다. 이를 무시하면 데이터 위험이 발생하게 된다.
제어 위험(Control hazard)은 프로그램 실행 흐름의 예기치 않은 변화로 인해 발생한다. 프로그램 카운터(PC)는 일반적으로 현재 명령어의 다음 주소로 1씩 증가하며 갱신된다. 그러나 JUMP
, CONDITION JUMP
, 인터럽트
와 같은 명령어 실행으로 실행 흐름이 변화하면서 PC 값이 갑작스럽게 변경되고, 이로 인해 미리 인출되거나 해석 중인 명령어가 무효화될 수 있다. 이러한 상황을 제어 위험이라고 한다.
구조적 위험(Structural hazard)은 여러 명령어가 동시에 실행되는 과정에서 ALU, 레지스터 등 동일한 CPU 자원을 동시에 사용하려고 할 때 발생한다. 이런 상황을 자원 위험(Resource hazard)이라고도 한다.
출처
'Knowledge > 컴퓨터구조&운영체제' 카테고리의 다른 글
[컴퓨터구조] 빅 엔디안과 리틀 엔디안 (메모리에 바이트를 밀어 넣는 순서) (0) | 2024.11.30 |
---|---|
[컴퓨터구조] 메모리 - RAM (1) | 2024.11.27 |
[컴퓨터구조] CPU 성능 향상을 위한 설계 (클럭, 코어, 스레드) (0) | 2024.11.25 |
[컴퓨터구조] CPU - 인터럽트 (0) | 2024.11.08 |
[컴퓨터구조] CPU - 레지스터 (0) | 2024.10.31 |