CS/컴퓨터구조(Mano)

[컴퓨터구조] ch.9 파이프라인과 벡터 처리 (3) RISC 파이프라인

하늘아래현서 2024. 10. 15. 23:43
Mano의 컴퓨터시스템구조 제3판, 프로텍 미디어, 김종상 옮김 도서를 정리, 요약하는 글입니다.

 

1. RISC 파이프라인

- RISC은 파이프라인을 효과적으로 이용할 수 있다는 장점이 있다. 명령어 집합이 단순하기 때문에 한 클럭 사이클에 수행되는 소수의 부연산 파이프라인을 구성할 수 있는 것이다. 또한 고정된 길이의 명령어 형식을 사용하므로 유효 주소를 계산하고 메모리로부터 피연산자를 읽어올 필요가 없다. 그리고 모든 피연산자가 레지스터에 있으므로 유효 주소를 계산하여 메모리로부터 피연산자를 읽어올 필요가 없다. 따라서 2-3개의 세그먼트로 명령어 파이프라인을 구성할 수 있다.

- RISC은 데이터 전송을 load, store 명령어에만 제한되어 있으므로 레지스터 간접 어드레싱을 사용하기 때문에 3-4 파이프라인 단계가 필요하다. 또한 자원 충돌을 방지하기 위해 명령어와 데이터에 대해 각각 분리된 메모리를 사용한다. 

 

2. 3 세그먼트 명령어 파이프라인

- I : 명령어 fetch

- A : ALU 동작

- E : 명령어 실행

 

A 세그먼트에서 명령어가 디코드 되고 ALU 에서 수행한다. ALU에서는 디코드된 결과에 따라 데이터를 처리하거나, 유효 주소를 계산하거나, 프로그램 제어 명령어를 위한 분기 주소를 계산한다. E 세그먼트에서 ALU 동작의 결과를 목적지 레지스터에 전송하고 유효 주소를 데이터 메모리로 전송하고 분기 주소를 프로그램 카운터로 전송한다.

 

3. 지연된 로드(delayed load)

LOAD : R1 ← M[addr1]

LOAD : R2  M[addr2]

ADD : R3  R1 + R2

STORE : M[addr3]  R3

 

- 위와 같은 코드가 있다고 할 때, 3 세그먼트 파이프라인에서 인터럽트 없이 수행되면 다음과 같은 문제가 생긴다.

- 4번째 clock에서, R2의 데이터를 load 하고 있는 중인데 R2와 R1의 데이터를 add 해야한다. R2에는 데이터를 전송 중이므로 아직 값이 없다. 즉 자원 충돌이 발생한다. 이런 경우에는 아래와 같이 메모리 데이터를 사용하는 명령어 아래에 no operation 명령어를 삽입하여 클럭 사이클이 낭비되도록 하여 처리할 수 있다.

- no operation 명령을 추가하여, 4 clock에서 데이터 충돌을 피할 수 있다. 이렇게 메모리에서 로드된 데이터의 사용을 지연시키는 것을 지연된 로드(delayed load)라 한다. 이 방법은 데이터 의존성 문제를 하드웨어가 아닌 컴파일러로 처리할 수 있고, 세그먼트를 간단한 하드웨어로 만들 수 있다는 장점이 있다. 

 

4. 지연된 분기 예시

- 분기 명령어로 인해 파이프라인은 지연이 될 수 있다. 그럴 경우 RISC 프로세서는 컴파일러에 의존한 방법을 사용한다. 그 중 지연된 분기(delayed branch)는 지연 부분에 적절한 명령어를 삽입하여 프로그램 순서를 재배치하는 것이다. 아래가 그 예시이다.

- 첫 번째 방법은 branch 명령 다음에 두 개의 no operation 명령을 삽입하는 것이다. 그러면 분기 주소 X는 7번째 clock에 PC로 전송되고, 8번째 clock에 fetch된다.

 

- 두 번째 방법은 branch 명령을 두 칸 위로 올리는 것이다. 이렇게 하면 다른 명령어들이 fetch되고 실행되는 동안 분기 명령어 실행은 다른 세그먼트에서 가능하다. 분기로 인한 지연이 없어진 것을 제외하고 원래의 순서에 의한 명령어 실행과 동일하게 작동한다.