본문 바로가기
컴퓨터구조

컴퓨터구조 11주차

by mokhwasomssi 2021. 3. 4.

2/22 월 ~ 2/28 일 : 4시간 34분

○○●○●/○○

 

 

2/24 수 : 2시간

2/26 금 : 1시간 4분

2/28 일 : 1시간 30분

 

 


4.6 파이프라인 데이터패스 및 제어

...이어서...

 

그림 4.36~4.38은 적재 명령어가 파이프라인의 다섯 단계를 통과해 감에 따라

활성화되는 데이터패스 부분을 파란색으로 보여 주고 있다. 

 

적재 명령어는 다섯 단계 모두에서 활성화되므로 적재 명령어를 첫 번째로 보였다. 

 

레지스터나 메모리가 읽힐 때는 레지스터 또는 메모리의 오른쪽 반을 강조하고

이들이게 쓰기가 행해질 때에는 왼쪽 반을 강조한다. 

 

각 그림에서 명령어 약어인 lw와 함께 활성화된 파이프 단계의 이름을 보여준다. 

다섯 단계는 다음과 같다. 

 

1. 명령어 인출(Instruction fetch)

 

그림 4.36의 위쪽 그림은 PC에 있는 주소를 사용하여 메모리로부터 명령어를 읽어 오고 IF/ID 파이프라인 레지스터에 저장하는 것을 보여 준다. PC 주소는 4만큼 증가되어 PC에 다시 저장됨으로써 다음 클럭 사이클에 사용될 수 있다. 이 증가한 주소는 IF/ID 파이프라인 레지스터에도 쓰이는데 이것은 beq와 같은 명령어처럼 뒤에 필요한 경우를 위해서이다. 컴퓨터는 어떤 종류의 명령어를 가져오고 있는지 모르기 때문에 어떤 명령어에 대해서도 대비해야 하며 잠재적으로 필요한 정보를 파이프라인을 따라 전달해야 한다. 

 

2. 명령어 해독 및 레지스터 파일 읽기(instruction decode and register file read)

 

그림 4.36의 아래 그림은 IF/ID 파이프라인 레지스터의 명령어 부분이 16비트 수치 필드(32비트로 부호확장됨) 값과 레지스터 번호 두 개를 제공하는 것을 보여 준다. 세 값 모두 증가한 PC 주소 값과 더불어 ID/EX 파이프라인 레지스터에 저장된다. 차후의 클럭 사이클에 어느 명령어에 의해 필요할지 모르는 것은 모두 전달한다. 

 

그림 4.36 / IF 및 ID : 명령어의 첫 번째와 두 번째 단계이며 그림 4.35의 데이터패스에서 활성화된 부분이 파란색으로 강조되어 있다.

적재 명령어는 단계 2에서 레지스터 1만을 필요로 하지만,

프로세서는 지금 어떤 명령어가 해독되고 있는지 젼혀 모른다.

따라서 프로세서는 16비트 상수를 부호확장하고 두 레지스터 모두 ID/EX 파이프라인 레지스터로 읽어 들인다.

세 개의 피연산자 모두를 필요로 하지는 않지만 세 개 모두를 유지하는 것이 제어를 간단하게 한다. 

 

 

3. 실행 또는 주소 계산(execute or address calculation)

 

그림 4.37은 적재 명령어가 ID/EX 파이프라인 레지스터로부터 레지스터 1의 내용과 부호확장된 수치를 읽고, ALU를 사용하여 이들을 더하는 것을 보여 준다. 합은 EX/MEM 파이프라인 레지스터에 저장된다. 

그림 4.37 / EX : 적재 명령어의 세 번째 파이프 단계. 그림 4.35의 데이터패스 중에서 이 단계에서 쓰이는 부분은 강조되어 있다. 

 

4. 메모리 접근 (memory access)

 

그림 4.38의 위쪽 그림은 적재 명령어가 EX/MEM 파이프라인 레지스터에서 주소를 받아서 데이터 메모리를 읽고 이 데이터를 MEM/WB 파이프라인 레지스터저장하는 것을 보여 준다. 

 

5. 쓰기 (write-back)

 

그림 4.38의 아래 그림은 마지막 단계를 보여 준다. MEM/WB 파이프라인 레지스터에서 데이터를 읽어서 그 데이터를 그림 중앙에 있는 레지스터 파일에 쓴다. 

그림 4.38 / MEM과 WB : 적재 명령어의 네 번째와 다섯 번째 파이프 단계

 

이 같이 적재 명령어를 따라가 보면 후속 파이프 단계에서 필요한 정보

모두 파이프라인 레지스터를 통해 그 필요 단계까지 전달되어야 한다는 것을 알 수 있다.


저장 명령어를 따라가 보면 후속 파이프 단계를 위해 정보를 전달해야 하는 것뿐만 아니라

명령어 실행도 유사하다는 것을 알 수 있다. 

 

다음은 저장 명령어의 다섯 단계이다. 

 

1. 명령어 인출

2. 명령어 해독 및 레지스터 파일 읽기

 

첫 두 단계는 모든 명령어에 의해 실행되는데, 왜냐하면 아직은 명령어 종류를 알기에는 너무 이르기 때문이다.

 

3. 실행 및 주소 계산

 

그림 4.39는 세 번째 단계를 보여 주는데 실제 주소(effective address)EX/MEM 파이프라인 레지스터에 저장된다.

 

그림 4.39 / EX : 저장 명령어의 세 번째 파이프 단계.

그림 4.37의 적재 명령어에 대한 세 번째 단계와는 달리

두 번째 레지스터 값이 EX/MEM 레지스터에 적재되는데 이 값은 다음 단계에서 사용된다.

이 두 번째 레지스터를 EX/MEM 파이프라인 레지스터에 항상 써 넣는 것이 해를 끼치지는 않지만,

파이프라인을 이해하기 쉽게 하기 위하여 저장 명령어일 때만 두 번째 레지스터를 쓰기로 한다. 

 

4. 메모리 접근

 

그림 4.40의 위쪽 그림은 데이터가 메모리에 써지고 있는 것을 보여 준다. 저장되어야 할 데이터를 가지고 있는 레지스터는 앞 단계에서 읽혔고 읽힌 값이 ID/EX에 저장되어 있다는 것을 기억하라. MEM 단계에서 데이터를 쓸 수 있게 하는 유일한 방법은 EX 단계에서 데이터를 EX/MEM 파이프라인 레지스터에 저장하는 것이다. 방금 전 실제 주소를 EX/MEM에다 저장했던 것과 비슷하다.

 

5. 쓰기

 

그림 4.40의 아래 그림은 저장 명령어의 마지막 단계를 보여 주고 있다. 이 명령어에 관해서는 쓰기 단계에서는 아무 일도 일어나지 않는다. 저장 명령어를 뒤따르는 명령어가 이미 진행 중이기 때문에 이 명령어들을 더 빨리 수행할 방법은 없다. 따라서 어떤 명령어가 특정 단계에서 아무 일을 하지 않아도 그 단계를 거쳐 가야 한다. 왜냐하면 뒤따르는 명령어들이 최고 속도로 이미 진행 중이기 때문이다.

 

그림 4.40 / MEM과 WB : 저장 명령어의 네 번째 및 다섯 번째 파이프 단계


앞선 파이프 단계에서 뒤의 파이프 단계로 무엇인가를 보내기 위해서는

그 정보가 파이프라인 레지스터에 저장되어야 한다는 것을 저장 명령어는 다시 한 번 보여 주고 있다. 

 

그렇지 않으면 다음 명령어가 그 파이프라인 단계에 들어올 때 그 정보는 잃어버리게 된다. 

 

저장 명령어의 경우에 ID 단계에서 읽었던 레지스터 중 하나를 MEM단계로 전달할 필요가 있는데

그 값이 MEM 단계에서 메모리에 저장되기 때문이다. 

이 데이터가 처음에는 ID/EX 파이프라인 레지스터에 저장되고 나중에 EX/MEM 파이프라인 레지스터에 전달된다.


적재 명령어와 저장 명령어는 두 번째 중요한 점을 보여 주고 있다.

 

데이터패스의 각 구성 요소, 즉 명령어 메모리, 레지스터 읽기 포트, ALU, 데이터 메모리, 레지스터 쓰기 포트 등은

한 파이프라인 단계에서만 사용될 수 있다. 

 

그렇지 않으면 구조적 해저드를 일으키게 될 것이다. 

따라서 이들 구성 요소와 그 요소들의 제어는 한 파이프라인 단계와 연관 지을 수 있다. 


이제 적재 명령어 설계에서의 문제점을 들추어 낼 수 있다. 

 

적재 명령어의 최종 단계에서 어느 레지스터가 변하는가?

좀 더 구체적으로 말하면 어느 명령어가 쓰기 레지스터 번호를 제공하는가?

IF/ID 파이프라인 레지스터에 있는 명령어가 쓰기 레지스터 번호를 제공하는데,

사실 이 명령어는 적재 명령어보다 상당히 뒤에 실행되는 명령어이다.

 

따라서 적재 명령어에 있는 목적지 레지스터 번호를 간직할 필요가 있다.

저장 명령어가 MEM 단계에서 사용하기 위해 ID/EX의 레지스터 내용을 EX/MEM 파이프라인 레지스터로 전달했듯이,

적재 명령어도 레지스터 번호ID/EX에서 EX/MEM을 거쳐 MEM/WB 파이프라인 레지스터로 보내야 WB 단계에서 사용할 수 있다. 


그림 4.41는 올바른 데이터패스를 보여 주고 있는데 쓰기 레지스터 번호를 먼저 ID/EX 레지스터로, 그 뒤에는 EX/MEM 레지스터로, MEM/WB 레지스터로 전달한다. 

이 레지스터 번호WB 단계에 쓰기를 행할 레지스터를 명시하기 위해 사용된다.

 

그림 4.41 / 적재 명령어를 제대로 처리하기 위해서 수정된 파이프라인 데이터패스

레지스터 번호는 ID 파이프 단계에서부터 MEM/WB 파이프라인 레지스터까지 전달되므로

이 마지막 세 개의 파이프라인 레지스터에 5비트가 추가된다.

 

그림 4.42는 워드 적재 명령어의 올바른 데이터패스를 하나로 그린 그림이다.

그림 4.42 / 그림 4.41의 데이터패스 중 적재 명령어가 사용하는 부분


...

 

금요일날 정리한 거 날라감

 

...


파이프라인 제어

4.3절에서 단일 사이클 데이터패스에 제어를 추가했던 것처럼 파이프라인 데이터패스제어를 추가한다. 

 

첫 번째 단계는 기존 데이터패스에 제어선 레이블을 붙이는 것이다. 

그림 4.46은 이러한 제어선을 보여 준다. 

 

그림 4.46 제어신호가 명시된 그림 4.41의 파이프라인 데이터패스

그림 4.17의 간단한 데이터패스용 제어로부터 가능한 한 많은 것을 빌려 온다. 

특히 똑같은 ALU 제어회로, 분기회로, 목적지 레지스터 번호 멀티플렉서, 제어선을 사용한다.


파이프라인 레지스터(IF/ID, ID/EX, EX/MEM, MEM/WB)들은

매 클럭 사이클마다 쓰기가 행해지기 대문에 쓰기 신호가 따로 없다. 

 

파이프라인을 위한 제어를 명시하기 위해서는 각 파이프라인 단계 동안의 제어 값들을 정하기만 하면 된다. 

 

각 제어선은 한 파이프라인 단계에서만 활성화되는 구성요소들과 관련 있기 때문에

제어선파이프라인 단계에 따라 다섯 그룹으로 나눌 수 있다. 

 

1. 명령어 인출

명령어 메모리를 읽고 PC 값을 쓰기 위한 제어신호들은 항상 인가되므로 이 파이프라인 단계에는 제어할 것이 없다.

 

2. 명령어 해독/레지스터 파일 읽기 

이전 단계와 같다. 

 

3. 실행/주소 계산

설정할 신호들은 RegDst, ALUOp, ALUSrc이다. 

이 신호들은 목적지 레지스터ALU 연산을 선택하고 Read data 2 와 부호확장된 수치 중 하나를 ALU의 입력으로 선택한다. 

 

4. 메모리 접근

이 단계에서 설정되는 제어선은 Branch, MemRead, MemWrite이다.

이 신호들은 각각 같을 시 분기, 적재, 저장 명령어일 때 설정된다. 

 

5. 쓰기

두 제어선은 MemtoRegRegWrite인데 

MemtoReg는 레지스터 파일에 ALU 결과를 보낼 것인가 메모리 값을 보낼 것인가를 결정하며

RegWrite는 선택된 값을 레지스터에 쓰게 하는 신호이다. 


데이터패스를 파이프라이닝하는 것이 제어선의 의미를 바꾸지는 않기 때문에 전과 같은 제어 값을 사용할 수 있다. 

그림 4.49는 4.4절에서와 같은 값을 갖지만 9개의 제어선파이프라인 단계에 의해 그룹화되어 있다.

 

그림 4.49


제어를 구현하는 것은 각 단계에서 9개의 제어신호의 값을 그 명령어에 해당하는 값으로 설정하는 것을 의미한다.

이렇게 하는 가장 간단한 방법은 제어 정보를 포함하도록 파이프라인 레지스터를 확장하는 것이다.

 

제어선들이 EX 단계에서 출발하기 때문에 제어 정보명령어 해독 단계 동안에 생성할 수 있다. 

 

그림 4.50은 명령어가 파이프라인을 흘러 내려가면서 제어신호들이 적당한 파이프라인 단계에서 사용되는 것을 보여준다. 

그림 4.50 마지막 세 단계를 위한 제어선들

그림 4.51은 확장된 파이프라인 레지스터와 해당 단계에 연결된 제어선을 가지고 있는 전체 데이터패스를 보여 준다. 

그림 4.51 제어신호들이 파이프라인 레지스터의 제어 부분에 연결된 그림 4.46의 파이프라인 데이터패스


4.7 데이터 해저드 : 전방전달 대 지연

이전 절에서 사용한 예제들은 파이프라인 실행의 위력과 하드웨어가 어떻게 그 임무를 수행하는가를 보여 주었다. 

 

그림 4.43에서 4.45까지에 나와 있는 명령어들독립적인 관계였었다. 

즉 어느 명령어도 다른 명령어들에 의해 계산된 결과를 사용하지 않았다. 

 

그러나 4.5절에서 데이터 헤저드가 파이프라인 실행에서 장애물이라는 것을 보았다. 

 

많은 종속성을 가지고 있는 프로그램을 살펴보자. 종송성은 파란색으로 표시되어 있다.

마지막 네 개의 명령어 모두 첫 번째 명령어의 레지스터 $2의 결과에 종속적이다. 

 

이 프로그램이 우리 파이프라인 기계에서 어떻게 수행될까?

그림 4.52다중 클럭 사이클 파이프라인 표현을 사용하여 이 명령어들의 실행을 보여 주고 있다. 

레지스터 $2의 값은 sub 명령어가 결과 값의 쓰기를 행하는 클럭 사이클 5의 중간에 바뀐다. 

 

그림 4.52 5개의 명령어 시퀀스의 파이프라인 종속성. 종송석을 보이기 위해 단순한 데이터패스를 사용하였다. 

 

sub와 add 같의 해저드는 레지스터 파일 하드웨어의 설계에 의해 해결될 수 있다. 

같은 클럭 사이클에서 쓰기는 앞부분에서 일어나고 읽기는 뒷부분에서 일어난다고 가정한다.

그러면 읽기는 새로 써진 값을 읽게 된다. 

실제 레지스터 파일의 많은 구현이 그렇듯이 이 예에서도 이런 데이터 해저드는 발생하지 않는다. 

 

and와 or 명령어 실행시 데이터 해저드가 발생하는데 이는 전방전달을 통해 코드들을 지연 없이 실행할 수 있다.