ILP(Instruction Level Parallelism)
- Moore's Law가 붕괴되면서 필연적으로 나올 수 밖에 없는 개념
- Pipelining, Superscalar, VLIW and EPIC
Pipelining
- Simple Pipelining
- 기본적인 파이프라이닝.
- Control Hazard와 Data Hazard 존재
- Forwarding / Stalling
- Rigid Sequencing. WB만 하고싶어도 MEM 사이클에 있긴 해야함
- 더 발전하기 위해 Dynamic Scheduling 도입
- Out of Order로 처리하자!
Dynamically Scheduled Processor
- 해결해야 할 문제들
- Structural Hazards : 아직 처리할 곳이 비지 않았을 수도
- RAW Data Hazard : 아직 Operand들의 값이 계산 중인 RAW
- WAR WAW Hazard
- Reservation Station
- Structural Hazard 해결 가능 (준비 안 되었으면 대기!)
- RAW 해결 가능 (마찬가지!)
- WAR and WAW
- In order일 때는 고민할 필요가 없었음. (당연하니깐!)
- Out of Order에서는 고민해야함
- Register Renaming으로 해결
- Exception
- Exception이 생기면 정확히 생긴 위치로 이동해야 함
- 하지만 우리는 Exception이 생긴 Inst가 언제 계산되었는지 알 수가 없음
- 그 전 Instruction이 처리되지 않았을 수도, 아니면 반대일 수도
- 그래서 Reordering Buffer가 필요. Commit 대기하다가 순서 맞추면 Commit
- Reordering Buffer (ROB)
- Register value을 Forwarding 하는 기능도
- 값이 이미 구해졌는지 확인하게 해 줌
- Dependence Through Memory
- Load 할 때 ROB 먼저 확인
- 있음 가져오기
- store하는 게 없으면 메모리 액세스
- 근데 만약 아직 정해지지 않은 주소로 store를 하려고 하면 ? 기다려야 함
- Load / Store Queue
- 그래서 이 검사를 빠르게 하기 위해 Load/Store Queue 사용
- Load Queue는 Queue(FIFO) 일 필요는 없음.
- 모든 Load에 대해 필요한 값이 나왔는지 동시에 체크
- Store Queue는 FIFO
- Store 할 수 있을 때 store
- RS와 하는 건 비슷
- Load 할 때 ROB 먼저 확인
- Superscalar Execution
- 한 번에 여러 개의 IF
Register Renaming
- Register Renaming을 어디서 할 것인가?
- Rename Register 개수
- in flight = RS + EX + LD + ST
- rename = RS + EX + LD
- ROB <= In flight
Prediction and Speculation
- Branch Prediction 같은 것들
- OoO Speculation도 Prediction의 일종
- ROB가 다 해줌. 일단 계산 후 ROB에 저장하고, 필요하면 쓰고, 필요없어지면 Squash
- Branch Target Buffer & Branch History Table
- 들로 Target address와 taken/not taken 여부 계산
- Return address stack
- return ( 어디로 리턴일지 모름) 을 위해 backtrace같이 주소 저장
- Memory data speculation
- 필요한 걸 예상해서 미리 가져오자
- Prefetching
- Coverage와 Accuracy 사이에서 타협해야함
- Coverage가 높으면 쓸데없는 것 많이 가져옴
- accuracy가 높으면 안 가져온 애들도 많음
- next value, next n value, stride 등 다양한 policy
- Coverage와 Accuracy 사이에서 타협해야함
- Speculation은 꼭 Dynamic할 때만 할 수 있는 것이 아님
- Compile할 때 비싼 operation들은 먼저 처리하고, 값을 따로 저장해서 branch 이후에 사용할 수도?
Simultaneous Multithreading
- Thread Scheduling Policies
- Coarse block scheduling
- coarse하면 작은 틈을 활용하긴 어렵지만, 큰 틈을 더 효과적으로 사용 가능
- Context Switch 할 틈도 주고.
- Fine grained block scheduling
- Fine grained하면 작은 틈 활용 가능
- 하지만 Context Switch 매우 어려움
- Simultaneous MT
- 그냥 막 써!
- Policies:
- Fair vs Prioritized
- Multiple PC, RF 필요
- 그 외 Thread Aware한 Branch Predictor 등등도
- Reservation Station은 고려 필요 없음
- Coarse block scheduling
- Superscalar와의 비교
- What to Fetch
- Superscalar에서는 가장 오래된 게 최고
- Speculation 많이 안 해도 되고, 필요한 값들 준비도 많이 되었을 것이고
- SMT에선 안 그럼
- Cache hit spec, branch spec 등등 다양한 policy 있음
- 그래서 크게 안 다름 ㅋㅋ
- Superscalar에서는 가장 오래된 게 최고
- What to Fetch
- Branch Prediction의 Cost와 Benefit 모두 다운~
- Rename register의 수, writeback port의 수 등이 대표적 병목