CS

[혼자 공부하는 컴퓨터구조 + 운영체제] - 명령어 병렬 처리 기법

yoozung 2023. 5. 7. 22:58

지난 시간엔 멀티코어와 멀티스레드를 배웠음 

씨피유를 빠르게 처리할 수 있도록 설계하는 것도 중요하지만 

시간을 알뜰하게 쓰면서 명령어들을 처리하는 방법도 중요함

 

이번 글에서는 이와 관련하여 명령어 병렬 처리 기법을 알아볼 것

 


명령어 파이프라인

명령어가 처리되는 과정을 비슷한 시간 간격으로 나누면? 

1. 명령어 인출 (Instruction Fetch)

2. 명령어 해석 (Instruction Decode)

3. 명령어 실행 (Execute Instruction)

4. 결과 저장 (Write Back)

 

여기서 같은 단계가 겹치지만 않는다면 CPU는 '각 단계를 동시에 실행할 수 있다'

명령어 파이프라인

4개의 명령어를 동시에 실행하는 중.. 

명령어 파이프라이닝은 동시에 여러 개의 명령어를 겹쳐 실행하는 기법

 

명령어파이프라인 미사용시 이렇게 명령어 하나 끝날때까지 다른 명령어 실행 불가

 

 

 

파이프라인 위험: 명령어 파이프라인이 성능 향상에 실패하는 경우

파이프라인 위험의 종류

 

 

1. 데이터 위험 : 명령어 간의 의존성에 의해 야기

 

모든 명령어를 동시에 처리할 수는 없다

(이전 명령어를 끝까지 실행해야만 비로소 실행할 수 있는 경우)

명령어 1 : R1 <- R2 + R3 // R2 레지스터 값과 R3 레지스터 값을 더한 값을 R1 레지스터에 저장
명령어 2 : R4 <- R1 + R5 // R1 레지스터 값과 R5 레지스터 값을 더한 값을 R4 레지스터에 저장

명령어 1을 실행해서 R1값이 결정되어야 명령어2가 실행할 수 있기 때문 

 

 

 

2. 제어 위험 : 프로그램 카운터의 갑작스러운 변화 

이러한 상황을 방지하기 위해 프로그램 카운터가 미리 예측하는 기술이 있는데 그걸 분기 예측 (branch prediction)이라고 함

 

 

 

3. 구조 위험 : 서로 다른 명령어가 같은 CPU 부품(ALU, 레지스터) 를 쓰려고 할 때 

 

 

 

 

 

슈퍼스칼라 

CPU 내부에 여러 개의 명령어 파이프라인을 포함한 구조

(오늘날의 멀티스레드 프로세서)

슈퍼스칼라

 

이론적으로는 파이프라인 개수에 비례하여 처리 속도가 증가함

하지만 파이프라인 위험도의 증가로 인해 꼭 파이프라인 개수에 비례하여 처리 속도가 증가하진 않음

 

 

 

 

 

비순차적 명령어 처리 (Out of Order Execution)

합법적인 새치기

비순차적 명령어 처리 기법은 파이프라인의 중단을 방지하기 위해 명령어를 순차적으로 처리하지 않는 명령어 병렬  처리 기법.

 

위 명령어 중 3번은 1, 2번 명령어 실행을 통해 M(100), M(101)의 값이 결정되어야 함 

위와 같이 명령어 실행 순서를 바꿈으로써 파이프라인의 중단을 방지할 수 있음 

 

 

그렇다고 해서 아무 명령어가 순서를 바꿀 수 있는건 아님

의존성 문제, 전체 프로그램 실행 흐름과 결과에 문제 없으면 괜찮음