Post

파이프라이닝과 해저드

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으로 상태가 전이된다.

This post is licensed under CC BY 4.0 by the author.