| <bgcolor=#96834a> 명령어 집합 | |
| CISC | x86 (AMD64● · IA-32● · IA-16) · M68K · MC68xx · MOS 65xx · Z80 · 8080 · 8051 System/360 · z/Architecture · PDP-11 · VAX |
| RISC | Arm (A64 · A32 · T32) · RISC-V● · MIPS● · DEC Alpha● · Power ISA IBM Power · PowerPC · CELL-BE LoongArch · OpenRISC · PA-RISC · SPARC SuperH · Xtensa · AVR AVR32 |
| VLIW EPIC | E2K · IA-64 · Crusoe |
1. 개요
Reduced Instruction Set ComputerRISC는 명령어를 단순하고 규칙적인 형식으로 제한해 하드웨어 구현의 복잡도를 줄이는 것을 목표로 하는 명령어 집합 아키텍처 설계 내지는 이를 구현한 CPU를 의미한다. RISC라는 이름은 1980년 데이비드 패터슨과 데이비드 디첼이 발표한 논문에서 처음 쓰였다.
첫 구현은 IBM에서 1970년대부터 연구하여 1980년 시제품을 제작한 IBM 801이며, 80년대 컴퓨터과학자 데이비드 패터슨과 존 헤네시가 학계의 초기 연구를 주도하였다. UC 버클리에서 데이비드 패터슨이 진행한 Berkeley RISC 연구는 1987년 등장한 SPARC로 이어졌으며, 스탠포드 대학교에서 존 헤네시가 진행한 MIPS 연구는 1986년 MIPS 아키텍처로 이어진다. 패터슨과 헤네시는 RISC를 정립한 공로로 2017년 튜링상을 수상하였다.
20세기 등장했던 MIPS, SPARC, PA-RISC, DEC Alpha 등 많은 RISC 아키텍처가 개발이 중단되어 역사 속으로 사라졌으나, 반대로 Arm 아키텍처 및 RISC-V는 크게 성공하여 현 시점에도 많은 RISC 프로세서가 출하되고 있다.
2. 특징
기본적인 개념은 트랜지스터 기반의 메인프레임을 개선하는 과정에서 개발된 아키텍처 개념으로, 최대한 단순히 설명하자면 그동안 별 생각 없이 중구난방으로 만들어 온 CPU 명령어셋을 CPU를 고속화시키는 데 적절하게 재정립하여 같은 트랜지스터 숫자를 투입하면서도 더 높은 성능의 CPU를 만들자는 것이다.1980년대 당시 CISC 명령어셋에 대해 지적되는 문제점은 다음과 같았다.
- 명령어 길이가 제각각이다. 따라서 명령어를 인출할 때 언제가 명령어 종료 시점인지 알 수 없으며 다중 사이클이 소요되는 명령어를 그대로 파이프라인 처리를 할 경우 파이프라인 버블이 발생하여 처리효율을 떨어뜨린다.
- 명령어 포맷이 중구난방이다. 때문에 명령어 해석기에서 특정 내용을 액세스하려고 할 경우 그 명령어에 대한 인출과 해석이 완전이 끝나야 가능하다.
- 명령어에 레지스터 대상이 아닌 메모리를 대상으로 한 연산이 섞여 있다. 메모리를 대상으로 한 연산의 경우 메모리 액세스 사이클의 손실이 정확히 얼마일지 알 수 없기 때문에 파이프라인의 정확한 운용이 어려워진다.
- 각 명령어들의 실행 사이클이 제각각이다. 어떤 명령어는 1사이클, 어떤 명령어는 3사이클 하는 식으로... 이러한 구조는 파이프라인의 효율성을 심각하게 저하시킨다.
- 마이크로코드를 통해 구현된 복잡한 기능의 명령어는 처음 도입할 때는 타당성이 있었을지 모르지만 CPU 기술이 발전하면서 다른 방식으로 처리하는 게 더 빨라지는 사태가 발생했다.
- 마이크로코드 방식 자체가 CPU의 명령어 해석기 고속화에 발목을 잡게 되었다.
- 명령어의 구조가 누산기 구조를 유지하고 있다. 명령어가 2개의 레지스터/메모리만을 액세스 가능하므로 a+b의 연산을 c에 따로 저장하지 못하고 b의 내용에 덮어쓰면서 b의 내용을 재활용하지 못하게 된다.
- 레지스터의 기능이 일정하지 못하고 특수기능이 포함된 경우가 많아 컴파일러의 복잡성을 증대시켰다.
- 프로그램 코드와 데이터가 단일 캐시메모리 공간에 위치하고 있는 폰노이만 구조는 코드의 메모리 동작 특성과 데이터의 메모리 동작 특성이 크게 다르다는 사실을 반영하지 못하고 있다.
- ROM 기반이던 마이크로코드 해석기는 수정이 불가능하고 유연성이 떨어지지만 속도가 상대적으로 빠르다는 장점이 있었는데 RAM 기술이 비약적으로 발달하면서 이런 장점도 퇴색되었다.
이러한 문제점들을 해결하기 위해 RISC가 등장하였고 아래와 같은 방법으로 문제를 해결하였다.
- 명령어 길이를 비교적 일정하게 정리하고 포맷을 일정하게 다듬었다. 그 결과 명령어 디코더가 크게 단순화되었다. 또한 파이프라인에 버블이 낄 가능성이 낮아졌다. 남아도는 트랜지스터는 다른 목적으로 할당되면서 성능이 향상되었다.
- 메모리를 대상으로 하는 연산은 load/store 연산만 가능하게 하고 나머지는 모두 레지스터를 사용하게 했다. 즉 메모리와 레지스터를 대상으로 하는 연산을 분리하여 복잡성과 레이턴시를 낮추고 명령어 낭비를 줄였다.
- 각 명령어들의 실행 사이클을 1사이클로 일정하게 조정하였다.
- 누산기 구조를 폐지하였다. 명령어는 소스 레지스터와 별도의 타겟 레지스터를 지정할 수 있다. 즉 b+=a에 종속된 구조에서 탈피하여 c=a+b 동작이 가능해졌다. 이는 불필요한 레지스터간 데이터 복사를 피할 수 있다.
- 레지스터는 기본적으로 일반목적레지스터(GPR)로 설계되어 복잡도를 낮추고 컴파일러 설계를 단순화하였다 또한 레지스터 개수를 늘려 상대적으로 느린 메모리에 대한 의존도를 낮춘다.
- 가능한 명령어 시퀀스의 경우의 수가 줄어 어셈블러, 컴파일러 설계가 단순해졌다.
- 하드웨어 최적화를 방해하던 마이크로코드를 폐지하였다.
다만 RISC는 다음과 같은 단점을 가지게 되었다.
- 메모리를 소스 혹은 타겟으로 쓸 수 없게 되면서 그 역할을 대체해야 하는 더 많은 레지스터가 필요하게 되었다.
- 명령어 길이가 제약되면서 분기 명령의 점프 범위가 제약되었다. CISC에서는 분기 명령의 점프 범위를 단순히 코드 길이를 늘리는 것으로 해결할 수 있지만 RISC 명령어는 그게 불가능하다.
- 그리고 가장 현실적인 단점은... x86이 아니더라는 것이었다. 당시 x86으로 대세가 흘러가는 시장 상황에서 이것만큼 큰 단점도 달리 없었다. 단적으로 이 시기에서는 PowerPC로 Microsoft Windows를 돌리긴 했지만 Arm으로는 Microsoft Windows를 못 돌렸다! x86이 다소 쇠퇴하고 있는 2010년대의 시점에서 보면 상전벽해가 따로 없을 지경.
3. 역사
1970년대까지 컴퓨터가 지원하는 명령어가 점점 늘어나는 과정에서 하드웨어의 기능이나 처리 속도 개선과는 본질적으로 무관한 프로그래머의 편의만을 위한 부가적인 명령어가 전체 명령어의 대다수를 차지하게 되었고, 이를 구현하기 위해 크고 복잡한 마이크로코드가 요구되어 칩의 면적이 필요 이상으로 커지게 되었다. 이러한 경향의 정점으로 평가되는 1977년 발표된 VAX의 경우 아예 다항식의 값을 통째로 계산하는 명령어가 존재할 정도였다.한편 1970년대 기존 컴퓨터를 분석한 결과 프로그램에서 실행하는 명령어의 대부분은 간단한 명령어라는 것이 드러났고, 같은 시기 컴파일러의 발전과 메모리의 대용량화/저가화 트렌드가 겹치며 복잡한 명령어 없이 단순한 명령어들로만 컴퓨터를 만들자는 아이디어가 등장하게 되었다.
1970년대 IBM에서는 IBM 801을 개발하며 이 개념을 도입하였다. 이 과정에서 등장한 컴파일러 기법이 컴파일러 백엔드 분야에서 잘 알려진 그레고리 차이틴(Gregory Chaitin)의 레지스터 할당 알고리즘이다.
한편 1970년대 후반 데이비드 패터슨은 마이크로코드를 연구하는 과정에서 같은 개념을 독립적으로 구상하여 1980년 "RISC" 개념을 주장하는 글을 발표하였다.
이어서 1980년대 초 UC 버클리에서는 RISC 프로젝트를, 스탠포드에서는 MIPS 프로젝트를 진행하며 당대 대표적인 미니컴퓨터였던 VAX보다 높은 성능을 정량적으로 입증하였다.
이에 따라 1980년대 중반부터 1990년대 초반까지 ARM, MIPS 아키텍처, HP의 PA-RISC, Sun의 SPARC, 인텔의 i960, AMD의 Am29000, IBM의 POWER, DEC의 Alpha 등이 우후죽순 상용화되며 RISC의 첫 번째 전성기가 열렸다.
그러나 1990년대 인텔과 AMD가 프로세서 내부적으로 RISC와 유사한 구조를 도입하며 PC 시장에서 얻은 막대한 수익을 투자해 경쟁적으로 성능을 높였고, 규모의 경제에 힘입어 과거 RISC의 주력 시장이었던 고성능 워크스테이션 및 서버 시장을 잠식하며 많은 RISC 프로세서 업체가 쇠퇴하게 되었다. 동시에 임베디드 시장에서 RISC가 성장하면서 MIPS는 임베디드 시장에서 명맥을 유지하게 되었고, Arm이 점차 성장하게 되었다.
이후 2000년대부터 모바일 시장이 급격하게 성장하였고, 여러 요소가 겹쳐 Arm이 이 시장의 과실을 독식하게 되면서 RISC가 다시 주목받기 시작하였다. 이후 2010년대 들어 스마트폰 시장이 PC 시장보다 더 커지게 되면서 RISC의 두 번째 전성기가 열렸다.
특히 2020년 애플이 맥 라인업에서 기존 인텔 프로세서를 Arm 아키텍처 기반 Apple Silicon으로 대체하였고, 클라우드 업체에서도 Arm 코어 기반 프로세서를 도입하며 2020년대 현재는 x86의 영역이었던 PC/서버까지 공세를 전개하는 상황이다.
4. RISC에 대한 평가
이렇게 장점만 보면 RISC가 CISC보다 진보된 아키텍처로 보이겠지만 현실적으로 PowerPC가 단종되고 POWER를 장착한 서버와 메인프레임이 금융권에서마저 퇴출되는 데에는 이유가 있는 법이다.AMD64 vs Arm 문서 참고.
4.1. 오해
RISC와 관련하여 여러 가지 오해가 생기고는 한다. 아래는 오해가 생길만한 내용들을 정리했다.- RISC는 정말로 명령어가 적은가?
현존하는 RISC 프로세서에는 곱셈, 나눗셈이 없는 것부터 명령어가 천 개가 넘는 것까지 그 목적에 따라 다양하다. RISC라고 하여 성능을 희생하여 다른 명령으로 쉽게 대체할 수 없는 명령을 없애는 것은 아니다. 특히 Arm의 경우 MIPS나 RISC-V등과 비교하면 명령어가 더 많은 편이다.
- RISC는 성능이 낮은가?
- RISC는 저전력인가?
- RISC는 명령어 밀도가 낮은가?
아래는 SPECint2006 바이너리의 코드 크기이다.
RV32C, Thumb, microMIPS (MIPS16e)와 같이 명령어 단위를 16비트 단위로 간략화하여 성능을 조금 희생하되 임베디드와 같이 작은 메모리를 가진 환경에서 동작시키기 위한 명령어 세트로, CISC인 x86을 RV32C, Thumb-2, MIPS16e와 비교하면 비슷하거나 오히려 코드 밀도가 낮아 보이지만 32비트 단위인 표준 세트인 RV32, Armv7-A, MIPS32와 x86을 비교하면 가변 길이를 가진 CISC보다 밀도가 낮음을 확인할 수 있다.
5. 현황
이 기술이 개발된 뒤 RISC 기술은 마이크로프로세서의 클럭 속도 향상에 큰 도움을 주었다. 90년대 중반이 지나서는 PowerPC, POWER, UltraSparc, Alpha 등 대부분의 고성능 CPU와 Arm과 같은 저전력 CPU, 그리고 일부 MCU들까지도 RISC이거나 RISC 구조를 기반으로 하였다. CISC의 대표 주자인 인텔도 RISC 기반 마이크로프로세서 개발에 심혈을 들였는데 그 예로 IA-64[1]와 iAPX 계열 CPU(Intel i960, Intel i860) 등이 있다.인텔은 인텔 펜티엄 프로에서부터 내부적으로는 CISC 명령어를 RISC 구조의 코드로 변환해서 실행하는 P6 아키텍처로 개편하였다. 또한 인텔보다 한발 앞서서 AMD는 K6에 동일한 설계를 구현하였다. 인텔이 IA-64를 개발
기술이 발전하며 CISC와 RISC에 대한 사실도 많이 변화하였다.
CISC와 RISC의 차이 중 하나는 실행 속도라고 배웠을 텐데 RISC 아키텍처 기반 프로세서와 CISC 아키텍처 기반 프로세서의 실행속도는 거의 차이가 나지 않는다. CPU 기술의 발달로 클럭 속도는 전력 소모량과 온도 조절에 달린 문제라 해도 과언이 아니다. 이론상 RISC 프로세서의 클럭속도를 더 높일 수는 있겠지만 CPU의 성능 증가 대비 전력 소모량과 발열 문제가 더 크기에 두 프로세서의 실행속도는 결과적으로 거의 차이가 나지 않는다.
또한 RISC 아키텍처 기반 프로세서의 제작 단가가 더 싸다고 아는 사람들이 많은데 이것은 명백한 오류이다. 설계 및 제작 비용이 비싼 명령어 해석기의 크기를 획기적으로 줄였지만 현대 CPU에서 명령어 해석기가 차지하는 면적은 1% 이하이다. 하지만 RISC 명령어 코드가 메모리 대역폭을 평군적으로 2배 더 잡아 먹기에 같은 성능의 CISC 기반 프로세서에 비해 RISC 기반 프로세서는 2배 더 많은 캐시가 필요하다. 요즘 CPU의 75–80%가 캐시 혹은 레지스터인 것을 감안하여 1% 이하의 회로를 줄이기 위해 80%를 더 추가하는 셈이다. SRAM을 구성하는 셀은 4개의 트랜지스터가 필요한데 32MB의 대용량 캐시를 구성하기 위해서 10억 단위가 나온다. AMD의 8코어 CPU의 트랜지스터 집적 숫자가 60억에 달하는데 이중에 6분의 1이 캐시 메모리에 사용된다는 것이다. 명령어가 많다고 무조건 단가가 비싼 것도 아니고 적다고 싼 것도 아니다. 정확히는 설계 스타일에 따라 달려 있고 RISC도 고성능 지향으로 간다면 설계 면적이 넓어진다.
흔히 CISC와 RISC를 서로 대립되는 포지션으로 취급하는 경우가 많은데 이는 RISC가 등장하게 된 이유나 최근의 CPU 설계 경향 등에 비추어 봤을 경우 적절한 취급이라고 할 수 없다. 우선 상기한 바와 같이 RISC는 CISC에서의 단점을 분석하고 극복하는 연구 과정에서 탄생한 명령어셋으로 명백하게 CISC보다 더 발전된 개념을 포함한 차세대 기술이다. 그렇기 때문에 RISC가 출현한 이후 100% CISC 기술에 기반한 신규 명령어셋은 실질적으로 도태되는 수순을 밟게 되었고 주류 컴퓨터 산업에서는 CISC 아키텍처 기반 프론트엔드에 RISC가 흡수된 형태의 하이브리드를 보여주고 있다. 일반적 PC 프로세서[3]는 모두 CISC x86 아키텍처를 기본으로 하며
하지만 CPU의 클럭 속도를 더 이상 올리는 한계가 도래한 지금, 명령어 길이가 일정하다는 특징으로 명령어 병렬처리(Out-of-Order 실행)에 엄청난 이득이 발생, Apple의 M1칩이 CISC의 맹주인 Intel과 AMD의 속도를 따라 잡았다. Apple M1칩은 왜 그렇게 빠를까?영어 원문
6. 아키텍처 목록
- R800 - MSX Turbo R에 사용된 16비트 CPU.