[컴퓨터구조] ch.9 파이프라인과 벡터 처리 (2) 명령어 파이프라인
Mano의 컴퓨터시스템구조 제3판, 프로텍 미디어, 김종상 옮김 도서를 정리, 요약하는 글입니다.
1. 명령어 파이프라인
- 명령어 흐름도 파이프라인으로 처리할 수 있다. 명령어 파이프라인은 이전 명령어가 다른 세그먼트에서 실행되고 있는 동안 다음 명령어를 읽어온다. 하지만 이 방법은 명령어의 흐름에서 분기가 발생하면 모든 파이프라인이 비워져야 하고 분기 명령어 이후에 메모리에서 읽어온 명령어도 무시해야 한다는 단점이 있다.
- 명령어 fetch 장치와 명령어 실행 장치, 2가지의 세그먼트 파이프라인을 구성한다고 하면, 명령어 fetch 장치는 FIFO 버퍼에 의한 queue로 구현한다. 실행 장치에서 메모리를 사용하지 않을 때는 언제나 프로그램 카운터를 하나 증가시켜서 FIFO 버퍼로 다음 명령어를 읽어온다. 그리고 명령어들은 큐 안에서 실행 장치가 디코딩하기를 기다린다.
- 명령어 파이프라인이 최고 속도로 동작하지 못하는 이유는, 각 세그먼트들의 수행 시간이 서로 다르고, 어떤 명령어에 대해서는 수행되지 않는 세그먼트도 있다(예를 들어, 유효 주소 계산이 필요하지 않은 경우) 결국, 명령어 파이프라인은 명령어 사이클이 모두 동일한 시간의 세그먼트로 나누어졌을 때 가장 효율적으로 수행된다.
2. 4 세그먼트 명령어 파이프라인
- 4개의 세그먼트 파이프라인을 가진 CPU의 명령어 사이클이 수행되는 과정은 그림과 같다. 여기서 명령어의 디코딩과 유효주소 계산이 한 세그먼트에서 수행되고, 모든 명령어의 결과는 프로세서 레지스터에 저장된다고 가정한다.
- 순차적으로 명령어가 실행되다가 정상적인 실행 순차를 벗어나는 제어 명령어가 있을 수 있다. 혹은 인터럽트가 발생할 수도 있다. 그럴 경우 마지막 두 세그먼트에서 도달해 있는 동작들은 수행 완료하지만 명령어 버퍼에 들어 있는 모든 정보는 무시한다. 그리고 파이프라인은 프로그램 카운터에 저장되어 있는 새로운 주소로부터 다시 동작을 재개한다.
- FI : 명령어 fetch 세그먼트
- DA : 명령어 decode하고 유효 주소 계산하는 세그먼트
- FO : 피연산자 fetch 세그먼트
- EX : 명령어 실행하는 세그먼트
- 명령어 파이프라인의 시간 관계를 표현하면 위와 같다.
- 4번째 step을 보면 명령어 1이 EX 세그먼트에서 실행되고, 명령어 2는 FO 세그먼트에서 피연산자가 fetch 되고, 명령어3은 DA 세그먼트에서 명령어 디코드하며, 명령어 4는 FI 세그먼트에서 명령어가 fetch된다.
- 예를 들어서, 명령어 3이 분기 명령이였다고 하면, 4번째 step에서 DA 세그먼트에서 명령어가 디코드되면(즉 분기 명령인 것을 알게 되면) 6번째 step에서 실제로 분기 명령이 EX 세그먼트에서 실행이 되기 까지 다른 명령들은 진행되지 못한다. 4번째 단계에서 FI는 그 이후 DA를 실행하지 못하게 됨을 알 수 있다. 그리고 실제로 분기 명령이 발생한다면 7번째 step에서 새로운 명령어가 처음부터 fetch된다.
- 위 그림과 같이, EX 세그먼트는 메모리에 결과를 저장하려고 하고, FO 세그먼트는 피연산자를 fetch하기 위해서 메모리에 접근한다. 둘 다 메모리에 접근하기 때문에 동시에 실행이 불가능하다.
- 그리고 원서에는 나와있지 않지만, FO 세그먼트도 메모리 접근이 필요하고, FI도 명령어 fetch를 위해서 메모리 접근이 필요하므로 동시 실행이 불가능하다.
- 명령어 파이프라인이 정상 동작에 벗어나게 하는 원인은 다음과 같다.
(1) 자원 충돌 : 두 세그먼트가 동시에 메모리에 접근하는 경우, 이러한 충돌은 명령어 메모리와 데이터 메모리를 분리함으로써 해결 가능하다.
(2) 데이터 의존성 : 어떤 명령어가 이전 명령어의 결과에 의존하여, 수행하려고 하는 데 그 갓이 아직 준비되지 않은 경우.
(3) 분기 곤란 : 분기 명령어같이 PC 값을 변경시키는 명령어에 의하여 발생.