2024. 4. 19. 14:25ㆍ카테고리 없음
목차
2.3 명령어 파이프라이닝 43-65
2.4 명령어 세트 66-77
< 2.3 명령어 파이프라이닝(instruction pipelining) >
- CPU의 프로그램 처리 속도를 높이기 위하여 CPU 내부 하드웨어를 여러 단계로 나누어 동시에 처리하는 기술
1. 2-단계 명령어 파이프라인(two-stage instruction pipeline)
> 명령어를 실행하는 하드웨어를 인출 단계(fetch stage)와 실행 단계(execute stage)라는 두 개의 독립적인 파이프라인 모듈로 분리
> 두 operation이 독립적이어야 한다.
> 두 단계들에 동일한 클록을 가하여 동작 시간을 일치시키면,
~> 첫 번째 클록 주기에서는 인출 단계가 첫 번째 명령어를 인출
~> 두 번째 클록 주기에서는 인출된 첫 번째 명령어가 실행 단계로 보내져서 실행되며, 그와 동시에 인출 단계는 두 번째 명령어를 인출(선인출, prefetch)

* 속도향상(Sp) = 6/4 = 1.5배 / 실행되는 명령어 수 증가 시, Sp = 2배에 접근
- 2-단계 파이프라인을 이용하면 처리 속도가 두 배 향상
- 문제점: 두 단계의 처리 시간이 동일하지 않으면 두 배의 속도 향상을 얻지 못함(파이프라인 효율 저하)
> 해결책: 파이프라인 단계를 세분하여, 각 단계의 처리 시간을 (거의) 같아지도록 함
~> 파이프라인 단계의 수를 늘리면 전체적으로 속도향상(speedup)이 더 높아짐
2. 4-단계 명령어 파이프라인
1) 명령어 인출(IF) 단계: 다음 명령어를 기억장치로부터 인출
2) 명령어 해독(ID) 단계: 해독기(decoder)를 이용하여 명령어를 해석
3) 오퍼랜드 인출(OF) 단계: 기억장치로부터 오퍼랜드를 인출
4) 실행(EX) 단계: 지정된 연산을 수행

3. 파이프라인에 의한 전체 명령어 실행 시간
> 파이프라인 단계 수 = k
> 실행할 명령어의 수 = N
> 각 파이프라인 단계가 한 클록 주기씩 걸린다고 가정한다면?
- 파이프라인에 의한 전체 명령어 실행 시간(Tk):

> 즉 첫 번째 명령어를 실행하는데 k주기가 걸리고, 나머지 (N-1)개의 명령어들은 각각 한 주기씩만 소요
[ 비교 ] 파이프라인 되지 않은 경우의 N개의 명령어들 실행 시간(T1):

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

- [ 예제 2-1 ] 파이프라인에 의한 속도 향상
> 파이프라인 단계 수 = 4,
파이프라인 클록 = 1GHz (각 단계에서의 소요시간 = 1ns)일 때, 10개의 명령어를 실행하는 경우의 속도향상은?
- [ 풀이 2-1 ] 파이프라인에 의한 속도 향상
> 첫 번째 명령어 실행에 걸리는 시간 = 4ns
다음부터는 1ns마다 한 개씩의 명령어 실행 완료
10개의 명령어 실행 시간 = 4 + (10-1) = 13ns
~> 속도향상(Sp, speedup) = (10x4) / 13 = 3.08...배
- 파이프라인에 의한 이론적 속도 향상
N: CPU가 실행하는 명령어 수라면,
N = 100일 때, Sp = 400.103 = 3.88
N = 1000일 때, Sp = 4000/1003 = 3.988
N = 10000일 때, Sp = 40000/10003 = 3.9988
N → ∞ 일 때는 Sp → 4 (이론적 속도향상)
5. 파이프라인의 효율 저하 요인들(시험 출제 가능)
- 모든 명령어들이 파이프라인 단계들을 모두 거치지는 않는다.
> 어떤 명령어에서는 오퍼랜드를 인출(OF)할 필요가 없지만, 파이프라인의 하드웨어를 단순화시키기 위해서는 모든 명령어가 네 단계들을 모두 통과하도록 해야 한다.
- 파이프라인의 클록은 처리 시간이 가장 오래 걸리는 단계를 기준으로 결정된다.
- IF 단계와 OF 단계가 동시에 기억장치를 엑세스하는 경우에, 기억장치 충돌(memory conflict)가 일어나면 지연이 발생한다.
* 데이터 버스(data bus)는 하나이다. 따라서 충돌이 일어나면 기다림(지연) 발생이 가능하다.
- 조건 분기(conditional branch) 명령어가 실행되면, 미리 인출하여 처리하던 명령어들이 무효화된다.
* JUMP 명령어 실행 시, 미리 인출하여 처리하던 명령어 버릴 수 있다.
6. 조건 분기가 존재하는 경우의 시간 흐름도
[ 예 ] 명령어3: JZ 12 ; jump (if zero) to address 12

7. 분기 발생에 의한 성능 저하의 최소화 방법
1) 분기 예측(branch prediction)
> 분기가 일어날 것인지를 예측하고, 그에 따라 명령어를 인출하는 확률적 방법
> 분기 역사 표(branch history table)을 이용하여 최근에 분기 결과를 참조
2) 분기 목적지 선인출(prefetch branch target)
> 조건 분기가 인식되면, 분기 명령어의 다음 명령어 뿐만 아니라 분기의 목적지 명령어도 함께 인출하여 실행하는 방법(조건 확인 결과에 따라 명령어를 선택하여 실행)
3) 루프 버퍼(loop buffer) 사용
> 파이프라인의 명령어 인출 단계에 포함되어 있는 작은 고속 기억장치인 루프 버퍼에 가장 최근 인출된 n개의 명령어들을 순서대로 저장해두는 방법
4) 지연 분기(delayed branch)
> 분기 명령어의 위치를 재배치함으로써 파이프라인의 성능을 개선하는 방법
8. 상태 레지스터(status register)
- 명령어 실행 결과에 따른 조건 플래그(condition flag)들 저장
- 조건 플래그의 종류

> 부호 (S) 플래그: 직전에 수행된 산술연산 결과값의 부호 비트를 저장(양수: 0, 음수:1)
> 영(Z) 플래그: 연산 결과값이 0이면, 1로 세트
> 올림수(C) 플래그: 덧셈이나 뺄셈에서 올림수(carry)나 빌림수(borrow)가 발생한 경우에 1로 세트
> 동등(E) 플래그: 두 수를 비교한 결과가 같게 나왔을 경우에 1로 세트
> 오버플로우(V) 플래그: 산술 연산 과정에서 오버플로우가 발생한 경우에 1로 세트
> 인터럽트(I) 플래그:
~> 인터럽트 가능(interrypt enabled) 상태이면, 0으로 세트
~> 인터럽트 불가능(interrupt disabled) 상태이면, 1로 세트
> 슈퍼바이저(P) 플래그:
~> CPU의 실행 모드가 슈퍼바이저 모드(supervisor mode)이면, 1로 세트
~> 사용자 모드(user mode)이면, 0으로 세트
< 2.2.3 슈퍼스칼라(Superscalar) >
1. 슈퍼스칼라
- CPU의 처리 속도를 더욱 높이기 위하여 내부를 두 개 혹은 그 이상의 명령어 파이프라인들을 포함시킨 구조
- 매 클록 주기마다 각 명령어 파이프라인이 별도의 명령어를 인출하여 동시에 실행할 수 있기 때문에, 이론적으로는 프로그램 처리 속도가 파이프라인의 수만큼 향상 가능
- 파이프라인의 수 = m
> m-way 슈퍼스칼라
2. 2-way 슈퍼스칼라의 명령어 실행 흐름도

3. 슈퍼스칼라에 의한 속도향상(Sp, speedup)
- 단일 파이프라인에 의한 실행 시간(N: 실행할 명령어 수)

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

- 속도향상

- 명령어 수

- 슈퍼 스칼라의 속도 저하(Sp < m) 요인
> 명령어들 간의 데이터 의존 관계(critical !!)
> 하드웨어(레지스터, 캐시, 기억장치 등) 이용에 대한 경합 발생
~> 동시 실행 가능한 명령어 수 < m
- 해결책
> 명령어 실행 순서 재배치
~> 명령어들 간의 데이터 의존성 제거(독립적인 명령어를 먼저 시행)
> 하드웨어 추가(중복) 설치
~> 하드웨어(레지스터, 캐시 등)에 대한 경합 감소(레지스터 하나 추가 등)
< 2.3.4 듀얼-코어 및 멀티-코어 >

1. CPU 코어(core)
> 명령어 실행에 필요한 CPU 내부의 핵심 하드웨어 모듈(슈퍼프칼라 H/W, ALU, 레지스터, Cache Memory 등)
> CPU 코어 == 단일칩 멀티프로세서
- 멀티-코어 프로세서(multi-core processor)
: 여러 개의 CPU 코어들을 하나의 칩에 포함시킨 프로세서
> 듀얼-코어(dual-core): 두 개의 CPU 코어 포함
> 쿼드-코어(quad-core): 네 개의 CPU 코어 포함
> 헥사-코어(hexa-core), 옥타-코어(octa-core)도 출시 중
- 칩-레벨 다중프로세서(chip-level multiprocessor) 혹은 단일-칩 다중프로세서(multiprocessor-on-a-chip)이라고도 부름
2. 듀얼-코어 프로세서
- 단일-코어 슈퍼스칼라 프로세서에 비하여 2배의 속도 향상 기대
* PC가 2개이므로 제약조건이 없으며, 의존성이 큰 문제가 되지 않아 더 빠르다
- 코어들은 내부 캐시와 시스템 버스 인터페이스만 공유
- 코어 별로 독립적인 프로그램 실행
~> 멀티-태스킹(multi-tasking) 혹은 멀티-스레딩(multi-threading) 지원

3. 멀티-스레딩
- 스레드(thread)
: 독립적으로 실행될 수 있는 최소 크기의 프로그램 단위
- 단일-스레드 모델(그림 a)
: 각 코어가 스레드를 한 개씩 처리
> 처리 중의 스레드에 대한 시스템 상태, 데이터 및 주소 정보를 레지스터 세트(RS, Register Set)에 저장
> RS: PC, SP, 상태 레지스터, 데이터레지스터, 주소 레지스터 등
* 기억하자. PC와 SP는 레지스터 세트RS에 포함된다는 것을! \ㅇ0ㅇ/

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

- 듀얼-코어 멀티-스레드 프로세서
: '두 개의 물리적 프로세서(physical processor)들이 네 개의 논리적 프로세서(logical processor)들로 구성되어 있다'라고 정의하기도 함
- 멀티-코어 멀티-스레드 프로세서의 사례
> Intel i7-8500Y: 2-코어 4-스레드 프로세서
~> 2개의 연산장치(제어장치), 4개의 스레드
> Intel i7-8565U: 4-코어 8-스레드 프로세서
~> 4개의 연산장치(제어장치), 8개의 스레드