티스토리 뷰

It

명령어 파이프라이닝

IT eoeo25 2022. 8. 16. 21:19

명령어 파이프라이닝(instruction pipelining)

CPU의 프로그램 처리 속도를 높이기 위하여 CPU 내부 하드웨어를 여러 단계로 나누어 동시에 처리하는 기술

2-단계 명령어 파이프라인(two-stage instruction pipeline)

명령어를 실행하는 하드웨어를 인출 단계(fetch stage)와 실행 단계(execute stage)라는 두 개의 독립적인 파이프라인 모듈들로 분리

두 단계들에 동일한 클럭을 가하여 동작 시간을 일치

첫 번째 클럭 주기에서는 인출 단계가 첫 번째 명령어를 인출

두 번째 클럭 주기에서는 인출된 첫 번째 명령어가 실행 단계로 보내져서 실행되며, 그와 동시에 인출 단계는 두 번째 명령어를 인출

2-단계 명령어 파이프라인과 시간 흐름도

2-단계 명령어 파이프라인

2-단계 파이프라인을 이용하면 명령어 처리 속도가 두 배 향상(일반적으로 단계 수만큼의 속도 향상)

문제점

두 단계의 처리 시간이 동일하지 않으면 두 배의 속도 향상을 얻지 못함(파이프라인 효율 저하)

 파이프라인 단계의 수를 증가시켜 각 단계의 처리 시간을 같게 함파이프라인 단계의 수를 늘리면 전체적으로 속도 향상도 더 높아짐

4-단계 파이프라인의 예

명령어 인출(IF) 단계 : 다음 명령어를 기억장치로부터 인출

명령어 해독(ID) 단계 : 해독기(decoder)를 이용하여 명령어를 해석

오퍼랜드 인출(OF) 단계 : 기억장치로부터 오퍼랜드를 인출

실행(EX) 단계 : 지정된 연산을 수행

4-단계 명령어 파이프라인과 시간 흐름도

파이프라인에 의한 전체 명령어 실행 시간

파이프라인 단계 수 = k,

실행할 명령어들의 수 = N,

각 파이프라인 단계가 한 클럭 주기씩 걸린다고 가정한다면,

파이프라인에 의한 전체 명령어 실행 시간 T :

T = k + (N - 1)

즉, 첫 번째 명령어를 실행하는데 k 주기가 걸리고,

나머지 (N - 1) 개의 명령어들은 각각 한 주기씩만 소요

파이프라인 되지 않은 경우의 N 개의 명령어들을 실행 시간 T : T = k × N

파이프라인에 의한 속도 향상 (speedup)

[예] k=4일 때, N = 100 이라면, Sp = 400/103 = 3.88

N = 1000 이라면, Sp = 4000/1003 = 3.99

N = 10000 이라면, Sp = 40000/10003 = 3.998

N  ∞ 이라면, Sp = 4

파이프라인에 의한 속도 향상 예

파이프라인 단계 수 = 4이고,파이프라인 클럭 = 1MHz (각 단계에서의 소요시간 = 1 ㎲)라면,

첫번째 명령어 실행에 걸리는 시간 = 4 ㎲

다음부터는 매 1 ㎲ 마다 한 개씩의 명령어 실행 완료

10개의 명령어 실행 시간 = 4 + (10 - 1) = 13 ㎲

속도향상 = (10 × 4) / 13 ≒ 3.08 배

파이프라인의 성능 저하 요인들

모든 명령어들이 파이프라인 단계들을 모두 거치지는 않는다

어떤 명령어에서는 오퍼랜드를 인출할 필요가 없다

그러나 파이프라인 하드웨어를 단순화하기 위해서는 모든 명령어가 네 단계들을 모두 통과하도록 해야 한다

파이프라인의 클럭은 처리 시간이 가장 오래 걸리는 단계가 기준이 된다

IF 단계와 OF 단계가 동시에 기억장치를 액세스하는 경우에 기억장치 충돌(memory conflict)이 일어나면 지연이 발생한다

조건 분기(conditional branch) 명령어가 실행되면, 미리 인출하여 처리하던 명령어들이 무효화된다

조건 분기가 존재하는 경우의 시간 흐름도

분기 발생에 의한 성능 저하의 최소화 방법

분기 목적지 선인출(prefetch branch target)

조건 분기가 인식되면, 분기 명령어의 다음 명령어뿐만 아니라 분기의 목적지 명령어도 함께 인출하는 방법

루프 버퍼(loop buffer) 사용

파이프라인의 명령어 인출 단계에 포함되어 있는 작은 고속 기억장치인 루프 버퍼에 가장 최근 인출된 n개의 명령어들을 순서대로 저장해두는 방법

분기 예측(branch prediction)

분기가 일어날 것인 지를 예측하고, 그에 따라 명령어를 인출하는 확률적 방법

분기 역사 표(branch history table) 이용하여 최근의 분기 결과를 참조

지연 분기(delayed branch)

분기 명령어의 위치를 재배치함으로써 파이프라인의 성능을 개선하는 방법

상태 레지스터(status register)

조건분기 명령어가 사용할 조건 플래그(condition flag)들 저장

부호(S)플래그

직전에 수행된 산술연산 결과값의 부호비트를 저장

영(Z) 플래그

연산 결과값이 0 이면, 1

올림수(C) 플래그

덧셈이나 뺄셈에서 올림수(carry)나 빌림수(borrow)가 발생한 경우에 1로 세트

동등(E) 플래그

두 수를 비교한 결과가 같게 나왔을 경우에 1로 세트

오버플로우(V) 플래그

산술 연산 과정에서 오버플로우가 발생한 경우에 1로 세트

인터럽트(I) 플래그

인터럽트 가능(interrupt enabled) 상태이면 0로 세트

인터럽트 불가능(interrupt disabled) 상태이면 1로 세트

슈퍼바이저(P) 플래그

CPU의 실행 모드가 슈퍼바이저 모드(supervisor mode)이면 1로 세트,

사용자 모드(user mode)이면 0로 세트

'It' 카테고리의 다른 글

리눅스의 특징  (0) 2022.08.17
명령어 세트  (0) 2022.08.16
명령어 실행  (0) 2022.08.16
Spring AOP 4-1 AOP  (0) 2022.08.15
Dependency Injection 3-4 Annotation 기반 설정  (0) 2022.08.15