1. 아래 getabeam님과 에노텐님의 CPU 구조 논쟁에 대한 첨언. 

기술적인 측면에서 보자면 getabeam님의 주장이 '사실'에 더 가깝다. 아니 가까와 보인다. 

'가까와 보인다'라고 애둘러 표현한 이유는, 내가 비록 8비트이고 습작 수준이었지만 FPGA로 CPU를 설계해 보았고 또한 각종 반도체 회사들에서 CPU 개발 기획 때 직간접적으로 참여한-CPU 설계보다는 CPU의 응용 분야에서의 적합성 여부 조언-경험이 있고 Pentium CPU는 물론 Power CPU를 이용한 Application을 다수 수행해서 CPU에 대한 역사 인식이나 관련 분야 이해는 남 부럽지 않다고 자부하지만 그 것은 응용 분야이고 '32비트 이상의 CPU의 구조 자체를 논한다는 것'은 만만한 일이 아니기 때문이다. 


더우기 WIndows XP 초반 이후 IBM-PC 기반 응용은 거의 손을 떼었고 그 대신 Power CPU 계열이나 ARM 프로세서를 가지고 놀고 있기 때문(^^)에 인텔의 최근 CPU 동향은 잘 모른다는 것도 애둘러 표현한 이유 중 하나이다.


그러나 튀어봐야 벼룩. 


pipeline의 기본 개념을 탑재하고 있다면 CPU가 아무리 진화를 했다고 해도 '거기서 거기'라는 오만방자한 마음이 불길처럼 일어 '주둥이 겐세이'를 해본다.



2. 기실, getabeam님께서 언급한 pipeline에 대한 이해는, 처음 내가 펜티윰 CPU를 이용한 프로젝트를 할 때(당시는 하드웨어 뿐 아니라 소프트웨어까지 작성하는 역할이었다) '뭥미?'라는 소리를 했을 정도로, 쉽지 않았다. pipeline과 캐시 태그...인텔 펜티윰 CPU 처리 속도를 높이는 핵심 기능들이다. 캐시 기능은 사용하기에 따라 프로그램 속도를 높여주는 결정적 역할을 하기 때문에 소프트웨어를 작성하는데도 반드시 알아야할 사항이라서 고생고생한 후 개념 탑재한 후에 부딪친 것은 pipeline.


아주 단편적으로 말해, pipeline으로 인한 처리 속도의 증가를 만회하려면 CPU의 동작 주파수를 높이면 된다.(캐시택은 WIndows XP 이후로는 어떻게 진화되었는지... 아니면 퇴보되었는지 잘 모른다.)그러나 동작 주파수를 높이면 소비전력이 증가되고 그에 따르는 제반 문제들을 고려한다면 pipeline을 이용한 처리 속도 증가만큼 효율적인 방법이 현재는 없어보인다.


내가 아는 한, 현재까지 나온 대부분의  CPU는 '하바드 아키텍쳐'를 기반으로 설계된 것으로 알고 있다. 그런데 이 '하바드 아키텍쳐'를 기반으로 하는 CPU들은 한 단위 시간(흔히 instruction execution time이라고 한다. machine cycle이라고도 하는데 CPU에 따라 다르다. 간단하게 수식으로 표현하자면 instruction execution cycle = n(자연수) x machine cycle)에 하나의 명령만 수행한다.


반면에 pipeline의 경우에는 '한 단위 시간에 하나의 명령만 수행한다는' 규칙을 깨버린 것이다. 어떻게? 바로 다음에 수행할 명령을 미리 CPU에서 읽어들이는 것이다. 이렇게 하면 CPU가 같은 동작 속도에서 더욱 빠르게 동작한다.


즉, 위에 언급한  instruction execution cycle = n(자연수) x machine cycle 공식에서 n>2인 경우 CPU에서 수행할 명령을 읽는 시간과 명령을 수행하는 시간이 각각 다르게 되는데 pipeline 구조에서는 CPU가 명령을 수행하는 시간에 다음 수행할 명령을 읽는 것이다.(실제적인 묘사는 더욱 복잡하지만 이해를 돕기 위해 간단히 기술한 것이다.)



3. pipeline이 설계가 복잡한 이유

CPU에서 명령을 수행하는 시간에 다음 수행할 명령을 읽음으로서 결국 instruction execution time을 절약하고 CPU의 속도를 증가시킨다는 것은 개념적으로 혁명적이기는 했지만 구현에 있어서는 그리 어려운 것이 아니다.


문제는 '조건 점프의 구현'이다.


예를 들어, 연산의 결과 0이 되는 경우와 '0'이 아닌 경우에 CPU가 수행해야할 명령은 전혀 다른 것이다.(물론, CPU가 수행해야할 명령은 소프트웨어 엔지니어의 프로그램에 의해서 결정이 되었지만) 그런데 pipeline에서는 미리 명령을 읽어들인다. 이 때 CPU는 미리 읽어들여햘 명령이 연산의 결과 '0인 경우'와 ' 0이 아닌 경우' 두 개의 명령을 미리 전부 읽어들여야 한다.


pipeline 설계가 복잡한 이유이다. 그런데 pipeline은 인텔의 독보적인 기술로 치기에는 좀 그렇다. 오히려 근본적인 설계기술의 우위보다는 차별화된 설계 개념에 경험치가 더해져서 독보적인 수준까지 올라왔다...라고 표현하는 것이 맞을 것이다. 당연히, 삼성의 메모리 설계 기술이 (whataday님의 주장에 따르면) 10년은 경쟁력 있는 기술인데 단순히 집적화 시키는 것만으로도 이 정도의 경쟁력을 확보하는데 pipeline이라는 기술에 경험치가 더해졌다면?


내가 인텔과 경쟁하는 제품을 만든다면 pipeline을 탑재한 CPU보다는 CPU 동작주파수를 높이는 방법을 채택하겠다. 물론, 이 방법도 만만치 않은 기술이지만 인텔의 pipeline 설계 기술과 경험치를 따라잡는 것보다는 가능성이 조금이나마 더 있으니까.


4. CPU의 양대 산맥 인텔과 모토롤라

위에서 지금까지의 대부분의 CPU는 '하바드 아키텍쳐' 기반으로 설계된 것이라고 했는데 인텔 CPU나 모토롤라 CPU 역시 예외는 아니다. 단지, 그 구현 방법에 있어서 크게 두가지가 다르다.


첫번째는 입출력 장치의 할당 방법이며 두번째는 Assembler(흔히 Mnemonic)에서 source와 destination의 표시 방법이다.


입출력 장치의 할당방법에 있어 인텔 CPU는 I/O mapped I/O로 되어 있는 반면에 모토롤라 CPU는 memory mapped I/O로 구성되어 있다.


예를 들어, IBM-PC에서 셋업 메뉴에 들어가면 COM1, COM2 등의 번지를 3E0(16진수) 등으로 지정하게 되어 있는데 이 COM1에 할당된 3E0번지와 동일한 번지의 메모리가 인텔 CPU에서는 존재한다. 반면에 모톨롤라 CPU에서는 COM1에 할당된 3E0번지와 동일한 번지의 메모리가 존재하지 않는다. 아니 좀더 정확하게 표현하자면 존재할 수 없다.


왜냐하면, 인텔 CPU는 메모리와 입출력 장치 제어가 독립되어 있으지만 모토롤라 CPU는 메모리와 입출력 장치 제어를 통합적으로 하기 때문이다. 이 두 개의 대별되는 CPU의 차이는 각각 설계 상의 장점과 단점을 동시에 가져다 준다. 내 개인적으로는 인텔 CPU가 소프트웨어에서 모토롤라 CPU가 하드웨어 설계에서 각각 편리하다고 생각한다.


두번째는 Assember 수준에서의 source와 destination의 차이이다.

예로, C언어로 간단하게 표현해보자.

char var1; //var1이라는 8비트 변수 선언
char var2; //var2라는 8비트 변수 선언


var2 = var 1; //var2라는 변수에 var1 변수의 값을 복사  ------> (1)

위의 (1)을 각각 인텔 CPU와 모토롤라 CPU의 Nmemonic으로 표현해보자.

mov var2,var1                (인텔 CPU)                             -------> (2)
ld var1,var2                (모토롤라 CPU)                       -------> (3)


<물론, (2)와 (3)은 이해를 돕기 위한 것으로 정확한 표현은 아니다. CISC 방식의 CPU에서는 데이터 이동에 반드시 accumulator가 개입되기 떄문인데 편의 상 이렇게 쓴다. 물론, Power CPU는 RISC라서 accumulator라는 개념이 없지만 MC68030등 모토롤라 32비트 CPU까지는 accumulator가 있었다. 그 것도 두 개나. 이런 두 개의 accumulator의 존재는 한 개보다는 여러가지 이점이 있지만.. 그닥 절실하게까지는 느껴지지 않는다. >


mov는 move의 약자이고 ld는 load의 약자이다. 그런데 (1)과 (2)는 destination이 source왼쪽에 위치해 있는 반면 (3)은 destination이 source의 오른쪽에 있다. 이는 CPU 차별화의 산물이기도 하지만 보다 많은 이유에서 출발한 것이다. <-- 이 부분은 생략


5. CISC와 RISC

Aseembler 프로그램을 했던, C로 프로그램을 했던, Visual Basic으로 프로그램을 했던 각각은 Assembling 또는 Compiling의 과정을 거쳐 기계어로 만들어진다. 기계어는 바이너리로 이 것을 해독하여 CPU의 명령을 수행하는 부분을 마이크로 코드라고 한다. CPU의 핵심이자 엑기스이다.

CPU는 수많은 명령을 가지고 있다. 그리고 명령수에 비례하여 마이크로코드는 복잡해질 수 밖에 없다. 그 것을 감수하고서라도 더 많은 프로그램 작성 시의 편리성을 위하여 수많은 CPU명령이 더해져 갔다. 그 것을 흔히 CISC라고 한다.


그런데 재미있는 통계 하나가 발표된다. 그 것은 CISC로 작성한 프로그램을 분석해 보니 데이터 이동을 처리하는 명령어가 프로그램에 사용한(Assembling이나 Compiling을 한 후의 기계어 수준에서) 명령의 70% 이상이라는 것이다.


그래서 나온 것이 RISC CPU이다. CPU 명령의 70% 이상이므로 다른 명령들은 데이터 처리하는 명령으로 대체하면 마이크로코드 설계가 간단해지고 속도를 증가시킬 수 있다는 것이다.

비유해서 표현하자면 CISC CPU가 9 x 9 = 81이라는 명령을 직접 수행할 수 있다면 RISC는 9 x 9 = 81을 9 + 9 + 9.... + 9 = 81로 결과를 얻겠다는 것이다.


RISC의 개념은 CPU 역사에서 혁명적인 개념 중 하나이다. 그리고 C 언어가 Assemble를 젖히고 프로그램 개발 언어의 본좌로 등극하면서 RISC CPU의 개념은 CPU의 대세로 자리잡는듯 했다.


그러나 컴퓨터의 용도가 다양해지면서 RISC와 CISC의 논쟁은 점차 격화되어 갔고 지금은 CISC 기반 RISC의 CPU 설계가 대세인 것 같다. 



6. IBM-PC는 왜 모토롤라 CPU가 아닌 인텔 CPU를 채택했을까?


펜티윰 CPU는 CISC의 대표적인 CPU이고 Power CPU는 RISC의 대표적인 CPU이다. 이 두 개의 CPU를 가지고 Assembler로 프로그램을 작성해 본 적이 몇 번 있는데 동일 목적의 프로그램을 C 언어로 작성했을 때와 비교하여 각각의 경우에는 속도가 빨랐지만(약 20% 정도) 각각을 C 언어와 비교해 보았을 때 어느 쪽이 더 빠른지는 느끼지 못했다.

(IBM-PC에서 Assembler로 작성하는 닭짓을 한 이유는 나중에 ㅠ.ㅠ;;; <-- 내가 하면서도 왜 내가 이런 쓸데없는, 시대에 역행하는 닭짓을 해야하는지 의문이 많이 들기도 했다. 간단하게, IBM-PC 사양을 올리면 되는데 말이다.)


인텔이 4040이라는 4비트 CPU를 처음 발표한 후 곧 이어 i8080과 i8085라는 8비트 CPU를 발표하였다. 모토롤라는 이에 대응하여 MC6800이라는 8비트 CPU를 발표하여 시장에서 치열한 각축을벌였다. 그런데 인텔에서 근무하던 엔지니어들이 독립하여 만든 Zilog사에서 발표한 Z80이 8비트 CPU 시장의 대세로 자리잡았다. 그리고 세계의 거의 대부분의 반도체 회사가 CPU를 발표하였는데 가전용에 쓰기 위하여 외부메모리를 CPU에 built-In한 'One Chip'이 쏟아져 나왔다.


그리고 시장의 각축전은 16비트 CPU로 넘어갔다. 당시, Intel의 i8086과 MC68000 그리고 자이로그사의 Z8000을 한번 이상 써보았는데 Z8000이 가장 나아보였다. 그러나 16비트 CPU.... 그리고 그 이후의 CPU 시장은 반도체 회사들의 경쟁력이 아닌 제 3자에 의하여 결정이 되어 버렸다.


바로 IBM-PC 시장이다. IBM-PC는 본사에서 만들어진 것이 아니다. 시그네틱스 사의 6502라는 8비트 CPU를 탑재한 애플의 PC가 시장에서 성공했지만 당시 IBM은 PC 시장을 쳐다도 보지 않았다. 그런 상황에서 예를 들어 삼보컴퓨터로 치면 한 A/S 대리점의 엔지니어들(정확하게 표현하자면 엔지니어가 아니라 테크니션이지만).... 조직 내에서 그런 위치에 있던 엔지니어들이 IBM-PC를 만들어낸 것이다.


그리고 에플 컴퓨터와 차별화를 위해 i8086이라는 16비트 CPU를 사용하였다.(호환 기종은 i8088이라는 내부는 16비트 처리를 하지만 CPU 외부는 8비트로 동작시키는 CPU가 많이 사용되었다) 그리고 당시 모토롤라는 16비트 CPU를 발표하지도 않았다.



만일, 모토롤라가 MC68000이라는 16비트 CPU를 인텔보다 먼저 발표했다면 어떻게 되었을까? 


당시 16비트 시장에서 i8086보다는 MC68000의 우수성은 재론의 여지가 없을 정도였으니 아마도 IBM-PC는 MC68000이 채택되었을 것이고 그러면 현재 우리가 알고 있는 CPU 시장 나아가 전자/IT산업은 전혀 다른 역사가 펼쳐졌을 것이다.


그리고 반대로, 삼성의 DRAM 분야에서의 절대 우위 현실도 없었을 것이다. 왜냐하면, 인텔이 CPU 시장에 주력하면서 DRAM과 플래시 메모리 분야를 차례로 포기했으니까. 물론, 당시의 DRAM 특허는 TI(Texas Instrument)사가 가지고 있었지만 DRAM 그리고 이어지는 플래시 메모리 시장에서의 인텔의 경쟁력은 충분했으며 CPU 대신 메모리 시장에 사활을 걸었을 인텔이라면 삼성은 아마도... 메모리 시장에서 대패를 하고 지금쯤은 회사가 존재하지도 못했을지 모른다.



7. 역사에서 항상 '바람은 불기 마련이고' '승자만이 기억되는 것'인데 CPU 시장 역시 예외는 아니다. 


서머셋 동맹이던가....? 인텔과 마이크로소프트에 대항하기 위한 기업 연합..... 이 동맹의 세 주역인 애플, IBM 그리고 모토롤라.


애플컴퓨터는 미국의 독과점 방지에 걸리지 않기 위하여 빌 게이츠의 투자로 연명해가는게 현실이고 IBM과 모토롤라는 반도체 분야를 포기했고 그 단초를 IBM-PC라는 역사적 발명(?)이 제공했는데 당시 이 것을 개발한 엔지니어들은 자신들의 시도가 훗날 산업 재편의 단초를 제공했다는 것을 꿈엔들 상상했을까?


pico technology.

나노테크놀로지가 현재까지 기술 진보의 첨병이고 pico technology는 정식 용어로 채택되어 있지 않고 일부 반도체 제조 회사에서 언급하는 용어에 불과하다. 그러나 pico technology 기술의 시대가 온다면, 내 판단에 인텔이나 삼성보다는 IBM이나 모토롤라가 더 적합한 회사였다는 것이고 보면 이 두 회사를 퇴출하게 만든 계기를 마련한 IBM-PC의 등장은, 인류 지적 수준을 폭발적으로 높이는데 공헌했지만 장기적으로는 인류기술 수준을 정체시키는데 한 역할을 한 주범으로 먼 훗날 평가될지도 모른다. (물론, 자신이 발명한 제품에 발목이 잡힌 IBM의 닭짓은 아마도.... 산업역사에서 '어처구니 없는 일들 중' 상위를 점유할 것이 틀림없지만 말이다.)


마치, 빌 게이츠의 윈도즈를 비야냥 거리면서 '창조적인 소프트웨어를 노가다 수준으로 전락시킨 제품'이라는 천재적인 소프트웨어 엔지니어들의 비야냥과 마찬가지로 말이다.

백이숙제는 "以暴易暴"를 남겼고 한그루는 "以"를 남기고 간다.