전반적인 마이크로프로세서의 구조와 특징을 설명한 '인사이드 머신' 이라는 서적에 있는 내용을 요약했다.
인텔 프로세서
펜티엄 프로세서
동시대 최고 수준 RISC 프로세서에 비교해서 펜티엄의 성능이 떨어졌던 것은, 그 당시에 이미 거의 사용되지 않았던 일부 x86 명령어를 지원하기 위해 과도한 양의 트랜지스터를 프론트엔드 하드웨어에 사용했기 때문이다. 펜티엄이 발매되었던 1993 년 경에는 사용할 수 있는 트랜지스터 수가 상당히 제한되어 있었음에도 불구하고, 펜티엄은 프로세서 성능 향상에는 큰 도움이 되지 않는 별도의 가산기나 마이크로코드 롬 같은 곳에 너무 많은 자원을 사용했다.
하지만 인텔에게는 다행히도 x86 코드 지원 문제의 심각성은 이후 점차 사라져갔다. 몇 가지 ISA 확장 명령어(MMX, SSE) 를 제외하면 x86 ISA 는 시간이 지나도 크게 변하지 않았다. 따라서 한 가지 예외를 제외하고는 x86 호환성을 위해 필요한 하드웨어의 양도 거의 일정했다.
반면 펜티엄이 발매된 후 사용할 수 있는 트랜지스터의 양은 급격히 늘어났다.이 두 가지 요소가 결합되어, 펜티엄 발매 당시 상당히 큰 문제였던 x86 코드 지원에 필요한 상대적 비용(사용된 트랜지스터의 비율)은 CPU 트랜지스터의 수가 늘어나면서 크게 감소했다.
펜티엄 4 에서 x86 지원을 위해 사용된 트랜지스터의 수는 10% 미만이며, 최신 인텔 프로세서의 경우는 더 적다. 이렇게 x86 코드 지원에 필요한 비용이 꾸준히 줄어들게 되면서, x86 프로세서는 정수 및 부동소수점 연산에서 RISC 경쟁 제품의 성능을 따라잡고 추월할 수 있게 되었다. 무어의 곡선은 x86 ISA 의 편이었던 것이다.
펜티엄 프로세서는 x86 ISA 지원 때문에 큰 비용을 지불했음에도 불구하고, 상업적으로 대성공을 거두며 x86 시장에서의 인텔의 입지를 공고히 했다. 이후 인텔은 x86 프로세서의 성능을 더욱 끌어올리기 위해 다음 제품인 펜티엄 프로에서 몇 가지 근본적 혁신을 이뤄낸다.
펜티엄 프로
펜티엄 프로는 상대적으로 적은 수의 트랜지스터만을 사용하므로, 캐쉬 용량 등에서 제한이 많았다. 오리지널 펜티엄은 SIMD 의 초기 형태인 MMX(멀티미디어 확장)를 장착했지만, 펜티엄 프로는 앞에서 설명한 디코드 로직을 위해 MMX 기능을 포기해야 했다.
하지만 이런 단점에도 불구하고, 펜티엄 프로는 x86 의 성능을 놀라울 정도로 끌어올렸다. 펜티엄 프로의 비순차 수행 엔진, 이중 정수 파이프라인, 향상된 부동소수점 유닛으로 인해 x86 ISA 는 드디어 서버 시장에 진입하게 됐다.
펜티엄 II
MMX 지원은 펜티엄 II 에 와서야 빛을 발하기 시작했다. 1997 년에 발표한 P6 마이크로 아키텍처를 사용한 후속 모델인 펜티엄 II 는 233 ~ 300 MHz 클럭을 사용했으며, 전모델에 비해 수 많은 성능 향상이 있었다.
우선 펜티엄 II 는 분리형 L1 캐쉬의 용량을 32KB 로 늘렸다. PII 의 긴 파이프라인은 커다란 L1 캐쉬를 통해 명령어와 데이터를 공급받았다.
PII 에서도 P6 파이프라인의 근간은 변하지 않았지만 인텔은 2개의 MMX 수행 엔진을 사용한 새로운 형태의 MMX 유닛을 채용했다. 하지만 MMX 기능은 여전히 정수 연산만을 지원했다. 부동소수점 벡터 연산은 PIII 에서 SSE(스트림 SIMD 확장)를 통해 지원되기 시작했다.
펜티엄 II 의 정수 및 부동 소수점 연산 성능은 다른 CISC 경쟁 제품에 비해 뛰어났다. 이에 따라 초기 펜티엄 프로세서를 통해 서버 및 워크스테이션 시장에서 사용되기 시작한 x86 프로세서는, 펜티엄 II 를 통해 시장 점유율을 높여갔다.
그러나 같은 공정과 비슷한 수의 트랜지스터를 사용한 RISC 프로세서에 비교할 때, PII 의 성능은 여전히 부족했다. 요컨데 고가의 RISC 칩이 고성능을 제공한 반면, PII 는 높은 가격대 성능비를 제공하는 것으로 만족해야 했다.
펜티엄 III
인텔은 1999 년 0.25 마이크론 공정을 사용한 P6 계열의 450 MHz 펜티엄 III 를 출시했다. 코드명이 카트마이인 펜티엄 III 의 첫번째 버전은 작은 회로보드를 통해 512 KB 오프칩 L2 캐쉬를 사용했다. 카트마이의 성능은 괜찮은 편이었지만, 실제 PIII 의 성능이 크게 향상된 것은 2000 년 출시된 코퍼마인부터였다.
코퍼마인은 0.18 마이크론 공정을 사용해서, 좀더 많은 트랜지스터를 프로세서 다이에 넣을 수 있었다. 인텔은 이러한 장점을 이용해 L2 캐쉬 크기를 256 KB 로 줄인 후, 프로세서 다이에 캐쉬를 통합했다. L2 캐쉬를 프로세서 다이에 배치하면, L2 캐쉬 접근 시간이 엄청나게 줄어들어서 캐쉬 크기를 줄인 것을 상쇄하고도 남는 효과를 가져온다. 코퍼마인의 성능은 클럭 스피드에 비례했는 데, AMD 애슬론이 먼저 1GHz 고지를 점령한 얼마 후 코퍼마인도 1GHz 클럭을 돌파했다.
펜티엄 III 는 기존 x86 ISA 에 2 가지 중요한 기능을 추가했다. 그 중 첫째는 SSE 라 불리는 부동소수점 SIMD 확장이다. SSE 의 70 가지 명령어에 힘입어, x86 아키텍처는 그간 약점으로 지적되었던 벡터 연산을 향상시킬 수 있었고, 이로 인해 게임이나 디지털 신호 처리 등의 애플리케이션에 강세를 보이게 됐다.
PIII 설계자는 새로운 SSE 하드웨어를 이슈 포트 1 에 장착했다. 포트 1 에 장착된 SSE 유닛은 여러 종류의 SIMD 연산(VFADD, VSHUFF, VRECIP)을 수행한다. 한편 인텔은 FPU 포트 0 을 수정해서 SSE 곱셈(VFMUL) 을 처리하도록 했다. 이로 인해 펜티엄 III 의 메인 FPU 블록은 스칼라 연산과 벡터 연산 모두를 담당하게 됐다.
PIII 는 또한 프로세서 시리얼 번호(PSN)를 도입했다. PSN 은 각 프로세서에 기록된 고유 번호로, 새로 추가된 x86 명령어를 사용하면 이 번호를 읽을 수 있었다. 인텔은 전자상거래 등에서 PSN 을 사용하려 했지만, 프라이버시 침해를 우려하는 사람들의 반대에 의해 결국 PSN 은 펜티엄 계열 프로세서에서 사라지고 만다.
결론
펜티엄의 성능은 동시대의 RISC 경쟁자들을 압도하지는 못했지만, 인텔이 x86 기반의 대규모 PC 시장을 방어하기엔 충분했다. 실제 AMD 가 경쟁자로 등장하기 전까지, 인텔은 x86 PC 시장을 완전히 장악하고 있었다. 인텔은 신제품의 발매 시기와 클럭 속도를 마음대로 조절했다. 인텔의 경쟁업체들은 항상 인텔의 행보에 주목하며 그에 대응했지만, 그들의 x86 프로세서는 언제나 인텔 제품에 비해 성능과 인기면에서 모두 큰 열세를 보였다.
AMD 의 애슬론은 인텔의 아성에 도전한 첫번째 x86 프로세서였다. 1999 년 당시 애슬론의 AMD 와 PIII 의 인텔은 어느 쪽이 먼저 1GHz 클럭 스피드에 도달하느냐를 놓고 '기가헤르츠 경쟁' 을 벌였다. 당시 인텔의 주자는 P6 마이크로아키텍처를 사용한 PIII 였는데, 이 프로세서는 AMD 의 애슬론에 비해 조금 늦게 1GHz 를 달성했다. 중요한 것은 기가헤르츠 경쟁을 통해, 150 MHz 에서 시작한 x86 P6 마이크로아키텍처가 1GHz 를 넘어서 RISC 아키텍처가 전통적으로 지배하고 있는 고급 서버 및 워크스테이션 시장에 입성할 수 있게 됐다는 사실이다.
기가헤르츠 경쟁은 대규모 PC 시장뿐 아니라 펜티엄 라인 제품군에도 큰 영향을 미쳤다. 인텔이 P6 를 통해 얻은 교훈은 클럭 스피드가 높은 제품이 잘 팔린다는 사실이었고, 이 교훈은 이후 펜티엄 4 의 넷버스트 마이크로아키텍처 설계에도 큰 영향을 미친다.
파워 PC 프로세서
파워 PC 는 600 시리즈를 통해 신상품에서 강력한 RISC 프로세서로 떠올랐다. 애플 역시 파워맥 워크스테이션을 통해 고성능 PC 시장의 선두주자로 자리잡았다. 최초의 601 프로세서에는 몇 가지 문제점이 있었지만, 이후 출시되는 603e 아 604e 를 통해 600 계열 프로세서는 시장에서 확고한 자리를 마련했다. 특히 603e 는 애플 랩탑에서 널리 사용되었다.
603e 는 601 에 비해 디스패치/커밋 대역폭이 부족했고 캐쉬 크기도 작았지만, 트랜지스터를 효과적으로 사용해서 이전 프로세서의 성능을 능가할 수 있었다.
604 는 306 의 명령어 디스패치 및 커밋 대역폭을 2 배로 늘리고, 더 넓은 백엔드와 커다란 명령어 창을 사용해서 IPC 를 높였다. 또한 604 는 IPC 를 더욱 높이고 높은 클럭 속도에 대응할 수 있도록 더 깊은 파이프라인을 사용했다. 그 결과 604 를 사용한 파워맥은 성능 면에서 경쟁 제품을 능가할 수 있었다.
600 시리즈는 오늘날에 비해 사용할 수 있는 트랜지스터의 수가 적던 시절 최고의 프로세서 였다. 파워PC 아키텍처의 RISC 설계는 비용, 성능, 전력소모 면에서 모두 x86 경쟁 제품에 비해 우위에 있었다.
600 시리즈의 전성기와 G3 프로세서의 초창기, 파워PC 가 RISC ISA 를 사용한다는 것은 큰 장점이었다. 하지만 무어의 곡선을 통해 트랜지스터 수와 클럭 속도가 높아지면서 x86 ISA 지원에 따르는 비용이 상대적으로 감소함에 따라, 파워PC 의 장점도 사라져갔다.
7400 이 출시될 무렵 인텔과 AMD 의 x86 프로세서들은 이미 파워PC 의 성능을 따라잡았고, 이들 프로세서가 1GHz 고지를 넘어갈 무렵 애플의 최고급 워크스테이션 제품은 판매에 어려움을 겪게 되었다. 인텔과 AMD 가 열띤 가격 및 성능 경쟁을 벌이는 동안 7400 의 클럭 속도와 성능은 너무 오랜 기간 침체되어 있었다.
이에 대한 애플의 해법은 SMP(symmetric multiprocessing)을 사용해서 테스크탑의 성능을 향상시키는 것이었다. 2 개의 G4 를 사용해서 코드와 데이터를 처리함으로써 애플은 각 프로세서의 성능 향상 없이 컴퓨터 시스템의 처리 능력을 향상시키려 했다. 듀얼 G4 시스템은 시장에서 어느 정도의 반응을 얻었지만, 실제 애플이 워크스테이션의 성능을 개선할 수 있었던 것은 완전히 새로 설계한 파워PC 7450(G4+, G4e) 를 사용한 후였다.
G4e 의 출시로 애플은 워크스테이션 시장에서 펜티엄 4 기반 시스템에 어느 정도 맞설 수 있게 된다.
= 펜티엄 4 와 G4e 의 문제 접근 방법과 설계 철학 =
G4e 와 펜티엄 4 의 파이프라인 깊이 차이는 두 프로세서의 기본 설계 철학의 차이를 반영한다. 프로세서의 목표는 언제나 짧은 시간 안에 더 많은 명령어를 수행하는 것이지만, 두 프로세서의 접근 방식은 크게 달랐다.
G4e 의 접근법은 '넓고 얕음' 으로 요약할 수 있다. G4e 의 설계자는 백엔드에 많은 수의 수행 유닛을 투입하는 한편, 프론트엔드에서 병렬적으로 많은 명령어를 이슈해서 여러 개의 수행 유닛이 항상 유용한 일을 할 수 있게 만들었다. 순차적인 코드에서 최대한의 ILP(명령어 수준 병렬성)를 뽑아내기 위해, G4e 의 프론트엔드는 먼저 여러 개의 명령어를 칩으로 읽어온다. 이후 비순차 수행 로직에서 의존성 검사를 한 후, 병렬 수행이 가능하도록 여러 명령어를 동시에 백엔드로 보낸다. G4e 각 수행 유닛의 파이프라인은 상당히 얕은 편이어서, 대부분의 명령어 수행은 몇 사이클 안에 끝난다. 마지막으로 G4e 의 최종 스테이지에서는 연산 결과를 메모리에 쓰기 전에, 본래 프로그램의 명령어 순서대로 명령어를 재정렬한다.
특정 순간에 G4e 에서 수행되는 명령어의 수는 최대 16 개이다. 앞으로 펜티엄 4 를 살펴보면 알겠지만, 16 개의 명령어 창 크기는 상당히 작은 편에 속한다. 결국 G4e 는 소수의 명령어를 병렬적으로 처리하되, 가급적 적은 수의 클럭 안에 명령어의 처리를 끝내는 것을 목표로 설계되었다.
펜티엄 4는 '좁고 깊은' 접근법을 택했다. 펜티엄 4는 파이프라인이 깊은 만큼, 한 번에 여러 명령어를 처리할 수 있다. 하지만 여러 명령어를 병렬적으로 수행하는 대신, 펜티엄 4 는 좁은 백엔드에 고속으로 명령어를 전달한다.
펜티엄 4의 고속 백엔드에 지속적으로 명령어를 공급하려면, 프로세서는 엄청난 수의 명령어를 저장하고 스케줄할 수 있는 큰 버퍼가 필요하다. 펜티엄 4는 동시에 126 개의 명령어를 처리할 수 있어서, 한 번에 여러 명령어에 대한 의존성을 검사한 후, 스케줄링을 통해 백엔드에 명령어를 공급한다.
다시 말해 펜티엄 4는 매우 큰 명령어 창을 갖고 있다.
두 프로세서의 서로 다른 접근법은 패스트푸드점에 비유하여 설명할 수 있다. 대부분 패스크푸드점에서는 걸어 들어가 점포 안에서 음식을 구입하거나, 자동차로 지나가며 점포 밖에서 직접 음식을 구입할 수 있다. 점포 안에서 음식을 구입할 경우, 5 ~ 6 개의 짧은 줄 중 하나에서 차례를 기다린다. 이때 각 줄은 1명의 직원이 처리한다. 반면 자동차에 앉아 음식을 구입할 경우, 줄은 하나뿐이지만 여러 명의 담당자가 하나의 줄을 담당하므로, 줄이 더 빨리 줄어든다. 구체적으로, 자동차에서 음식을 구입하는 경우 다음 절차를 밟게 된다.
- 주문 받는 직원에게 원하는 음식을 말한다.
- 계산하는 직원에게 음식 값을 지불한다.
- 음식 받는 곳에서 음식을 가져간다.
자동차 주문의 경우, 주문 절차가 여러 단계의 짧은 스테이지로 나뉘므로, 하나의 줄에서 좀더 많은 고객을 처리할 수 있다. 여러 개의 스테이지에서 동시에 여러 명의 고객 주문을 담당하기 때문이다. 여러 개의 수행 유닛을 사용하는 G4e 가 걸어 들어가서 음식을 구입하는 방법과 닮았다면, 펜티엄 4는 한줄로 처리되는 자동차 주문과 닮았다.
앞에서 이야기했듯이, 프로세서의 파이프라인이 깊을 수록, 파이프라인에서 발생하는 파이프라인 버블과 채움 문제(빈 파이프라인이 가득 찰 때까지 걸리는 시간)가 심각해진다. 따라서 펜티엄 4 와 같이 빠른 클럭 속도를 설계 목표로 하는 프로세서는 가급적 파이프라인이 멈추지 않도록 분기 예측을 최대한 정확하게 해야 한다. 펜티엄 4 의 거대한 분기 예측 하드웨어와 수많은 버퍼는 펜티엄 4 가 깊은 파이프라인의 단점을 최소화하려 한 결과이다.
이러한 하드웨어를 사용하지 않는 G4e 는 남는 트랜지스터를 이용해서 더 많은 수행 유닛을 장착했다.
캐쉬
컴퓨터 시스템에서 캐쉬가 잘 동작하는 것은, 대부분의 코드나 데이터에 내재되어 있는 '참조 집약성' 때문이다. 일반적으로 널리 알려져 있는 집약성에는 '공간 집약성' 과 '시간 집약성' 이 있다.
공간 집약성
어느 한순간에 CPU 가 어느 특정 코드나 데이터를 필요로 한다면, 머지 않아 그 주변에 위치한 코드/데이터를 요청할 가능성 또한 매우 높다. 이렇게 데이터가 존재하는 위치에 따른 집약성을 '공간 집약성' 이라 한다.
시간 집약성
일단 어떤 코드나 데이터를 사용했다면, 그 코드/데이터를 조만간 다시 사용할 가능성도 매우 높다. 이러한 집약성을 '시간 집약성'이라 한다.