IT 프로그래밍/컴퓨터구조

[컴퓨터구조] 포워딩 hazard 위험

기술1 2024. 12. 18. 14:01
반응형

데이터 해저드 포워딩 해결법

  • 포워딩 : 이전 명령어의 결과를 WB 단계까지 기다리지 않고, 필요한 단계에서 바로 다음 명령어에 전달하여 데이터 해저드를 해결하는 기술
  • 스톨(stall/bubble) : 필요한 데이터가 준비될 때까지 파이프라인의 진행을 일시적으로 멈추는 것

 

R-type 명령어의 연산 결과는 EX 단계에서 계산됩니다. 

 

Load 명령어는 메모리 접근을 통해 데이터를 가져와야 하므로, 레지스터에 쓸 데이터는 MEM 단계에서 준비됩니다.

 

R-type 명령어가 데이터를 사용하는 시점은 ID 단계에서 피연산자 레지스터의 값을 읽어 EX단계에서 수행합니다.

 

Load 단계에서 주소 계산을 위해 ID 단계에서 레지스터 값을 읽고 EX에서 데이터를 사용합니다. 

 

Beq 명령어는 분기 판단이 ex단계에서 이루어지며, flushing 기법 적용 후의 경우 ID단계에서 이루어집니다. 

 

R-type 명령어의 결과를 바로 beq에서 사용하는 경우에는 flushing 명령어 수 줄이기 위한 기법이 적용된 후에서 beq 명령어는 ID 단계에서 데이터를 사용합니다. R-type 명령어의 결과는 EX 단계에서 나오므로, 포워딩을 통해 바로 전달할 수 있습니다. 따라서 stall의 개수는 forwarding을 하지 않은 상태를 가정하면 1cycle stall 이 발생합니다.

 

Load 명령어의 결과를 바로 beq(case2) 명령어에서 사용하는 경우 stall은 load 명령어에서는 MEM단계에서 결과가 나옵니다. Beq는 ID 단계에서 데이터를 사용하므로, 포워딩을 하더라도 2cycle의 stall이 필요합니다.

 

R-type 명령어 결과는 ex에서 나옵니다. load 명령어는 주소 계산을 위해 ID 단계에서 레지스터 값을 읽으므로, 포워딩을 통해 바로 전달할 수 있으니 stall의 개수는 0입니다. 

 

Load 명령어의 결과는 MEM 단계에서 나옵니다. R-type 명령어는 EX단게에서 데이터를 사용하므로, 포워딩을 하더라도 1cycle의 stall이 필요합니다. 

 

Hazard 해결방법

구조적 해저드 : 하드웨어 자원 부족으로 인해 발생하는 충돌 (동시에 접근하려고 할 때)

-하드웨어 자원 추가

-파이프라인 정지

-컴파일러 최적화

 

데이터 해저드 : 어떤 명령어가 이전에 실행된 명령어의 결과에 의존하는 경우 발생 

-forwarding : 이전 명령어의 결과를 기다리지 않아서 데이터 해저드에 적합

-bubble : 필요한 데이터 준비될 때까지 기다리는 것 

-code scheduling : 명령어 순서 재배치하여 파이프라인 효율성 높이는 기술, 데이터 해저드에서 독립적인 명령어 의존성 배치함으로써 스톨 발생 가능성 줄임

 

제어 해저드 : 분기 점프 인터럽트 등으로 인해 실행 흐름이 변경되어 발생하는 문제

-버블 : 필요한 데이터 준비될 때까지 기다리는 것 

-동적 분기 예측 : 과거 분기 실행 결과 이용 다음 분기 예측

-분기 지연 슬롯 : 분기 명령이 바로 뒤에 분기와 관계없이 실행될 명령어를 배치하는 방법 

 

control hazard 해결을 위해 분기 실행 시점을 앞당긴다고 가정을 해봅시다. 아마 기존에는 ALU를 통해 분기를 실행하겠지만 이제는 XOR을 사용해서 분기 여부를 판단하도록 변경해서 더 빠르게 할 수 있을 것입니다.

 

 

동적 분기 예측 사용

1-bit 예측기는 최근의 분기 결과만 사용합니다. 즉 이전에 분기가 일어났다면 다음에 또 분기가 일어날 것으로 예측하고 분기가 일어나지 않았다면 분기가 일어나지 않았다고 예측합니다.

 

T-T-T-T-NT 반복됩니다. 

 

  • 초기 상태: 예측기는 임의의 상태(예: NT)로 초기화됩니다.
  • 사이클 1 (T): 예측: NT, 실제: T. 예측 실패. 예측기는 T로 변경됩니다.
  • 사이클 2 (T): 예측: T, 실제: T. 예측 성공. 예측기는 T로 유지됩니다.
  • 사이클 3 (T): 예측: T, 실제: T. 예측 성공. 예측기는 T로 유지됩니다.
  • 사이클 4 (T): 예측: T, 실제: T. 예측 성공. 예측기는 T로 유지됩니다.
  • 사이클 5 (NT): 예측: T, 실제: NT. 예측 실패. 예측기는 NT로 변경됩니다.

-------------------------------------------------------------------------------------

  • 사이클 6 (T): 예측: NT, 실제: T. 예측 실패. 예측기는 T로 변경됩니다.
  • 사이클 7 (T): 예측: T, 실제: T. 예측 성공. 예측기는 T로 유지됩니다.
  • 사이클 8 (T): 예측: T, 실제: T. 예측 성공. 예측기는 T로 유지됩니다.
  • 사이클 9 (T): 예측: T, 실제: T. 예측 성공. 예측기는 T로 유지됩니다.
  • 사이클 10 (NT): 예측: T, 실제: NT. 예측 실패. 예측기는 NT로 변경됩니다

즉 위와 같이 5번 분기 중 3번만 예측에 성공합니다. 

 

포워딩 STALL 설명

포워딩은 이전 명령어의 결과를 다음 명령어의 EX 단계에서 사용하기 위해 전달하는 것이므로, 포워딩 여부는 EX 단계에서 결정됩니다. 

 

load-use 데이터 해저드 처럼 포워딩으로 해결할 수 없는 경우에는 스톨을 발생시켜야 합니다. 스톨을 발생시키는 것은 다음 명령어의 실행을 막는 것이므로, 이는 ID 단계에서 결정됩니다. ID 단계에서 load 명령어 직후에 해당 값을 사용하는 명령어가 오면 스톨을 발생시킬지 결정합니다.

 

이전 명령어의 EX 단계 결과는 "EX/MEM" 레지스터에 저장되어 있습니다.

 

현재 명령어의 rs 레지스터 번호는 "ID/EX 레지스터"에 저장되어 있습니다.

 

ID/EX.RegisterRs=EX.RegisterRd는 현재 명령어의 rs 레지스터 번호와 이전 명령어의 rd 레지스터 번호가 같은지 확인하는 조건입니다. 

 

 

 

반응형