책/컴퓨터 구조

컴퓨터 구조 Ch04_"The Processor-3"

RyoTTa 2021. 1. 6. 22:10
반응형

4.5 파이프라이닝에 대한 개관

 파이프라이닝(Pipelining)은 여러 명령어가 중첩되어 실행되는 구현 기술이다. 오늘날에서는 보편적 기술이다.

 예를들어 파이프라인되지 않는 세탁 방법을 설명하면

  1. 세탁기에 한 묶음의 옷을 넣는다.

  2. 세탁기가 종료되면 젖은 옷을 건조기에 넣는다.

  3. 건조기가 종료되면 건조된 옷을 탁자 위에 놓고 정리한다.

  4. 정리가 종료되면 같은 방 친구에게 옷을 넣어 달라고 부탁한다.

파이프 라이닝을 위한 세탁소 비유

 하지만 위 그림의 아랫 부분을 보는바와 같이 파이프라인 방법은 훨씬 시간이 적게 걸린다.

 단계(stage)가 종료되면 해당 단계의 자원이 할당 해제되기 때문에 사용가능함을 최대로 이용하는 것이다.

 각 단계를 위한 별도의 자원이 있는 한 작업들을 파이프라인화 할 수 있다.

 파이프라인의 역설적인 점은 한 묶음을 모든 단계를 거쳤을때의 시간은 더 짧아지는 것이 아니라는 것이다.

 즉 파이프라인은 처리량을 증가시킨다. 많은 작업이 있을때 처리량이 증가해 전체 시간을 단축시킨다.

 

 LEGv8 명령어느 전통적으로 5단계 파이프라인을 설계한다.

  1. 메모리에서 명령어를 가져온다. IF(Instruction Fetch)

  2. 명령어를 해독하는 동시에 레지스터를 읽는다. ID(Instruction Decode)

  3. 연산을 수행하거나 주소를 계산한다. EX(Execute)

  4. (필요하면)데이터 메모리에 있는 피연산자에 접근한다. MEM(Memory Address)

  5. (필요하면)결과값을 레지스터에 쓴다. WB(Write Back)

 

 단일사이클 vs 파이프라인

  단일 사이클 구현에서는 모든 명령어가 1클럭 사이클 걸린다. 따라서 가장 느린 명령어를 수용할 수 있도록 설정한다.

  아래에 있는 그림은 각 명령어 및 연산들의 필요한 시간을 나타낸다.

각 구성요소의 필요 시간으로부터 전체 필요 시간 계산

 가장 느린 명령어는 LDUR에 800ps 가 필요하다. 즉 단일 사이클은 모든 명령어가 800ps를 기준으로 한다.

 만약 3개의 명령어를 실행하려면 800ps*3=2400ps 가 필요하다.

 모든 파이프라인 단계는 한 클럭 사이클이 걸린다. 따라서 연산에서의 가장 느린 200ps를 기준으로 한다.

 만약 3개의 명령어를 실행하려면 1400ps 가 필요하다.

단일 사이클 실행 및 파이프라인 실행 시간 비교

 파이프라이닝을 위한 명령어 집합 설계

  1. LEGv8의 모든 명령어는 같은 길이를 가진다. 이것은 명령어를 가져오고 해독하는 것을 쉽게한다.

     x86 명령어집합은 명령어 길이가 1바이트에서 15바이트까지 변하기 때문에 파이프라인이 힘들다.

     최근 x86은 단순한 연산들로 변환하여 파이프라인하는 방식으로 구현된다.

  2. LEGv8은 명령어 형식이 몇가지로 제한되어 있므며, 첫 근원지 레지스터와 목적지 레지스터는 같은위치다.

  3. LEVv8에서 메모리 피연산자가 Load/Store에서만 나타난다. 따라서 실행 단계에서 메모리주소를 계산하고 다음 단계에서 메모리에 접근할 수있다. x86처럼 메모리에 있는 피연산자에 연산을 할 수 있었다면 단계3,4가 더 확장되어야 한다.

 

 파이프라인 해저드

명령어 파이프라인 그림, 어둡게 그려진것은 그 구성 요소가 명령어에 의해 사용되고 있음을 나타낸다. ADD명령어 경우 데이터 메모리 접근을 하지 않기 때문에 MEM은 어둡지 않다. 레지스터 파일의 오른쪽 및 메모리의 오른쪽 반이 어두운것은 그 구성요소가 그 단계에서 읽혀지고 있다는 것이고, 레지스터의 왼쪽반이 어두운 경우는 그 단계에서 쓰기가 행해진다는 걸 뜻한다.

  명령어가 다음 클럭 사이클에 실행될 수 없는 상황이 몇 존재한다. 이런사건을 해저드(Harzard)라 칭하고 세가지있다.

  1. 구조적 해저드(Structural hazard)

   같은 클럭 사이클에 실행하기를 원하는 명령어의 조합을 하드웨어가 지원할 수 없다는 것을 의미한다.

   위 그림에서 네번째 명령어가 추가된다면 첫번째 명령어는 메모리에서 데이터를 접근하고 네번째 명령어는 같은           메모리에서 명령어를 가져오게 된다. 앞의 파이프라인에 메모리가 하나라면 구조적 해저드를 피할 수 없을 것이다.

  2. 데이터 해저드(Data hazard)

   어떤 단계가 다른 단계가 끝나기를 기다려야 하기 때문에 파이프라인이 지연되어야 하는 경우이다.

   명령어가 아직 파이프라인에 있는 앞선 명령어에 종속성을 가질때 데이터 해저드가 일어난다.

   ADD X19, X0, X1

   SUB X2, X19, X3 

   ADD 명령어에서 X19에 X0, X1의 합이 저장되어야 SUB 명령어에서 피 연산자로 활용될 수있다. 

ADD에서 WB단계가 실행되었을때 SUB에서 ID 단계를 실행한다.

   첫번재 해결책으로 ALU가 ADD명령어의 합을 만들어 내자마자 이것을 SUB의 입력으로 사용할 수 있다.

   이러한 별도의 하드웨어를 추가하여 정상적으로 얻을 수 없는 값을 내부 자원으로 일찍 받아오는 것을 

   전방전달(forwading), 우회전달(bypassing)이라고 한다.

전발전달의 그림 표현, ADD의 EX단계 출력을 SUB의 EX 단계 입력으로 전방 전달

   목적지 단계가 근원지 단계가 시간적으로 늦을 경우에만 전방전달 통로가 유효하다. 예를들어 첫 번째 명령어의 메모리 접근 단계의 출력으로부터 다음 명령어의 실행 단계 입력으로의 전방전달 통로는 유효하지 않다.(과거로 역행 불가)

   그러나 전방전달이 모든 파이프라인 지연을 방지할 수는 없다. 예를들면 첫번째 명령어가 ADD 명령어가 아니고 X1에 적재하는 명령어라고 가정할때, 아래 그림과 같이 데이터 종속관계에 있는 첫 번째 명령어의 4단계 후에만 사용가능하다

   따라서 적재-사용 데이터 해저드(Load-use data hazard)의 경우에는 전방 전달을 하더라도 한단계 지연이 필요하다.

   이는 파이프라인 지연(Pipeline stall)의 개념이다. 거품(Bubble)이라고 칭하기도 한다.

Load 명령어 이후의 R-type 명령어사용시의 파이프라인 지연

  3. 제어 해저드(Control hazard)

   다른 명령어들이 실행 중에 하나의 명령어의 결과값에 기반을 둔 결정을 할 필요가 있을 때 나타난다.

   명령어 주소의 흐름이 파이프라인이 기대한 것과 다르기 때문에 발생한다.(분기 명령어)

   

   첫번째 해결책으로 지연(Stall)이다.

   즉 분기 명령어를 인출한 직후 파이프라인을 정지시켜, 분기 결과를 판단하고 다음 명령어를 가져올 주소를 결정할 때까지 기다리게 하는 것이다.

   아래 그림은 파이프라인 두번째 단계에서 레지스터를 테스트하고 분기 주소를 계산하고 PC값을 수정할 수 있을 정도로 하드웨어를 충분히 추가했다고 가정한 그림이다. 

   충분한 하드웨어를 추가한더라도 200ps 클럭 사이클동안 지연이 필요하다.

 

   두번째 해결책으로 예측(predict)이다.

   이 방법은 예측이 맞으면 파이프라인의 성능을 떨어뜨리지 않는다. 그러나 예측이 실패하면 다시 실행해야한다.

   분기예측(branch predict)에 대한 좀 더 정교한 버전은 어떤 경우는 분기한다고(taken)예측하고, 어떤 경우는 분기하지 않는다고(untaken)예측하는 것이다.

측제어 해저드에 대한 예측을 사용했을때 모습, 상단 그림은 분기가 일어나지 않았을 때를 보여주며 하단 그림은 분기가 일어났을때를 보여준다. 

   정적 하드웨어 예측기(Static hardware predictor)는 전형적인 branch 형태에서 착안했다. 즉 loop문에서의 끝부분에서는 분기가 일어날 가능성이 높고 분기 방향이 후방이므로 이러한 조건부 분기문은 분기가 항상 일어난다고 예측 할 수있다.

   동적 하드웨어 예측기(Dynamic hardware predictor)는 정 반대로 개별 조건부 분기 명령어의 행동에 의존하는 예측을 하며 프로그램이 진행되는 도중에 예측을 수정할 수 있다. 즉, 과거 기록을 사용하여 미래를 예측하는 것이다. 

 

 

반응형