<파이프라이닝(Pipelining)>
명령어를 순차적으로 실행하는 프로세서에 적용되는 기술로, 한 번에 하나의 명령어만 실행하는 것이 아니라
하나의 명령어가 실행되는 도중에 다른 명령어를 실행을 시작하는 식으로 동시에 여러 개의 명령어를 실행하는 기법이다.
이렇게 동시에 여러 개의 명령어를 처리함으로써 처리량을 올리는 것이 파이프라이닝이다.
각 단계를 수행하는 속도가 빨라지는 것이 아니라 원래의 동작속도대로 일을 해 나가지만 병렬적으로 처리를 함으로써
쉬는 시간을 없애 전체 처리량을 올려 많은 작업을 빠른 시간 내에 처리할 수 있도록 하는 것이다.
가장 효율적인 파이프라인 조건은 단계별 처리 시간이 일정한 것이고 각 명령의 처리 단계가 균일한 것이다.
파이프라인의 성능을 저하시키는 원인들이 있는데 이것들을 해저드(hazard)라고 하고 해저드의 종류는 세 가지가 있다.
구조적 해저드(Structural Hazard) : 실행 중인 2개 이상의 명령어가 동일한 하드웨어 자원을 동시에 요구하는데 하드웨어가 여러 명령들의 수행을 지원하지 않기 때문에 발생한다. 자원 충돌 (resource conflicts)이라고도 한다.
데이터 해저드(Data Hazard) : 아직 명령어가 끝나지 않은 register에 접근하여 명령어를 실행하려고 할 때 나타난다. 데이터 해저드는 3가지 종류로 나뉜다.
RAW : Read After Write (true dependency)
앞에서 사용한 데이터를 아직 한 파이프가 다 돌지 못해서 기록되지 않은 상태여서 변경되지 않은 데이터를 사용할 수 없으므로 기다려야 하게 되는 것이다. 데이터 의존성에 의해 생긴다.데이터 의존성이란 앞뒤 명령어가 다음 명령어의 실행에 영향을 끼치는 상황이다.
WAW : Write After Write(output dependency)
2가지 일이 같이 일어나 같은 공간에 먼저 쓰인 데이터가 나중에 쓰인 데이터에게 덮여서 사라지는 상황이다.
WAR : Write After Read (Anti - Dependency)
2가지 일이 같이 일어났을 때 의존성이 있는 관계의 데이터들이 일의 순서에 따라 결과가 달라지는 상황이다.
제어 해저드(Control Hazard) : 분기(Jump, Branch 등) 명령어에 의해서 발생한다. 분기를 결정된 시점에, 잘못된 명령이 파이프라인에 있기 때문에 발생한다.
분기: 명령 수행이 조건에 의해 순차적인 정상 순위에서 벗어나는 것. 또는, 이러한 일을 수행하는 기계어
<비순차적 실행(Out-of-Order Execution)>
데이터 해저드(Data Hazard)를 해결하기 위해 만들어진 기법이다.
순차적 명령어 처리 기법으로 생기는 불필요한 기다림으로 인한 CPU의 효율 저하를 방지하기 위해 그 뒤에 있는
앞의 결과에 종속적이지 않은 명령어를 먼저 처리하는 명령어 처리 기법이다. 컴파일러가 ISA 구현의 세부사항을 몰라도 효율적으로 실행하게끔 하는 것이 가능하다. 하지만 비순차적 명령어가 안 쓰일 때의 결과와 쓰일 때의 결과가 똑같을 때에만 실행된다. 인텔 CPU와 ARM Cortex-A 시리즈 기종에서만 발생하는 멜트다운 취약점(커널 메모리를 읽을 수 있는 치명적인 취약점)이 발생할 수 있다.
<분기 예측(Branch Prediction)>
제어 해저드(Control Hazard)를 해결하기 위해서 만들어진 기법이다. 조건 분기문에 대하여 taken(참)과 거짓(not taken) 중에 하나를 예측해서 예측한 곳에 있는 명령어들을 인출하고 예측으로 실행을 하는 것이다. 예측 실행한 것들의 결과는 레지스터에 기록하지 않는다. 목적지가 결정된 후에 예측 실행이 옳았으면 실행 결과를 레지스터에 갱신하고 예측이 틀렸으면 실행결과를 버리고 프로그램 카운터를 올바른 위치로 복구하고 다시 실행한다. 분기 예측으로 인해서 스펙터 취약점(다른 유저의 프로그램 메모리를 훔쳐볼 수 있음)이 발생할 수 있다. 정적 분기 예측과 동적 분기 예측이 있다.
정적 분기 예측(Static Branch Prediction): 코드 실행 기록에 대한 정보에 의존하지 않고, 분기 명령만을 기반으로 분기의 결과를 예측한다. 분기의 방향이 순방향이면 분기를 타지 않고, 역방향이면 분기를 타는 방식이다.
동적 분기 예측(Dynamic Branch Prediction): 분기가 됐는지 안됐는지 과거 이력을 보고 그것을 바탕으로 예측하는 방식이다.
<추측 실행(Speculation Execution)>
추측 실행은 최신 프로세서에 탑재된 성능 향상 기능이고 CPU는 추측 실행을 통해 메인 계산 스레드와 병렬로 작업을 미리 실행한다. 분기 예측은 추측 실행의 한 종류라고 할 수 있다.
명령을 실행하는 중에 필요한 데이터가 없어서 진행이 안되고 있을 때 성능을 위해서 그 없는 데이터를 예측해서 먼저 실행하는 기법이다. 예측이 맞으면 미리 실행한 만큼 성능이 좋아진다.
추측 실행 중 계산된 모든 값은 아무런 영향을 주지 않고 폐기된다.
if (x > 20)
y = 7
예를 들어서 위의 조건문에서 x > 20을 실행하기 위해서 x값을 읽어오는데 시간이 지체가 된다.
이 때 CPU를 대기시키는 것보다 미리 y = 7을 실행하는 것이다. 만약 예측을 잘못한 경우 y = 7의 실행결과는 폐기된다.
그러면 y=7이 실행되지 않은 것처럼 된다. 만약 예측이 맞았다면 그대로 실행이 되어서 결과적으로 성능이 좋아진다.
'Layer7' 카테고리의 다른 글
리버싱 2차시 과제(실행파일이 만들어지는 과정) (0) | 2022.07.20 |
---|---|
하드웨어 3, 4차시 과제(SoC, 하드웨어 인터페이스, 펌웨어, 논리회로, 펌웨어 획득, 펌웨어 이미지 분석) (0) | 2022.06.19 |
하드웨어 2차시 과제(CPU 구조, 동작 과정, ISA, 메모리 계층 구조) (0) | 2022.06.12 |
하드웨어 1차시 과제 수업 내용 정리 (0) | 2022.06.07 |
하드웨어 1차시 과제(ROM, RAM, FLASH(SSD), HDD) (0) | 2022.06.07 |