명령어 병렬 처리 기법
명령어 파이프라인
- 명령어 인출 (Instruction Fetch)
- 명령어 해석 (Instruction Decode)
- 명령어 실행 (Execute Instruction)
- 결과 저장 (Write Back)
* 같은 단계가 겹치지만 않는다면 CPU는 '각 단계를 동시에 실행할 수 있다.
명령어 파이프라이닝은 동시에 여러 개의 명령어를 겹쳐 실행하는 기법이다.
마치 컨베이어 벨트와 비슷하다.
파이프라인 위험
- 명령어 파이프라인이 성능 향상에 실패하는 경우를 말한다.
1. 데이터 위험
2. 제어 위험
3. 구조적 위험
1. 데이터 위험: 명령어간의 의존성 때문에 발생하는 위험이다.
- 모든 명령어를 동시에 처리할 수는 없다.(이전 명령어를 끝까지 실행해야만 비로소 실행할 수 있는 경우를 말한다.)
- ex) R1 = R2 + R3 이고 R4 = R1 + R5 일경우 R1의 계산이 다 끝나야 R4를 계산할 수 있다.
2. 제어 위험: 프로그램 카운터의 갑작스러운 변화로 인해 발생하는 위험이다.
- 점프 명령어, 콜 명령어, 인터럽트 등
- 예를 들어 실행을 하다보니 점프로 인해 한참 뒤의 명령어를 먼저 실행해야하는 경우, 중간에 인출과 해석등의 과정을 거치고 있던 명령어들은 헛수고가 된다.
- 분기 예측이 필요하다.
3. 구조적 위험: 서로 다른 명령어가 같은 CPU부품(ALU, 레지스터)를 쓰려고 할 때를 말한다.
슈퍼스칼라
CPU 내부에 여러개의 명령어 파이프라인을 포함한 구조를 얘기한다. (오늘날의 멀티 프로세서)
- 이론상으로는 파이프라인 개수에 비례하여 처리속도가 증가할 듯 하나 파이프라인 위험도의 증가로 인해 비례하여 속도가 증가하는것은 아니다.
비순차적 명령어 처리
- 파이프라인의 중단을 방지하기 위해 명령어를 순차적으로 처리하지 않는 명령어 병렬 처리 기법이다.
- 의존성이 없는 명령어의 순서를 바꾼다
* 전체 프로그램 실행 흐름에 영향이 없는 경우에만 가능하므로 아무 명령어나 순서를 바꿀 수 있는 것은 아니다.
# 혼자 공부하는 컴퓨터구조 + 운영체제 책을 공부하며 정리하였습니다.