Pipeline

한 cycle 당 instruction 하나를 모조리 실행하는 단일 사이클 방식은 이미 지나간 데이터 패스 자원이 명령어가 끝나고 다음 명령어가 들어올 때 까지 놀고 있기 때문에, 이런 자원을 계속 돌리기 위해 명령어를 멀티 사이클로 나누고 병렬로 실행하는 방식.

하나의 instruction을 ``c 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

다음 명령어가 다음 클럭 사이클에 실행될 수 없는 상황을 해저드라고 한다.

구조적 해저드 (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., 후방분기는 분기가 항상 일어난다고 예측하고

전방분기는 분기가 일어나지 않는다고 예측하는 방식.

루프는 후방분기로, ``c if``등은 전방분기로 컴파일 된다고 생각하면 루프는 항상 taken, ``c if``는 항상 not taken으로 예측하게 된다.


동적 예측

분기 명령어의 분기 이력을 기록해두고, 분기 예측에 이를 사용하는 방식. 

보통 2-bit로 ``c Taken <> Taken <> Not Taken <> Not Taken``으로 상태가 전이된다.




'OS > Kernel' 카테고리의 다른 글

Deadlock 데드락  (0) 2018.10.04
Meltdown 정리  (0) 2018.05.26
CVE-2017-1000112 : Exploitable memory corruption due to UFO to non-UFO path switch  (0) 2017.11.08
[kernel] current 구조체 / cred 수정  (0) 2017.10.22
[kernel] hook sys_call_table  (0) 2017.10.20