편견이 깨지는 어셈블리 프로그래밍 - 최적화 강좌 1 - 2  
 
 





파이프 라인과 스캐일러스
파 이프 라인(pipe line)에 대해서 설명하기 전에 잠깐 인텔 80×86의 클럭 속도에 대해 이야기하겠다. <표 1>을 참고해 살펴보자. 인텔 80×86 계열의 CPU는 1978년 8086 발표 당시 8MHz의 클럭 속도로 시작한다. 15년이 지난 후 펜티엄이 발표되는 1993년, 클럭은 8086 시절보다 50MHz 정도의 증가를 보인다. 그럼 펜티엄이 발표된 지 어느덧 10년이 지난 현재 CPU의 클럭 속도는 어떠한가? 인텔 80×86의 발전 속도를 참고했을 때 현재의 펜티엄의 속도는 100MHz 정도를 겨우 넘기고 있을 것이라고 예상된다. 하지만 현재 펜티엄의 클럭은 GHz 대역을 넘은 지 오래 전이다. 언제부터 갑자기 속도가 증가했을까. <표 1>을 보면 인텔 486에서 펜티엄으로 넘어갈 때 소폭의 증가, 펜티엄에서 펜티엄 프로로 넘어가면서 갑작스런 속도의 증가를 보임을 알 수 있다. 그럼 갑자기 속도가 증가한 이유는 무엇일까?
어떠한 방법으로 클럭 속도가 급속으로 증가되었느냐를 알아보기 전에 그러면 ‘클럭의 속도 증가가 왜 중요한가’에 대해서도 알아보자. 클럭이란 사전적 의미로 시계란 의미가 있다. 즉 1초 동안 얼마만큼 처리할 수 있는가를 가늠하는 기준이 되는 것이다. 즉, 100MHz라 하면 1초 동안 100×100만, 즉 1억 번 진동한다는 것이다.
컴퓨터는 이러한 진동을 기본으로 해서 명령어를 처리한다. 명령어를 처리하는 데 걸리는 클럭 수를 ‘클럭 사이클’이라고 한다. CPU가 하나의 명령어를 처리할 수 있다고 할 때 하나의 명령어가 처리되는 동안 다른 명령들은 대기하고 있어야 된다. 그렇다면 클럭이 빨라지면 같은 시간 내에 많은 명령어를 처리할 수 있기 때문에 컴퓨터의 성능이 향상되는 건 당연한 애기 아닌가. 그렇다고 CPU의 클럭을 무작정 높이기에는 문제가 생긴다. 클럭이 높아지게 되면 발열량이 많아지게 된다. 이렇게 발생되는 열은 CPU 오작동의 원인이 된다.
다음 번 문제로 Hz란 단위에 대해서 생각해 보자. Hz는 1초당 진동수를 말한다. 그렇다면 Hz 값이 크다는 것 즉 컴퓨터 속도가 빠르다는 것은 같은 작업량을 더 적은 시간에 처리해야 된다는 뜻이다. 작업량은 같은데 속도를 빠르게 하는 것, 즉 작업 처리 시간을 줄이는 것도 한계가 있기 때문이다. 그렇다면 CPU 클럭에 한계가 있다고 하면 속도를 더 높일 수는 없을까? 그래서 우리는 이 문제의 대안인 파이프(pipe)와 스캐일러스(scalars)를 이야기하게 된다.






?<1> 인텔 80X 86 성능 계보



CISC RISC CRISC
범용 마이크로프로세서를 구성하는 요소에는 명령세트, 레지스터, 메모리 공간 등이 있다. 이중 명령세트는 RISC
(reduced instruction set computer)와 CISC(complex instruction set computer)의 2가지로 크게 분류할 수 있다
CISC란 소프트웨어 특히, 컴파일러 작성을 쉽게 하기 위해 하드웨어화 할 수 있는 것은 가능한 모두 하드웨어에게
맡긴다는 원칙 아래 설계된 컴퓨터이다. 반면 RISC는 실행 속도를 높히기 위해 가능한 한 복잡한 처리는 소프트웨
어에게 맡기는 방법을 택한 컴퓨터이다.
RISC의 특징을 CISC와 비교하여 알아보면 다음과 같다. 첫째, 명령의 대부분은 1머신 사이클에 실행되고, 명령
길이는 고정이며, 명령세트는 단순한 것으로 구성되어 있는데, 가령 메모리에 대한 액세스는 Load/Store 명령으로
한정되어 있다. 둘째, 어드레싱 모드가 적으며, 마이크로 프로그램에 의한 제어를 줄이고, 와이어드 로직을 많이
이용하고 있다. 반면에 레지스터수가 많으며 마이크로 프로그램을 저장하는 칩의 공간에 레지스터를 배치한다.
셋째, 어셈블러 코드를 읽기 어려울 뿐 아니라 파이프라인을 효과적으로 사용하기 위해서 일부 어셈블러 코드를
시계열로 나열하지 않은 부분이 존재하여 컴파일러의 최적화가 필요하다. 최적화를 하지 않으면 파이프라인을
유효하게 이용할 수 없고, RISC을 사용하는 의미가 없어진다. CISC방식에 바탕을 둔 펜티엄칩은 대신 잘게 자른
명령어를 동시에 처리하는 기술을 RISC방식에서 빌려왔다. 그래서 RISC와 CISC를 혼합한 CRISC방식이라고
부른다


파이프 라인
파 이프 라인은 같은 클럭 속도를 일반적인 방법으로 높이는 데 한계가 있어 클럭 당 실행되는 유닛의 수를 줄이는 방법을 이용해 클럭은 높이면서 CPU에 부담을 덜 주는 기술이다. 그렇다면 어떠한 파이프 라인이 어떻게 구성되어 있고 어떠한 방법으로 실행이 되는지 펜티엄을 기준으로 설명하겠다.
펜티엄의 파이프 라인은 모두 다섯 단계의 처리 과정을 거처 정수 명령을 실행한다. 명령어 가져오기(prefetch), 명령어 해석(decode1), 어드레스 생성(decode2), 실행(execute), 기록(writeback) 등이 그것이다. 하나의 명령어가 명령어 가져오기 단계를 지나 명령 해석 단계로 진입하는 동안에 그 파이프 라인은 다른 작업을 할 수 있다. 작업량이 많은 경우 펜티엄은 각각의 파이프 라인마다 1개씩, 총 2개의 명령을 동시에 제공할 수 있다. 펜티엄 Ⅱ, 펜티엄 Ⅲ, 펜티엄 4의 파이프 라인도 기본적인 개념은 펜티엄의 파이프 라인과 같다. 다만 버전이 올라갈수록 유닛의 개수만 증가된다. 그렇다면 파이프 라인을 적용한 CPU는 파이프 라인을 적용하지 않은 CPU와 어떠한 차이가 있을까.
<그림 3>에서 파이프 라인을 적용하지 않은 CPU1의 경우 한 마이크로 오퍼레이션으로 결과 값이 출력되지만 공정 하나에서 디코딩, 디스패치/실행, 결과 출력을 한 번에 해야 하므로 상당한 부하가 걸린다. 파이프 라인을 적용한 CPU2의 경우 한 명령이 4번의 공정을 거쳐야 하므로 실질적으로 마이크로 오퍼레이션이 1클럭만 소요된다고 가정한다면 4클럭이 걸려 처리되게 되는 것이다. 즉 한 명령을 실행하는 데 CPU1보다 공정 개수만큼 느리다는 뜻이다. 하지만 각 공정은 한 명령을 처리하고 나면 바로 다음 명령을 처리하므로 리셋된 상태에서는 초기 명령이 파이프 라인을 빠져 나오는 데 걸리는 시간을 제외하고는 이후부터는 CPU1과 같게 된다. 파이프 라인의 과정에 대해 더 자세히 살펴보자(<그림 4>).
맨 처음 초기 상태에서 파이프는 비어 있는 상태다. 매 클럭마다 명령어가 차례대로 파이프로 진입을 하며 한 클럭에 한 과정씩 처리하게 된다. ‘Prefetcher - decode - Excute - WriteBack’의 과정을 거쳐 4클럭이 되는 때에 맨 처음 들어갔던 code 1이 처리되어 나오게 된다. 결국 하나의 명령을 처리하는 데 소요되는 클럭은 무려 4클럭이나 된다는 뜻이다. 뭔가 이상하지 않은가? 파이프 라인을 적용하지 않은 CPU1이 파이프 라인을 적용한 CPU2보다 더 느리지 않은가? 이렇게 반문하는 독자도 있으리라고 본다. 파이프 라인을 적용한 CPU2가 더 느린 것을 보고 의아해 하는 독자는 그것은 파이프 라인이 지니는 목적을 이해하지 못했기 때문이다.
흔히 CPU 광고 및 속도 관련 개론이 나올 때 파이프 라인이라는 용어를 자주 접하기 때문에 파이프 라인을 적용하면 속도가 더 빨라지는 것으로 생각할 수도 있다. 하지만 이는 잘못된 생각이다. 파이프 라인은 ‘같은 클럭에서 적용시켜 명령 처리 효율을 높여주는’ 메커니즘이 아닌 ‘처리에 따른 부하를 분산시켜 클럭을 증가시켜도 견딜 수 있는’ 메커니즘인 것이다. 아무리 반도체 기술이 발전해도 속도를 무한히 높일 수 없기 때문이다. CPU 속도를 증가시키기 위해 가장 확실한 방법은 클럭을 높이는 것이다.
하지만 클럭이 높아질수록 그만큼 명령 처리 유닛이 한 클럭 내에 명령을 처리해 내야 한다는 부담이 생기 때문에 클럭을 높이기만 하는 데에는 한계가 있다. 그래서 파이프 라인은 명령의 처리를 각 공정으로 분산시켜 공정당 한 클럭에 처리하도록 하는 것이다. 각 공정으로 분산시키면 그만큼 하는 일이 단순해지기 때문에 견딜 수 있는 클럭 속도도 높아지게 된다.
그렇다고 무작정 파이프만 증가시킨다고 좋은가? 파이프 라인을 증가시킬수록 부하는 줄어들지만 한 명령 당 실행되는 공정이 늘어나므로 결국에는 명령어 처리 시간이 늘어나게 되는 것이다. 명령어 처리 시간이 늘어나게 되면 결과적으로 느려지느냐고 반문할 수 있겠지만 한 공정이 명령을 처리하면 처리된 것을 바로 다음 공정으로 넘기고 자신은 바로 다음 명령을 처리하므로 파이프 라인 없는 단일공정 CPU에 비해 파이프 라인 수만큼 시간적 손해를 볼 뿐 결과적으로 출력이 시작되면 단일공정 CPU와 같은 속도를 내게 된다. 즉, 어떻게 보면 클럭 수를 높이기 위한 고육지책 중 하나라고 볼 수 있는 것이다. 이런 파이프 기술에 의해 CPU의 클럭 속도는 1GHz대를 돌파할 수 있게 된 것이다.

스캐일러스
파 이프 라인으로 인해 우리는 더 빠른 클럭 속도를 사용할 수 있게 되었다. 하지만 CPU 제작사들은 이에 만족치 않고 좀더 처리속도를 증가시킬 수 있는 방안을 모색했는데, 그 중 하나가 바로 스캐일러스이다. 스캐일러스는 한 클럭에 처리할 수 있는 명령 수를 증가시킨 것이다. 즉, 파이프 개수를 늘리는 것이다. 한 CPU 안에 파이프 라인이 한 개가 아닌 두 개 이상의 구조를 가지는 것을 스캐일러스라고 한다. 실제로 펜티엄은 두 개의 정수 파이프 라인과 한 개의 실수 파이프 라인을 가지고 있고 펜티엄 Ⅱ 이상 버전으로 넘어 오면서 MMX 연산 등 여러 파이프가 추가된다.


출처: http://www.imaso.co.kr/?doc=bbs/gnuboard.php&bo_table=article&wr_id=71

+ Recent posts