상세 컨텐츠

본문 제목

02. CPU의 구조와 기능 (2) [명령어 파이프라이닝]

Computer Science/Computer Architecture

by RACC8N 2020. 4. 3. 15:58

본문

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

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

 

2-단계 명령어 파이프라인 (Two-stage Instruction Pipeline)

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

두 단계들에 동일한 클록을 가하여 동작 시간을 일치시키면,

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

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

2-단계 파이프라인을 이용하면 명령어 처리 속도가 약 두 배 향상

 

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

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

 

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

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

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

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

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

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

파이프라인 단계 수 = k

실행할 명령어들의 수 = N

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

첫 번째 명령어를 실행하는데 k 주기가 걸리고, 나머지 (N-1)개의 명령어들은 각각 한 주기씩만 소요

[EXAMPLE] 파이프라인 단계 수 = 4, 파이프라인 클록 = 1GHz (각 단계에서의 소요시간 = 1ns)일 때, 10개의 명령어를 실행하는 경우의 속도 향상은?

 

> 첫 번째 명령어 실행에 걸리는 시간 = 4ns, 나머지는 1ns마다 한 개씩의 명령어 실행 완료. 따라서 4 + (10-1) = 13ns

-> 속도 향상 (Sp) = (10*4)/13 = 3.08배

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

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

> 어떤 명령어에서는 오퍼랜드를 인출할 필요가 없지만, 파이프라인의 하드웨어를 단순화시키기 위해서는 모든 명령어가 네 단계들을 모두 통과하도록 해야 한다.

2. 파이프라인의 클록은 처리시간이 가장 오래 걸리는 단계를 기준으로 결정된다.

(보완 : 파이프라인 단계를 더욱 작게 분할함으로써 처리 시간의 차이를 최소화 시킴 [슈퍼파이프라이닝]

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

(보완 : IF단계와 OF단계가 직접 엑세스하는 CPU 내부 캐시를 명령어 캐시와 데이터 캐시로 분리 시킴)

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

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

1. 분기 예측 (Branch prediction)

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

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

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

> 조건 분기가 인식되면, 분기 명령어의 다음 명령어뿐만 아니라 분기의 목적지 명령어도 함께 인출하여 실행하는 방법(조건 확인 후, 유효 명령어 결과를 선택)

3. 루프 버퍼(Loop buffer) 사용 

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

4. 지연 분기(delayed branch)

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

 

상태 레지스터 : 연산처리 결과 (부호, 올림 등) 및 시스템 상태를 가리키는 비트들을 저장하는 레지스터

조건 분기 명령어에서 사용할 조건 플래그(Condition Flag)들 저장

조건 플래그의 종류 :

부호(S) 플래그 : 직전에 수행된 산술연산 결과값의 부호 비트를 저장

제로(Z) 플래그 : 연산 결과값이 0이면 1,  0이 아니면 0으로 저장

올림수(C) 플래그 : 덧셈이나 뺄셈에서 올림수(carry)나 빌림수(borrow)가 발생한 경우에 1로 set

동등(E) 플래그 : 두 수를 비교한 결과가 같게 나왔을 경우에 1로 set

오버플로우(V) 플래그 : 산술 연산 과정에서 오버플로우가 발생한 경우에 1로 set

인터럽트(I) 플래그 : 인터럽트 가능 = 0, 인터럽트 불가능 = 1

슈퍼바이저(P) 플래그 : CPU의 실행모드가 슈퍼바이저모드이면 1, 일반 사용자 (usermode)이면 0

 

2.3.3 슈퍼스칼라 (Superscalar)

CPU의 처리속도를 더욱 높이기 위해 내부에 두 개 혹은 그 이상의 명령어 파이프라인들을 포함시킨 구조

매 클록 주기마다 각 명령어 파이프란이이 별도의 명령어를 인출하여 동시에 실행할 수 있기 때문에, 이론적으로는 프로그램 처리 속도가 파이프라인의 수만큼 향상 가능

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

슈퍼스칼라의 속도 저하 (Sp < m) 요인 : 

1. 명령어들 간의 데이터 의존 관계

※ 데이터 의존성 : 한 명령어를 실행한 다음에, 그 결과값을 보내주어야 다음 명령어의 실행이 가능한 관계

2. 하드웨어(레지스터, 캐시, 기억장치 등) 이용에 대한 경합 발생

-> 동시 실행 가능한 명령어 수 < m

(해결)

명령어 실행 순서 재배치 -> 명령어들 간의 데이터 의존성 제거

하드웨어 추가 설치 -> 하드웨어(레지스터, 캐시, 기억장치 등)에 대한 경합 감소

 

2.3.4 듀얼-코어 및 멀티-코어

CPU 코어(Core) : 명령어 실행에 필요한 CPU 내부의 핵심 하드웨어 모듈(슈퍼스칼라 H/W, ALU, 레지스터 등)

멀티-코어 프로세서 : 여러 개의 CPU 코어들을 하나의 칩에 포함시킨 프로세서

○ 듀얼-코어 : 두 개의 CPU 코어 포함

○ 쿼드-코어 : 네 개의 CPU 코어 포함

칩-레벨 다중프로세서(chip-level- multiprocessor) 혹은 단일-칩 다중프로세서(multiprocessor-on-a-chip)이라고도 부름

 

듀얼-코어 프로세서

○ 단일-코어 슈퍼스칼라 프로세서에 비하여 2배의 속도 향상 기대

○ 코어들은 내부 캐시와 시스템 버스 인터페이스만 공유

○ 코어 별로 독립적 프로그램 실행 -> 멀티태스킹 혹은 멀티쓰레딩 지원

스레드(thread) : 독립적으로 실행될 수 있는 최소 크기의 프로그램 단위

단일-스레드 모델

각 코어가 스레드를 한 개씩 처리

○ 처리 중의 스레드에 대한 시스템 상태, 데이터 및 주소 정보를 레지스터 세트(RS)에 저장

레지스터 세트(RS) : 프로그램 카운터(PC), 스택포인터(SP), 데이터 레지스터, 주소 레지스터

멀티-스레드 모델 

○ 각 코어는 두 개의 RS들을 포함하며, 스레드를 두 개씩 처리

○ 두 스레드들이 CPU 코어의 H/W 자원들(ALU, 부동소수점유니트, 온-칩 캐시, TLB 등)을 공유

○ 처리 중의 각 스레드에 대한 시스템 상태, 데이터 및 주소 정보는 서로 다른 레지스터 세트(RS)에 저장

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

'두 개의 물리적 프로세서(physical processor)들이 네 개의 논리적 프로세서(logical processor)들로 구성되어 있다.' 

 

※ 물리적 프로세서 = 코어, 논리적 프로세서 = 쓰레드

 

관련글 더보기

댓글 영역