CS

[CS] CISC와 RISC

seonggu 2023. 2. 21. 14:31

CPU 마지막 파트.

CPU의 언어인 ISA에 대해 알아보고 현대 CPU의 주요 설계 방식인 CISC와 RISC의 정의와 차이점 정리

 

명령어 파이프라이닝과 슈퍼스칼라 기법을 실제로 CPU에 적용하려면 명령어가 파이프라이닝에 최적화되어 있어야 한다.

쉽게 말해서 CPU가 파이프라이닝과 슈퍼스칼라 기법을 효과적으로 사용하려면 CPU가 인출하고 해석하고 실행하는 명령어가 파이프라이닝 하기 쉽게 생겨야 한다.

 

명령어가 어떻게 생겨야 파이프라이닝에 유리할까? 파이프라이닝 하기 쉬운 명령어란 무엇일까? 

이와 관련하여 CPU의 언어인 ISA와 각기 다른 성격의 ISA를 기반으로 설계된 CISC와 RISC를 알아보자.

 

1️⃣ 명령어 집합

CPU는 명령어를 실행한다고 했다. 그런데 세상에는 수많은 CPU 제조사들이 있고, CPU마다 규격과 기능, 만듦새가 다 다르다. 모든 CPU가 이해하고 실행하는 명령어들이 다 똑같을까?

 

그렇지 않다. 앞선 글에서 정리했던 명령어의 기본적인 구조와 작동원리는 비슷하나 명령어의 세세한 생김새, 명령어로 할 수 있는 연산, 주소지정 방식 등은 CPU마다 조금씩 차이가 있다. CPU가 이해할 수 있는 명령어들의 모음을 명령어 집합(instruction set) 또는 명령어 구조(ISA; Instruction Set Architecture)이라고 한다. 즉, CPU마다 ISA가 다를 수 있다.

 

✅ 명령어 집합에 '구조'라는 단어가 붙은 이유는 CPU가 어떤 명령어를 이해하는지에 따라 컴퓨터 구조 및 설계 방식이 달라져서 이다.

 

예를 들어 인텔 노트북 CPU는 x86 혹은 x86-64 ISA를 이해하고, 애플의 아이폰 속 CPU는 ARM ISA를 이해한다. x86(x86-64)과 ARM은 다른 ISA이기 때문에 인텔 CPU를 사용하는 컴퓨터와 아이폰은 서로의 명령어를 이해할 수 없다. 실행 파일은 명령어로 이루어져 있고 서로 컴퓨터가 이해할 수 있는 명령어가 다르기 때문이다.

 

어셈블리어는 명령어를 읽기 편하게 표현한 언어이다. ISA가 다르다는 건 CPU가 이해할 수 있는 명령어가 다르다는 뜻이고, 명령어가 달랐지만 어셈블리어도 달라진다. 같은 소스코드로 만들어진 프로그램이라고 할지라도 ISA가 다르면 CPU가 이해할 수 있는 명령어도 어셈블리어도 달라진다는 것이다.

 

ISA가 같은 CPU끼리는 서로의 명령어를 이해할 수 있지만, ISA가 다르면 서로의 명령어를 이해하지 못한다. 이런 점에서 볼 때 ISA는 일종의 CPU의 언어와 같다.

 

CPU가 이해하는 명령어들이 달라지면 명령어의 생김새만 달라지는 것이 아니다. ISA가 다르면 그에 따른 많은 것들이 달라진다. 제어장치가 명령어를 해석하는 방식, 사용되는 레지스터의 종류와 개수, 메모리 관리 방법 등 많은 것이 달라진다. 이는 CPU 하드웨어 설계에도 영향을 미친다.

 

우리가 실행하는 프로그램은 명령어로 이루어져 있다. ISA는 CPU의 언어임과 동시에 CPU를 비롯한 하드웨어가 소프트웨어를 어떻게 이해할지에 대한 약속이라고도 볼 수 있다.

 

앞선 글에서 명령어 병렬 처리 기법들을 알아보았다. 이를 적용하기에 용이한 ISA가 있고, 그렇지 못한 것도 있다. 다시 말하면 파이프라인, 슈퍼스칼라, 비순차적 명령어 처리를 사용하기에 유리한 명령어 집합이 있고, 그렇지 못한 명령어 집합도 있다. 그렇다면 명령어 처리 기법을 도입하기 유리한 ISA는 무엇일까? CISC와 RISC에 대해 알아보자.

 

 

2️⃣ CISC

CISC(Complex Instruction Set Computer)의 약자이다. 그대로 해석하면 '복잡한 명령어 집합을 활용하는 컴퓨터'이다.

컴퓨터를 CPU라고 생각해도 좋을 것 같다. CISC는 이름 그대로 복잡하고 다양한 명령어들을 활용하는 CPU 설계 방식이다. ISA의 한 종류인 x86, x86-64는 대표적인 CISC 기반의 ISA이다.

 

CISC는 다양하고 강력한 기능의 명령어 집합을 활용하기 때문에 명령어의 형태와 크기가 다양한 가변 길이 명령어를 활용한다. 메모리에 접근하는 주소 지정 방식도 다양해서 특별한 상황에서만 사용되는 독특한 주소 지정 방식들도 있다.

 

다양하고 강력한 명령어를 활용한다는 말은 상대적으로 적은 수의 명령어로도 프로그램을 실행할 수 있다는 것을 의미한다. x86-64 코드 길이가 ARM보다 일반적으로 짧다. 이는 ARM 명령어 여러 개로 수행할 수 있는 일을 x86-64 명령어 몇 개 만으로도 수행할 수 있음을 알 수 있다.

✅ 프로그램을 실행하는 명령어 수가 적다는 말은 '컴파일된 프로그램의 크기가 작다'는 것을 의미한다. 같은 소스코드를 컴파일해도 CPU마다 생성되는 실행 파일의 크기가 다를 수 있다.

하여 CISC는 메모리 공간을 절약할 수 있다는 장점이 있다. 하지만 단점도 존재한다. 활용하는 명령어가 복잡하고 다양한 기능을 제공하여 명령어의 크기와 실행되기까지의 시간이 일정하지 않다. 또한, 복잡한 명령어 때문에 명령어 하나를 실행하는 데에 여러 클럭 주기를 필요로 한다.

 

이는 명령어 파이프라인을 구현하는 데에 단점으로 작용한다. 명령어 파이프라인 기법을 위한 이상적인 명령어는 각 단계에 소요되는 시간이 (가급적 1클럭) 동일해야 한다. 그래야 파이프라인이 공장의 생산 라인처럼 결과를 낼 수 있다.

하지만, CISC가 활용하는 명령어는 명령어 수행 시간이 길고 가지각색이기 때문에 파이프라인이 효율적으로 명령어를 처리할 수 없다. 규격화되지 않은 명령어가 파이프라이닝을 어렵게 만든 것이다. 명령어 파이프라인이 제대로 작동하지 않는다는 것은 현대 CPU에서 치명적인 약점이 된다. 왜냐하면 높은 성능을 기대하기 어렵기 때문이다.

게다가 CISC가 복잡하고 다양한 명령어를 활용할 수 있다고 하지만, 대다수의 복잡한 명령어는 사용 빈도가 낮다. 1974년 IBM 연구소의 존 코크(John Cocke)는 CISC 명령어 집합 중 불과 20% 정도의 명령어가 사용된 전체 명령어의 80%가량을 차지한다는 것을 증명했다. CISC 명령어 집합이 다양하고 복잡한 기능을 지원하지만 실제로는 자주 사용되는 명령어만 쓰였다는 것이다.

 

정리
CISC 명령어 집합은 복잡하고 다양한 기능을 제공하기에 적은 수의 명령으로 프로그램을 동작시키고 메모리를 절약할 수 있다. 하지만 명령어의 규격화가 어려워 파이프라이닝이 어렵다. 또한, 대다수의 복잡한 명령어는 사용 빈도가 낮다.

 

 

3️⃣ RISC

앞선 CISC로 알아낸 것은

1) 빠른 처리를 위해 명령어 파이프라인을 활용해야 한다. 원활한 파이프라이닝을 위해 '명령어 길이와 수행 시간이 짧고 규격화'되어 있어야 한다.

2) 자주 쓰이는 명령어만 줄곧 사용됨. 복잡한 기능을 지원하는 명령어를 추가하기보다 자주 쓰이는 기본적인 명령어를 작고 빠르게 만드는 것이 중요하다.

 

이런 것들을 생각하여서 만든 것이 RISC(Reduced Instruction Set Computer)이다.  CISC와 달리 짧고 규격화된 명령어, 되도록 1클럭 내외로 실행되는 명령어를 지향한다.고정 길이 명령어를 활용한다.

 

명령어가 규격화되어 있고, 하나의 명령어가 1클럭 내외로 실행되기 때문에 RISC 명령어 집합은 명령어 파이프라이닝에 최적화되어 있다. 그리고 RISC는 메모리에 직접 접근하는 명령어를 load, store 두 개로 제한할 만큼 메모리 접근을 단순화하고 최소화를 추구한다. 그렇기 때문에 CISC보다 주소 지정 방식의 종류가 적은 경우가 많다.

(이런 점에서 RISC를 load-store 구조라고도 함.)

 

RISC는 메모리 접근을 단순화, 최소화하는 대신 레지스터를 적극적으로 활용한다. 그렇기에 CISC보다 레지스터를 이용하는 연산이 많고, 일반적인 경우보다 범용 레지스터 개수도 많다. 다만 사용가능한 명령어 개수가 CISC보다 적기 때문에 RISC는 많은 명령으로 프로그램을 작동시킨다.

 

 

정리 ❗❗❗ 

 

 

참고자료 -