티스토리 뷰

※ 이글은 제가 군복무 중일때 작성한 겁니다. 당시의 시점으로 쓴 글이라서 조금 미묘하게 시제가 안맞는 부분도 있습니다만, 지금 봐도 그리 나쁘지는 않군요(·······). 그래서 용감하게도, 비주얼한 편집을 곁들여서 이렇게 공개를 해봅니다.

※ 원문의 내용이 상당히 길어서(...) 적절히 나눠서 올려야겠습니다.
(한번에 많은 내용을 옮기고 편집하려면 심히 귀찮기 때문에...)



1. 파이프라인(Pipeline)이란?

CPU가 한 명령(Operation)을 처리하는 과정은 크게 다음과 같이 볼 수 있습니다.

   (1) 읽기(Fetch): 메모리에서 명령을 가져온다
   (2) 해석(Decode): 명령을 해석한다
   (3) 실행(Excute): 명령을 수행한다
   (4) 기록(Write Back): 수행한 결과를 기록한다

그리고 각 과정을 진행할 때마다 하나의 클럭이 소비됩니다.
즉, 위와 같은 경우에, 명령 하나를 실행하는데는 4 clock이 필요합니다.
이것을 그림으로 표현하면 다음과 같이 되겠지요.
위 그림은 하나의 명령이 클럭 신호에 맞춰서 각 단계를 밟아가며 실행되는 과정을 보여주고 있습니다. 여기서 하나의 명령을 완전히 수행하는데는 t 만큼의 시간이 걸립니다.

이 경우, 시간당 명령 처리량은 다음과 같이 계산할 수 있을 겁니다.

1 op / t

그러니까, 단위시간에 하나의 명령만 처리할 수 있는 것이죠. 그런데 이건 척 봐도 뭔가 효율이 안좋습니다. 하나의 명령이 다음 단계로 넘아가는 동안 다른 처리유닛들은 그냥 놀고있는 겁니다.

예를들면, [읽기]에서 읽어온 명령이 [해석]단계의 유닛으로 넘겨준 이후에 [읽기]과정을 담당하는 유닛들은 더 이상 할게 없어지게 됩니다. 마찬가지로 다른 유닛들의 경우도 자신이 담당한 일을 처리하고 다음 단계의 유닛에게 넘겨주고 나서는 그냥 쉬어버립니다.

우리는 언제나 CPU가 할일없이 노는 꼴을 보질 못합니다. 어떻게든 CPU를 최대한 혹사시키는 것이 엔지니어들의 지상과제인 겁니다(!)

그래서 여기서 한가지 아이디어가 나옵니다. 그건 바로, CPU에서 하나의 명령을 처리하는 과정에서 미리 다음에 실행할 명령을 가져와서 준비시키다는 것입니다.
우선 '명령1'이 [읽기]→[해석]으로 옮겨지는 동안 '명령2'들 읽어옵니다.
그 다음 '명령1'이 [실행]단계로 보내지는 동안 '명령2'가 [해석]으로 넘어가고 '명령3'을 읽어옵니다. 이런식으로 명령의 처리가 다음 단계로 넘어가는 타이밍에 계속해서 다음 명령을 읽어오게 되면 CPU 유닛들을 좀더 효율적으로 부려먹을 수 있습니다.

이 경우의 시간(t)당 명령어 처리를 따져보면, 하나의 명령('명령1')을 완전히 다 수행하는데 걸린 시간(t) 동안에 '명령2'는 3/4만큼 진행됐고, '명령3'는 2/4만큼, '명령4'는 1/4만큼 진행된 상태입니다. 따라서 이렇게 계산할 수 있습니다.

4/4 op + 3/4 op + 2/4 op + 1/4 op
= (4 + 3 + 2 + 1) / 4 op = 2.5 op/t

앞의 경우보다 2배이상 명령처리의 효율이 오른 것을 알 수 있습니다.

이렇게 명령의 처리 단계를 나누고, 한 명령의 처리시간동안에 다른 명령들을 중첩시켜서 수행하는 것을 파이프라이닝이라고 합니다.

그리고 명령을 수행하는 각 단계를 단(스테이지: stage)이라고 합니다. 여기서 예로 든 것은 4개 단계를 가지고 있는데, 이경우 이것은 4단 파이프라인 구성이 됩니다.

그런데, 파이프라이닝을 하던 안하던, 한 명령을 수행하는데 걸리는 시간(t)은 변함이 없습니다. 즉 파이프라이닝은 시간당 명령의 처리량을 늘리는 것이지, 시간을 단축시키지는 못한다는 것입니다.


2. 파이프라인과 클럭의 관계

앞에서는 명령의 실행과정을 4단계로 나누어봤습니다만, 실제로는 이보다 훨씬 더 많은 단계로 세분화 할 수 있습니다. 실제로 펜티엄4의 경우는 30 단계가 넘는 파이프라인을 가지고 있죠.

그러면 이번엔 앞에서 예로든 4단 파이프라인의 확장으로 8단 파이프라인의 경우를 보겠습니다.
일단 기본적으로 4단 구성일때와 별다른 차이는 없습니다.
여기서 주목할 것은, 파이프라인의 단계가 길어지면 명령을 수행하는데 보다 많은 클럭이 필요해진다는 겁니다. 4단 구성에서는 4클럭이면 충분했지만, 파이프라인의 길이가 두 배로 길어진 8단의 경우, 클럭 역시 2배로 필요해집니다.

만일, 4단일때와 똑같은 클럭스피드로 8단 파이프라인을 동작시킨다고 할때, 이경우의 명령처리 효율은 이렇게 계산됩니다.

(8 + 7 + 6 + 5 + 4 + 3 + 2 + 1) / 8 op / 2t
= 36 / 8 op / 2t = 2.25 op/t

기껏 파이프라인을 늘렸놨더니 어째 4단일때와 별 차이가 없습니다. 오히려 소수점 이하의 수치는 떨어졌군요.

앞에서도 말했지만, 파이프라인은 명령의 실행속도를 빠르게 하지는 않습니다. 오히려 이 경우는 하나의 명령수행에 필요한 클럭이 더 늘어남으로써, 결과적으로 단일 명령실행에 더 많은 시간이 소모됩니다.

그.러.나!

여기서는 한가지 사실을 빠트리고 있습니다. 원래대로라면 4단으로 처리했을 일을 그 두배인 8단계로 세분화 시킨 것입니다. 그렇다면, 각 단계에 걸리는 시간 역시 절반으로 줄어들어야 하는게 아닐까요? 달리말하면, 클럭수는 2배나 더 필요해 졌지만, 반면에 클럭 스피드를 2배로 향상시킬 수 있는 여지가 생긴 것입니다.
그렇다면 8단 파이프라인은 4단일 때보다 2배 더 빠른 클럭을 가지고 있다고 생각하고 다시 계산해 보겠습니다.

(8 + 7 + 6 + 5 + 4 + 3 + 2 + 1) / 8 op / t
= 36 / 8 op / t = 4.5 op/t

4단일 때보다 대략 2배의 성능향상. 이제야 확실히 성과가 나오는군요.
이렇듯 파이프라인의 길이가 길어지면, 클럭 스피드를 덩달아 올려놓아야 상생 효과가 있습니다.

인텔의 넷버스트 아키텍처를 도입한 펜티엄4는 파이프라인이 30단을 넘어갑니다. 인텔의 자랑거리인 높은 클럭과 지나치다 싶을 정도로 길다란 파이프라인... 뭔가 궁합이 맞는 것 같죠? 사실, 그만큼 긴 파이프라인 덕문에 높은 클럭을 가질 수 있는 것이죠. 그리고 그렇게 해야만 합니다.


[참고자료]
"컴퓨터 구조 및 설계", Davis A. Patterson, John L. Hennessy (1999 사이텍미디어)
"성공과 실패를 결정하는 1%의 CPU 구조와 원리", Tetsuya Fujihiro (2003 성안당)
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
«   2024/05   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
글 보관함