Flow dependence (true data dependence, Read After Write)


Anti dependence (Write After Read)
Output dependence (Wrtie After Write)
Anti랑 Output은 진짜 value에 대한 dependence가 있다 이것보단 name에 대한 dependence가 있다고 표현함 → register 수가 부족해서 발생하는 dependence



이전의 ROB는 content-addressable 방식이라, register ID(content of array) 가지고 ROB를 일일이 다 찾아봐야 하는 문제가 있음
→ HW cost가 너무 크고, 너무 느림
→ register file에 TAG를 둬서, 이 register의 최신 값이 ROB의 어디에 있는지도 알려주자
→ register file의 valid bit 가 0이라면, TAG에 최신 값이 저장된 ROB entry ID를 저장해둠
→ ROB를 더 이상 content-addressable이 아닌 인덱스로 접근 가능한 random access 구조로 바꿈
→ TAG를 덮어써서 최신 값 위치를 계속 수정할 수도 있음
Anti, Output dependence는 레지스터 수가 부족해서 발생하는 dependence이므로, ROB+TAG (즉 register renaming)을 쓰면, 마치 많은 레지스터가 있는 것처럼 동작해서 이러한 의존성을 제거할 수 있음
ROB를 사용하는 구조는 precise exeption을 구현하기 쉬움
→ ROB가 모든 instr 결과를 in order로 관리하기 때문에 예외가 발생하면 뒷 entry는 commit 안 하면 돼
Anti, Output dependence 제거 가능
ROB를 사용하면, 아직 register file에 commit 되지 않은 결과값을 가져오기 위해, ROB에 직접 접근해야 하는 추가 단계(indirection이라 표현)가 필요
→ 그 전에는 register만 확인했는데, invalid의 경우 ROB까지 확인해야 하므로 latency, complexity 증가

compile-time instruction scheduling
out-of-order execution