관리 메뉴

개발자비행일지

파이프라이닝(Pipelining) 본문

▶ Computer Science

파이프라이닝(Pipelining)

Cyber0946 2020. 12. 1. 11:39

파이프라이닝(Pipelining)

파이프라이닝이란 공장의 컨베이어 벨트에서 진행되는 조립 공정처럼 생산을 위해 필요한 명령을 단계별로 구분하여 나누고, 이를 중척적으로 실행하는 구현 기술이다.

이러한 파이프 라이닝은 세탁소에서 세탁을 하는 절차를 생각하면 쉽게 이해할 수 있다. 

세탁소는 세탁을 위해서 다음과 같은 알고리즘을 거쳐서 세탁물을 처리한다. 

  • 세탁기에 세탁물을 넣고 작동시킨다.
  • 젖은 옷을 건조기에 넣고 작동시킨다. 
  • 건조된 옷을 탁자위에 놓고 접는다
  • 옷을 장롱에 넣어둔다.

위의 순서대로 차례대로 세탁을 진행하게 된다면, 각 단계가 종료 될 때 까지 대기하고 그 다음 단계를 진행하게 되기 때문에 유휴과정(idle task) 쉬는 과정이 생기게 된다. 단계적인 일을 처리할 때 idle task 없이 동시에 진행해서 보다 빠르게 많은 일을 하기 위한 것이 파이프 라이닝 이다.

파이프 라이닝은 아래와 같다. 

  • 세탁기가 세탁을 완료하면 건조기에 옮겨 놓는다. 
  • 다른 세탁물을 세탁기에 넣는다. 
  • 건조기가 종료되면 건조된 옷을 접고 다른 세탁물을 건조기에 넣는다.
  • 다접은 옷을 장롱에 넣고, 건조된 빨레를 개고, 세탁된 옷을 건조기에 넣고, 세탁기에 새로운 세탁물을 넣는다. 

위처럼 동시에 처리 가능한 일들을 동시에 처리함으로써 처리량을 늘리고가 하는 것이 파이프 라이닝의 핵심이다. 

파이프 라이닝은 각 단계를 수행하는 속도가 동일하지만, 처리량을 올려 전체 수행속도를 향상시킨다.

파이프라이닝에 의한 속도 향상은 파이프라인의 단계수와 같다. 4단계 파이프 라이닝 일 때, 4배 빠른 시간에 작업량을 처리할 수 있고, 처리량은 4배 증가 한 것이 된다. 

세탁, 건조, 개기, 넣기 4가지의 작업을 하는 각 단계별로 걸리는 시간은 물론 전부 다르지만, 파이프라이닝을 위해서는 가장 오래 걸리는 작업에 맞춰서 진행한다. 컴퓨터 시스템에서 이러한 시간, 즉 한 단계를 처리하는 시간을 컴퓨터의 클럭 사이클 이라고 한다. 이 때, 앞서 언급했듯이 가장 느린 단계를 기준으로 정렬 되기 때문에 단계를 잘 나누는 것이 중요하다. 

이러한 Trade-Off 때문에 이상적인 파이프 라인 프로세서에서 속도향상은 파이프 단계 수와 거의 같아야 하지만 향상률은 단계수보다는 조금 작은 방식으로 형성된다. 

파이프라인을 사용하는데 각 명령어가 클럭 사이클 내에 실행되지 못하면 어떻게 될까?? 다른 명령어들이 기다려야 되는 상황이 발생한다. 이와 같은 상황을 파이프라인 해저드라고 부른다.

파이프라인 해저드(Pipe line Hazzard)

파이프 라인 해저드는 3가지 종류로 구분된다. 

  • 구조적해저드
  • 데이터해저드
  • 제어/분기 해저드

먼저 구조적 해저드는, 같은 클럭 사이클에 실행하기를 원하는 명령어의 조합을 하드웨어가 지원할 수 없기 때문에 발생하는 해저드이다. 가령, 세탁소의 예를 들면 세탁기와 건조기가 붙어있다던지, 혹은 장롱에 개어진 세탁물을 넣어줄 친구가 없다는지 하는 경우이다. 이러한 해저드를 없애기 위해서는 설계자가 파이프라인을 설계할 때 구조적 해저드를 피할 수 있도록 설계해야한다.

둘째, 데이터 해저드는 이전 단계의 결과가 명령을 수행함에 있어 필수적인 경우에 생긴다. 이 땐  다른 명령의 결과를 기다린 다음에 수행하기 때문에 파이프라인이 지연되는 발생하게 된다. 컴퓨터 파이프라인에서는 앞선 명령어에 종속성을 가질 때데이터 해저드가 일어난다. 가령, add 명령어를 사용하여 %s0 레지스터에 값을 저장하고, 바로 다음 명령어에서 sub 명령어 혹은 기타 명령어를 통해 &s0에 저장된 값을 사용하는 경우 첫번째 명령어에서 미처 데이터가 레지스터에 저장되기도 전에 해당 레지스터를 참조하게 되어 연산이 이루어 질 수가 없게 된다.

이를 해결하기 위한 방법 중 하나는 바로 전방전달(forwarding) 혹은 우회전달(bypassing) 이다.
이것은 별도의 하드웨어를 추가 하여 정상적으로는 얻을 수 없는 값을 내부 자원으로부터 일찍 받아오는 것을 의미하는데, 레지스터나 메모리에 아직 나타나지 않은 데이터를 기다리지 않고 데이터패스를 추가로 하드웨어에 연결하여 내부 버퍼로 부터 가져오는 것이다.

앞의 add 연산 뒤에 바로 sub 연산을 처리하는 경우를 예로 들면, 하드웨어 자체에 앞에서 계산한 결과가 나오는 부분에서 다음 연산의 뺄셈의 입력 부분으로 새롭게 데이터 패스를 연결하여 데이터가 레지스터에 씌어지기 전에 비트값으로 값을 받아와 연산에 활용하여 데이터 해저드 를 해결 할 수 있다.

하지만, 위의 예인 add와 sub 연산의 연속적 사용이 아닌 데이터 적재 명령어를 사용하는 경우 문제는 더 커진다. 이 경우에는 메모리의 적재까지 4단계 정도의 오랜 시간이 소요되고 이것을 기다리는 것은 너무도 큰 성능 저하를 불러 일으키는데 이러한 적재 명령어 사용에 따른 데이터 해저드를 별도로 적재 사용 데이터 해저드 라고 부른다. 이것은 파이프라인 지연(pipeline stall) 의 대표적인 예이며 거품(bubble) 이라는 별명으로도 지칭된다.

제어 해저드(control hazard) / 분기 해저드(branch hazard)

세번째 해저드인 제어 해저드  분기 명령어 처럼 다른 명령어들이 실행 중에 한 명령어의 결과 값에 기반을 둔 결정 을 할 필요가 있을 때 일어난다. 다시 세탁할 때의 경우를 생각해 보자. 어떤 세탁소의 점원이 옷들을 세탁할 때 세탁 세제와 물의 온도를 선택함에 있어 옷들이 상하지는 않는 한도 내에서 강한 세제와 높은 온도를 통해 옷을 깨끗하게 세척을 해야 합니다. 하지만, 이 때 세탁소의 점원은 그 옷의 성질을 알지 못하므로 일단 한번 세탁을 한 뒤 말려보아야 올바른 세탁 세제와 물의 온도를 사용했는지를 알 수 있습니다. 이를 해결하기 위해서는 다음과 같은 세가지 해결법 이 있습니다.

지연

첫번째는 지연 으로, 첫번째 묶음의 옷들이 건조될 때까지 그냥 순차적으로 작업하되 올바른 비율이 결정될 때까지 계쏙 순차적 작업을 반복하는 것입니다. 위의 세탁소의 예를 들면 일단 옷을 세탁하고 말리는 작업까지를 했다면 그 결과값이 나올때까지 다음 세탁을 대기한 뒤 결과가 나오면 다시 파이프라이닝을 시켜 세탁을 시작합니다. 하지만, 이렇게 계속 반복적으로 분기 명령어 마다 지연을 시킨다면 훨씬 더 큰 속도 저하를 초래할 것입니다 때문에 다른 방법을 필요로 하게 되었고 만들어 진 것이 예측 기법이다.

예측

예측을 수행하는 가장 간단한 방법은 분기가 항상 실패한다고 예측하는 것 입니다. 예측이 옳으면 파이프라인은 최고 속도로 진행되고, 실제로 분기가 일어날 때만 파이프라인이 지연이 됩니다. 좀 더 정교한 버전은 동적 하드웨어 예측기 를 이용하는 것으로 각 분기가 일어났지는 지록함으로써 최근의 과거 이력을 사용하여 미래를 예측하는 것이다.

delayed branch

세번째 방법은 분기 지연 입니다. 이 방법은 분기가 필요한 명령어의 결과값이 나오는 동안 해당 분기와 관련이 없는 다양 명령어를 먼저 실행하여 시간이 지연되지 않도록 하는 방법이며, 이를 위해서는 명령어를 적합한 순서에 따라 배치해야하며 주로 컴파일 최적화 를 통해 이루어 질 수 있다.

'▶ Computer Science' 카테고리의 다른 글

Out-of-order Processor Pipeline 이란  (0) 2020.12.02
Direct 모드와 Indirect 모드  (0) 2020.12.01
신호  (0) 2020.11.15
DNSSEC(DNS Security Extensions)  (0) 2020.10.20
Write Through, Write Back  (0) 2020.09.28