CS/컴퓨터 구조론

컴퓨터 구조론 2장 [CPU의 구조와 기능 - 명령어 파이프라이닝]

devrabbit22 2025. 3. 14. 18:33

명령어 파이프라이닝(Instruction Pipelining)

  • 명령어 실행에 사용되는 하드웨어를 여러 단계로 분할함으로써 처리 속도를 높여주는 기술
  • 이것은 명령어를 실행하는데 사용되는 하드웨어를 여러 개의 독립적인 단계들로 분할하고, 그들로 하여금 동시에 서로 다른 명령어들을 처리하도록 함으로써 CPU의 성능을 높여주는 기술을 말한다. 
  • 명령어 파이프라인은 분할되는 단계의 수가 많아질수록 처리 속도가 높아지는데, 최근에는 CPu의 속도를 더욱 높이기 위하여 여러 개의 명령어 파이프라인들을 설치하기도 한다. 

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

명령어 사이클은 기본적으로 인출 사이클과 실행 사이클이라는 두 개의 단계로 이루어진다. 

각 사이클의 동작을 처리하는 하드웨어를 독립적인 모듈로 구성할 수 있다면 각 모듈이 서로 다른 명령어를 동시에 처리할 수 있을 것이다. 즉, 명령어를 실행하는 하드웨어를 인출 단계(fetch stage)와 실행 단계(execute stage)라는 두 개의 파이프라인 단계들로 분리하여 구성할 수 있다.

두 파이프라인 단계들에 하나의 클록 신호를 동시에 인가하면, 그 단계들의 동작 시간을 일치시킬 수 있다. 

각 단계는 서로 다른 명령어에 대하여 각자의 동작을 수행할 수 있게 된다. 

  • 첫 번째 클록 주기 동안에 인출 단계가 첫 번째 명령어를 인출한다. 
  • 두 번째 주기에서는 그 명령어가 실행 단계로 보내어져 처리되며, 동시에 인출 단계는 첫 번째 클록 주기 동안에 미리 인출되었기 때문에, 두 번째 클록 주기가 시작되는 즉시 실행이 시작될 수 있는 것이다. 

명령어 선인출(Instruction prefetch) 혹은 인출 중복(fetch overlap)

다음에 실행될 명령어를 미리 인출하는 동작

세 번째 클록 주기에서는 두 번째 명령어의 실행과 세 번째 명령어의 인출이 동시에 이루어지는데, 이러한 동시 처리는 시간 흐름도에서 보는 바와 같이 연속적인 명령어들에 대하여 계속 적용될 수 있다. 이와 같이 명령어 실행 하드웨어를 두 단계로 분리시킨 것을 2-단계 명령어 파이프라인(two-stage instruction pipeline)이라고 부른다.

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

명령어 파이프라이닝을 이용하여 속도 향상을 얻을 수 있는 원리

  • 첫 번째 명령어의 실행은 두 클록 주기만에 종료되지만, 두 번째 명령어는 그 때부터 한 클록 후에 실행이 완료 된다. 그리고 세 번째 및 네 번째 명령어들도 각각 한 주기씩만 지나면 실행이 종료된다. 
  • 각 명령어의 실행에 걸리는 시간은 모두 두 주기씩이지만, 파이프라이닝의 특성에 의해 두 번째 명령어부터는 한 주기만에 실행이 완료되는 것과 같은 효과를 얻을 수 있다.
  • 위 이미지에서 세 개의 명령어들을 실행하는데는 모두 4개의 클록 주기가 소요된다.
  • 만약 파이프라인을 이용하지 않았다면 (2 x 3)  = 6 클록 주기가 걸릴 것이므로, 2-단계 파이프라인을 이용함으로써 얻게 되는 속도 향상(Sp)은 (6 / 4) = 1.5배가 된다.
  • 더 많은 수의 명령어들을 실행시키는 경우에는 속도 향상이 파이프라인 단계 수와 같은 2배에 접근하게 된다.

이와 같은 길이의 시간이 소요되는 경우에만 얻을 수 있다. 실제 명령어 처리 과정을 분석해보면, 일반적으로 실행 단계에서 소요되는 시간이 인출 단계보다 더 길다. 

이유 : 실행 단계에서는 오퍼랜드를 읽거나 저장하기도 하고, 복잡한 연산을 인출한 다음에 즉시 다음 명령어 인출을 시작하지 못하고, 실행 단계의 동작이 끝날 때까지 기다려야 한다.

2-단계 파이프라인을 이용하면 분명히 속도 향상을 얻을 수 있지만, 위의 이유 때문에 실제로 두 배만큼 빨라지지는 못한다.

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

파이프라인 단계들의 처리 시간이 동일하지 않음으로 인하여 발생하는 효율 저하를 방지하는 방법은 처리 시간이 더 긴 파이프라인 단계를 여러 개로 분할함으로써, 단계들의 처리 시간이 거의 같아지도록 하는 것이다.

이와 같이 파이프라인 단계의 수를 늘리면 속도 향상도 더 높아진다. 

ex) 2-단계 파이프라인의 실행 단계를 세부적 동작에 따라 분할하여, 파이프라인을 네 단계로 구성하는 경우

  • 명령어 인출(IF) : 명령어를 기억장치로부터 인출한다.
  • 명령어 해독(ID) : 해독기(Decoder)를 이용하여 명령어를 해석한다.
  • 오퍼랜드 인출(OF) : 기억장치로부터 오퍼랜드를 인출한다.
  • 실행(EX) : 지정된 연산을 수행하고 결과를 저장한다.

4-단계 명령어 파이프라인으로 구성하면, 각 단계에서 걸리는 시간들이 거의 같아질 수 있다. 

편의상 모든 단계들에서 같은 시간이 걸린다고 가정하면, 명령어들이 연속적으로 실행되는 경우의 시간 흐름도는 아래와 같다.

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

파이프라이닝을 이용하여 얻을 수 있는 속도 향상을 일반적인 관계식으로 표현

파이프라인 단계 수를 k, 실행할 명령어들의 수를 N이라 하면, 파이프라이닝을 이용한 경우의 전체 명령어 실행 시간 T는 다음과 같이 표현된다. 단, 각 파이프라인 단계는 한 클록 주기씩 걸린다고 가정한다.

즉, 첫 번째 명령어를 실행하는 데는 k주기가 걸리고, 나머지 (N-1) 개의 명령어들은 각각 한 주기씩만 소요된다. 만약 파이프라인이 되지 않았다면 N개의 명령어들을 실행하는 데는 K x N 주기가 걸리므로, 파이프라이닝을 이용함으로써 얻을 수 있는 속도 향상(Sp)은 다음과 같아진다.

k-단계 파이프라인을 이용하면 최대 k배의 속도 향상을 얻을 수 있다.

파이프라인의 효율 저하 요인

  • 모든 명령어들이 파이프라인 단계들을 모두 거치지 않는다.
  • 어떤 명령어에서는 오퍼랜드를 인출할 필요가 없지만, 파이프라인의 하드웨어를 단순화시키기 위해서는 모든 명령어가 네 단계들을 모두 통과하도록 해야 한다.
  • 파이프라인의 클록은 처리 시간이 가장 오래 걸리는 단계를 기준으로 결정된다.
  • IF 단계와 OF 단계가 동시에 기억장치를 액세스하는 경우 에, 기억장치 충돌(memory conflict)이 일어나면 지연이 발생 한다.
  • 조건 분기(conditional branch) 명령어가 실행되면, 미리 인출하여 처리하던 명령어들이 무효화된다

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

위에 지적된 문제점들은 파이프라이닝 구조가 가지고 있는 근본적인 것이기 때문에 완전히 해결할 수 는 없지만, 보완하기 위한 많은 노력이 이루어지고 있다. 

슈퍼파이프라이닝(SuperPipelining)

  • 명령어 파이프라인의 단계들을 더욱 작게 분할하여 처리 속도를 높여주는 기술
  • 최근에는 대부분의 프로세서들이 10단계 이상의 단계들로 분할된 명령어 파이프라인 구조를 사용한다.
  • 세 번째 문제점을 보완하기 위하여 파이프라인의 IF단계와 OF 단계가 직접 액세스하는 CPU 내부 캐시(Internal cache)를 명령어 캐시와 데이터 캐시로 분리시키는 방법이 사용되고 있다.

조건 분기 때문에 발생하는 네 번째 문제점도 완전히 해결할 수 없지만, 그로 인한 성능 저하를 최소화시키기 위한 방법

  • 분기 예측(branch prediction) : 분기가 일어날 것인지를 예측하고, 그에 따라 어느 경로의 명령어르 인출할 지를 결정하는 확률적 방법이다. 최근의 분기 결과들을 저장하여 두는 분기 역사 표(branch history table)을 참조하여 예측하는 방법이 가장 널리 사용되고 있다.
  • 분기 목적지 선인출(prefetch branch target) : 조건 분기가 인식되면, 분기 명령어의 다음 명령어 뿐 아니라, 조건이 만족될 경우에 분기하게 될 목적지(branch target)의 명령어도 함께 인출하는 방법이다.  그렇게 하면, 만약 분기가 이루어지더라도 목적지의 명령어기 이미 인출되어 있는 상태이기 때문에 지연 시간을 줄일 수 잇다. 이방법을 사용하기 위해서는 분기 목적지 명령어를 별도로 저장해둘 수 있는 기억 장소가 추가되어야 한다.
  • 루프 버프(loop buffer) : 이 버퍼는 파이프라인의 명령어 인출 단계에 포함되어 있는 작은 고속 기억장치인데, 가장 최근에 인출된 일정 개수의 명령어들이 순서대로 저장되어 있다. 만약 분기가 발생하면, 하드웨어는 먼저 분기 목적지의 명령어가 버퍼에 있는지를 검사한다. 만약 있다면, 다음 명령어는 버퍼로부터 인출된다. 반복 루프가 크기 않다면 그 전체가 루프 버퍼에 저장될 수 있기 때문에 이 방법은 작은 반복 루프들이 포함된 프로그램을 처리하는 경우에 효과가 높다.
  • 지연 분기(delayed branch) : 프로그램 내의 명령어들을 재배치함으로써 파이프라인의 성능을 개선하는 방법이다. 즉, 분기 명령어의 위치를 적절히 조장하여 원래보다 나중에 실행되도록 재배치 함으로써, 그로 인한 성능 저하를 최소화 하는 것이다.

상태 레지스터(status register)

  • 연산 처리 결과(부호, 올림수 등) 및 시스템 상태를 가리키는 비트들을 저장하는 레지스터이다.
  • 조건 분기 명령어에서 사용하는 조건들은 CPU 내부의 상태 레지스터(status register)에 저장되어 있다. 
  • 각 조건의 상태를 나타내는 비트를 플래그(flag)라고 한다.
  • CPU는 실행 사이클 동안에 조건 분기 명령어가 지정하는 플래그 값을 검사하여 분기 여부를 결정하게 된다.

일반적으로 상태 레지스터에 포함된 조건 플래그

  • 부호(S) 플래그 : 직전에 수행된 산술 연산 결과값의 부호(sign) 비트로 세트 된다. 일반적으로 0은 양수, 1은 음수를 나타낸다.
  • 제로(Z) 플래그 : 연산 결과 값이 0(zero)이면, 이 플래그가 1로 세트된다.
  • 올림수(C) 플래그 : 덧셈이나 뺄셈에서 올림수(carry)나 빌림수(borrow)가 발생한 경우에 세트된다.
  • 동등(E) 플래그 : 두 수를 비교한 결과가 동일(equal)한 경우에 세트된다.
  • 오버플로우(V) 플래그 : 인터럽트 가능(interrupt enabled) 상태이면 1, 인터럽트 불가능(interrupt disabled) 상태이면 0으로 세튿된다.
  • 슈퍼바이저(P) 플래그 : CPU가 슈퍼바이저 모드(Supervisor mode)와 사용자 모드(user mode) 중의 어느 모드에서 프로그램을 실행하고 있는지를 나타내는데 사용된다. 슈퍼바이저 모드는 운영체제(OS)를 포함한 시스템 프로그램을 수행하는 모드를 말하며, 사용자 모드는 사용자 프로그램 혹은 응용 프로그램이 수행되는 모드이다.

8-비트 상태 레지스터의 플래그들

X로 표시된 비트는 사용되지 않는 비트를 나타낸다.

슈퍼스칼라(Superscalar)

  • CPU 내에 여러 개의 명령어 파이프라인들을 두어, 동시에 그 수만큼의 명령어들을 실행할 수 있도록 한 구조
  • CPU 처리 속도를 더욱 높이기 위하여 내부에 두개 혹은 그 이상의 명령어 파이프라인들을 포함시킨 구조이다.
  • 설계된 CPU는 매 클록마다 각 명령어 파이프라인이 별도의 명령어를 인출하여 동시에 실행할 수 있기 때문에, 이론적으로는 프로그램 처리 속도가 파이프라인의 수만큼 높아질 수 있다.

파이프라인의 수 = m : m-way 슈퍼스칼라

일반적인 명령어 파이프라인과 슈퍼스칼라 구조의 실행 흐름도[JOH91]

일반적인 명령어 파이프라인의 시간흐름도에서는 각 클록 주기마다 명령어가 한 개씩 인출되어 순차적으로 실행된다.

a와 동일한 파이프라인 구조를 가진 명령어 유니트를 두 개 포함하고 있는 슈퍼스칼라 프로세서의 명령어 실행에 대한 시간 흐름도를 보여주는데, 이와 같이 두 개의 파이프라인들로 이루어진 구조를 2-way 슈퍼스칼라라고 부르는데, 이 경우 매 주기마다 명령어가 두 개씩 인출되어 동시에 처리되는 것을 확인할 수 있다.

위 그림을 보면 명령어의 실행 흐름을 쉽게 파악할 수 있도록 EX 단계를 빗금으로 표시했다.

b의 2-way 슈퍼스칼라 프로세서에서 유의할 점 : 동시에 처리할 명령어 들이 서로 간에 영향을 받지 않고, 이에 데이터 의존성(data dependency)이 존재하지 않아야 그들을 동시에 실행할 수 있다. 그러한 조건이 만족된다면, 이 슈퍼스칼라의 명령어 실행 속도는 하나의 명령어 파이프라인에 비하여 두 배가 될 수 있다.

 

ex)

a에 서 일곱 주기 동안에 4개의 명령어들에 대한 실행을 완료

b에서 같은 주기 동안에 8개의 명령어 실행이 완료

속도 향상 관계를 구체적으로 분석한 결과

단일 파이프라인에 의한 실행 시간 (N : 실행할 명령어 수)

 m-way 슈퍼스칼라에 의한 실행 시간

 속도 향상

명령어 수 N→∞, Sp→m

즉, 실행되는 명령어들의 수가 매우 많아진다면, 속도 향상은 명령어 파이프라인의 수인 m배에 접근한다.

슈퍼스칼라의 속도는 파이프라인을 사용하지 않은 프로세서에 비하여 최대 mk배까지 얻을 수 있다.

 

ex) b와 같은 2-way 슈퍼스칼라 프로세서는 파이프라인 되지 않은 프로세서에 비하여 명령어 처리 속도가 8배 더 높아진다

4-way 슈퍼스칼라 프로세서는 16배까지 더 빨라질 수 있다. 결과적으로 명령어 실행 속도를 높이려면 그만큼 더 많은 수의 명령어 파이프라인들을 포함시키면 된다.

CPU가 동시에 처리할 수 있는 명령어들의 수가 늘어나게 되면, 기억장치와 레지스터에 대한 충돌이 발생하지 않을 수 있도록 하드웨어도 그만큼 추가되어야 한다.

실제 프로그램 처리 과정에서는 독립적으로 실행될 수 있는 명령어들일 파이프라인의 수만큼 존재하지 않거나, 명령어들 간에 데이터 의존성이 존재하는 상황이 발생하게 된다. 그러한 경우에는 파이프라인들의 일부 단계들이 유후(idle) 상태에 들어가기 때문에, 속도 향상은 이론적인 수치보다는 더 낮아진다.

위 내용을 간단하게 정리한 내용

  • 명령어들 간의 데이터 의존 관계
  • 하드웨어(레지스터, 캐시, 기억장치,등) 이용에 대한 경합 발생
  • 동시 실행 가능한 명령어 수 < m

해결책

  • 명령어 실행 순서 재배치
  • 명령어들 간의 데이터 의존성 제거
  • 하드웨어 추가(중복) 설치
  • 하드웨어(레지스터, 캐시, 등)에 대한 경합 감소

듀얼-코어 및 멀티-코어

  • CPU 코어란 기존의 CPU 칩에 포함되던 하드웨어 중에서 명령어 실행에 반드시 필요한 핵심 모듈이다.
  • 명령어 파이프라인들로 이루어진 슈퍼스칼라 모듈과 ALU 및 레지스터 세트 등을 말한다. 
  • CPU 코어 여러개를 하나의 칩에 넣은 것을 멀티-코어 프로세서라고 부른다. 
  • 두 개의 CPU 코어들을 넣은 프로세서 칩을 듀얼 코어 프로세서라고 하며, 네 개를 포함시킨 칩은 쿼드-코어 프로세서라고 부른다.
  • 이들은 칩-레벨 다중 프로세서(chip-level multiprocessor) 혹은 단일-칩 다중프로세서(multiprocessor-on-a-chip)라고 불리기도 한다.

  • 듀얼-코어 프로세서의 각 CPU 코어는 슈퍼스칼라 구조로 구성되기 때문에, 코어 두 개를 한 칩에 포함시키면 두 배 더 빨라질 것으로 기대할 수 있다.
  • 듀얼-코어에서는 각 CPU 코어가 슈퍼스칼라의 멸령어 파이프라인에 비하여 독립성이 더 높다. 
  • 각 CPU 코어는 별도의 하드웨어 모듈로 구현된 상태로 하나의 칩에 포함되며, 내부 캐시(internal cache)와 시스템 버스 인터페이스만 공유한다. 따라서 각 CPU 코어는 프로그램 실행을 독립적으로 수행하며, 필요한 경우에만 공유 캐시를 통하여 정보를 교환한다.

멀티-태스킹(multi-tasking)

여러 CPU 코어들을 이용하여 독립적인 태스크(혹은 스레드) 프로그램들을 동시에 처리하는 기술로서, 멀티-스레딩(multi-threading)이라고도 한다.

멀티-스레딩(multi-threading)

하나의 CPU 코어가 다수의 스레드들을 동시에 실행하는 기법

스레드(thread)

독립적으로 실행될 수 있는 최소 크기의 프로그램 단위

  • 단일-스레드 모델 : 각 코어가 스레드를 한 개씩 처리
  • 처리 중의 스레드에 대한 시스템 상태, 데이터 및 주소 정보를 레지스터 세트(register set: RS)에 저장
  • RS: 프로그램 카운터(PC), 스택 포인터(SP), 상태 레지스터, 데이터 레지스터, 주소 레지스터, 등

  • 멀티-스레드 모델: 각 코어는 두 개의 RS들을 포함하며, 스레드를 두 개씩 처리
  • 두 스레드들이 CPU 코어의 H/W 자원들(ALU, 부동소수점유니트, 온-칩 캐시,TLB, 등)을 공유
  • 처리 중의 각 스레드에 대한 시스템 상태, 데이터 및 주소 정보는 서로 다른 레지스터 세트(RS)에 저장

 듀얼-코어 멀티-스레드 프로세서

‘두 개의 물리적 프로세서(physical processor)들이 네 개의 논리적 프로세서(logical processor)들로 구성되어 있다’라고 정의하기도 함 [INTi17 참조]


멀티-코어 멀티-스레딩 프로세서의 사례

  • Intel i7-8500Y : 2-코어 4-스레드 프로세서 
  • Intel i7-8565U : 4-코어 8-스레드 프로세서

Reference

컴퓨터 구조론 개정 5판

https://yz-zone.tistory.com/67

 

[ 컴퓨터구조 ] 2.3 명령어 파이프라이닝

[ 명령어 파이프라이닝(instruction pipelining) ] ▣ 명령어 파이프라이닝이란? ▪ CPU의 프로그램 처리 속도를 높이기 위하여 CPU 내부 하드웨어를 여러 단계로 나누어 동시에 처리하는 기술 ▣ 2단계

yz-zone.tistory.com