본문 바로가기

Computer Science/컴퓨터구조

[컴퓨터 구조] 산술 파이프라인

이 글은 www.youtube.com/watch?v=urbOizecd1Y&list=PLc8fQ-m7b1hD4jqccMlfQpWgDVdalXFbH&index=40보고 공부한 글입니다.

 

산술 파이프 라인

연산단계가 많다 = 세그먼트가 많다 = 파이프라인의 효율이 높다.

실수연산은 연산단계가 많다.

 

세그먼트별 연산

지수의 비교
가수의 정렬
가수의 연산
결과의 정규화

정수연산보다 실수연산이 빠르다
? 세그먼트가 많아서 파이프라인의 효율이 더 좋다.

 

명령어 파이프라인

cpu에 영향을 많이 준다.

 

명령 실행의 순차

1. 메모리(코드 세그먼트)에서 명령어 fetch (T0, T1, T2)
2.
명령어 디코딩 (T2)
3.
유효주소 계산 (T3)
4.
메모리에서 피연산자 fetch (명령어를 수행할 피연산자 fetch)
5.
명령어 실행f
6.
연산 결과의 저장

 

T0, T1, T2 – fetch 사이클
T3 –
간접주소 계산
T4 –
명령어 디코딩, 실행

 

 

명령어 파이프라인의4세그먼트

1. FI(Fetch Instruction)
2. DA(Decode and Address)
3. Fo(Fetch Operand)
4. Ex(execution)

 

분기곤란

Branch가 나타나면? 다음명령을 가져오는 것이 의미가 없다.
그러면 Fo, Ex가 끝날 때 까지 파이프 라인에 다른 값이 안들어오고 끝나야 branch된 주소의 명령을 fetch한다.

 

파이프 라인에 값이 안들어오니 비어있는데 파이프라인이 깨졌다 라고 한다.

 

프로그램 보면 for, while, if 문이 대부분이기 때문에 이는 branch하는 것과 같다.
파이프 라인에서 branch가 일어나면 파이프라인이 깨진다.

 

 

 

 

자원충돌

Fetch instruction, Fetch Operand가 동시에 일어날 수 없다. 왜냐하면 둘다 메모리에 접근해야하는데 버스는 하나이다.
이를 피하기 위해 버스를 2개두는 방법이 있다.

 

 

 

 

RISC 파이프라인

명령어 파이프라인 사용할 때


I:
명령어의 fetch
A: ALU
동작
E:
명령어의 실행

 

3단계로 실행된다

 

RISCload, store로만 메모리에 접근하고 계산은 레지스터 끼리만 한다.

 

(a)   그림에서R2를 로드하는 중에 3(Add)을 계산하려고 한다 => 데이터의존성 문제 발생

(b)  그래서 No-operation 아무것도 안하는 명령어지만 fetch하고 계산하고 실행한다. 지연된 load하고 한다.

 

 

 

branch 명령이 수행된 후에야 점프 해간곳의 명령을 fetch 하게 해야 한다.

2개의 명령을 끼워 넣어서 해결했다.

다르게 해결하면 branch를 먼저하고 수행되야할 것 2개를 브런치 중에 실행한다.
이 과정은 컴파일러가 한다.

 

728x90