파이프라이닝과 해저드
Pipeline
한 cycle 당 instruction 하나를 모조리 실행하는 단일 사이클 방식은 이미 지나간 데이터 패스 자원이 명령어가 끝나고 다음 명령어가 들어올 때 까지 놀고 있기 때문에, 이런 자원을 계속 돌리기 위해 명령어를 멀티 사이클로 나누고 병렬로 실행하는 방식. 하나의 instruction을 IF - ID - EX - MEM - WB
5 stage로 나누고, 한 cycle 당 한 stage 씩 실행하는데 각 stage를 병렬적으로 실행하는 방식이다. 하나의 명령어를 실행하는데 5 cycle이 필요한 것 처럼 보이나, 명령어 100개를 파이프라인에 넣고 돌린다고 생각해보면 처음 파이프라인에 명령어를 투입할 때(fill)와 파이프라인에서 마지막 명령어가 빠질 때(drain)를 제외하고는 한 cycle에 하나의 명령어가 완료된다는 것을 알 수 있다. 파이프라인에서는 stage 중 가장 긴 latency time이 곧 clock cycle time이 된다. 그리면서 해보면 이해된다. 이는 가장 긴 latency time에 맞춰서 clock이 발생한다는 의미이기도 하다.
Hazard
https://en.wikipedia.org/wiki/Hazard_(computer_architecture) 다음 명령어가 다음 클럭 사이클에 실행될 수 없는 상황을 해저드라고 한다.
구조적 해저드 (Structural hazard)
원인 : 부족한 하드웨어 구성요소 해결방안 : 파이프라인 지연(pipeline stall) 구성요소를 중복 lw, sw
명령어가 메모리에 접근하면, 메모리를 이미 사용중이므로 그 cycle에는 IF 등으로 명령어를 가져올 수 없는 문제. 명령어 메모리와 데이터 메모리를 분리하면 해결 가능.
데이터 해저드 (Data hazard)
원인 : 데이터 종속성 (data dependency) 해결방안 : 파이프라인 지연(pipeline stall) 전방전달(forwarding, bypassing) 종류 : RAW, WAR, WAW (RAR은 Hazard가 아니다.) 이 중 basic five-stage pipeline에서 문제가 되는 것은 RAW.
제어 해저드 (Control hazard, branch hazard)
원인 : 조건 분기 명령어 해결방안 : 파이프라인 지연(pipeline stall) 분기 예측(branch prediction) : 정적 예측 / 동적 예측 지연 분기(delayed branch) 분기 명령어가 나오면 그 다음 명령어가 둘 중 뭐가 될지 모르니 파이프라인에 집어넣을 수 없는 문제.
분기 예측(branch prediction)
정적 예측
e.g., 후방분기는 분기가 항상 일어난다고 예측하고 전방분기는 분기가 일어나지 않는다고 예측하는 방식. 루프는 후방분기로, if
등은 전방분기로 컴파일 된다고 생각하면 루프는 항상 taken, if
는 항상 not taken으로 예측하게 된다.
동적 예측
분기 명령어의 분기 이력을 기록해두고, 분기 예측에 이를 사용하는 방식. 보통 2-bit로 Taken <> Taken <> Not Taken <> Not Taken
으로 상태가 전이된다.