복잡 명령어 집합 컴퓨터

**복잡 명령어 집합 컴퓨터**(**CISC**, complex instruction set computer)는 단일 명령어가 여러 개의 저수준 작업(메모리로부터의 로드, 산술 연산, 메모리 저장 등)을 수행하거나, 단일 명령어 내에서 다단계 작업 또는 주소 지정 방식이 가능한 컴퓨터 구조를 말한다. 이 용어는 축소 명령어 집합 컴퓨터(RISC)와 대비하여 소급적으로 만들어졌으며, 따라서 RISC가 아닌 모든 것을 가리키는 일종의 포괄적 용어가 되었다. RISC 아키텍처의 가장 일반적인 차별화 요소는 균일한 명령어 길이와 엄격하게 분리된 메모리 접근 명령어이다.

CISC 아키텍처의 예로는 복잡한 메인프레임부터 메모리 로드 및 저장 작업이 산술 명령어와 분리되지 않은 단순한 마이크로컨트롤러까지 다양하다. 소급적으로 CISC로 분류된 특정 명령어 집합 아키텍처로는 System/360부터 Z/아키텍처까지, PDP-11 및 VAX 아키텍처 등이 있다. 많은 학술 출판물에서 CISC로 분류된 잘 알려진 마이크로프로세서 및 마이크로컨트롤러에는 모토로라 6800, 6809 및 모토로라 68000 시리즈 제품군, 인텔 8080, iAPX 432, x86 및 8051 제품군, 자일로그 Z80, Z8 및 Z8000 제품군, 내셔널 세미컨덕터 NS320xx 제품군, MOS 6502 제품군 등이 포함된다.

일부 설계는 일부 저술가들에 의해 경계선에 있는 사례로 간주되기도 한다. 예를 들어, 마이크로칩 테크놀로지 PIC는 어떤 진영에서는 RISC로, 다른 진영에서는 CISC로 분류되어 왔다.

## 동기 및 장점
RISC 철학이 두드러지기 전까지 많은 컴퓨터 설계자들은 소위 의미론적 간극을 메우기 위해 노력했다. 즉, 프로시저 호출, 루프 제어, 복잡한 주소 지정 방식과 같은 고수준 프로그래밍 구문을 직접 지원하는 명령어 집합을 설계하여 데이터 구조와 배열 접근을 단일 명령어에 결합할 수 있도록 했다. 또한 코드 밀도를 더욱 높이기 위해 명령어는 일반적으로 고도로 인코딩된다. 이러한 명령어 집합의 콤팩트한 특성은 프로그램 크기를 줄이고 주 메모리 접근(종종 느렸던) 횟수를 줄여주었으며, 이는 당시(1960년대 초반 이후) 컴퓨터 메모리 및 디스크 저장 장치 비용을 엄청나게 절감하고 실행 속도를 높이는 결과를 가져왔다. 또한 포트란이나 알골과 같은 고급 언어를 항상 사용할 수 있거나 적절하지 않았던 시기에 어셈블리어로도 좋은 프로그래밍 생산성을 낼 수 있음을 의미했다. 실제로 이 범주의 마이크로프로세서들은 특정 유형의 중요한 애플리케이션을 위해 여전히 어셈블리어로 프로그래밍되기도 한다.

### 새로운 명령어
1970년대에 고급 언어를 분석한 결과, 컴파일러가 그에 대응하는 복잡한 기계어를 생성한다는 것이 나타났다. 새로운 명령어가 성능을 향상시킬 수 있다는 판단이 내려졌다. 어셈블리어에서 사용될 의도는 전혀 없었지만 컴파일된 고급 언어와 잘 맞는 일부 명령어들이 추가되었다. 컴파일러는 이러한 명령어를 활용하도록 업데이트되었다. 콤팩트한 인코딩을 가진 의미론적으로 풍부한 명령어의 이점은 현대 프로세서, 특히 캐시가 중심 구성 요소인 고성능 부문에서도 볼 수 있다(대부분의 임베디드 시스템과는 대조적임). 이는 빠르지만 복잡하고 비싼 이러한 메모리가 본질적으로 크기가 제한되어 있어 콤팩트한 코드가 유리하기 때문이다. 물론 이들이 필요한 근본적인 이유는 주 메모리(오늘날의 동적 램)가 (고성능) CPU 코어에 비해 여전히 느리기 때문이다.

## 설계 문제
많은 설계가 더 낮은 비용으로 더 높은 처리량을 달성한다는 목표를 달성하고 고급 언어 구문을 더 적은 명령어로 표현할 수 있게 해주었지만, 항상 그런 것은 아니라는 점이 관찰되었다. 예를 들어, 복잡한 아키텍처의 저사양 버전(즉, 하드웨어를 적게 사용함)에서는 복잡한 명령어(프로시저 호출이나 enter 명령어 등)를 사용하는 대신 일련의 단순한 명령어를 사용하여 성능을 개선하는 것이 가능한 상황이 발생할 수 있었다.

그 이유 중 하나는 설계자(마이크로코드 작성자)가 가용한 기본 하드웨어에서 효율적으로 구현할 수 없는 기능을 포함하여 어셈블리어 명령어를 때때로 "과잉 설계"했기 때문이다. 예를 들어, 거의 사용되지 않는 레지스터나 메모리 위치의 설정과 같은 (전통적인 플래그 이상의) "부작용"이 있을 수 있었다. 이것이 일반적인(복제되지 않은) 내부 버스나 외부 버스를 통해 수행된다면 매번 추가 사이클을 요구하게 되어 상당히 비효율적일 것이다.

균형 잡힌 고高性能 설계에서도 고도로 인코딩되고 (상대적으로) 고수준인 명령어는 제한된 트랜지스터 예산 내에서 효율적으로 디코딩하고 실행하기 복잡할 수 있다. 따라서 이러한 아키텍처는 디코드 테이블 및 마이크로코드 시퀀싱을 기반으로 하는 더 단순하지만 (일반적으로) 더 느린 솔루션이 적절하지 않은 경우 프로세서 설계자 측에서 많은 노력이 필요했다. 트랜지스터와 기타 부품이 제한된 자원이었던 시절에 이는 다른 유형의 성능 최적화를 위한 부품과 기회를 줄이는 결과를 낳기도 했다.

### RISC 아이디어
많은 (전부는 아니지만) CISC 프로세서에서 마이크로코드에 의해 정의된 작업을 수행하는 회로 그 자체는 여러 면에서 초기 CPU 설계와 구조가 유사한 프로세서이다. 1970년대 초, 이는 시퀀싱 및 디코딩을 위한 (당시에는 상대적으로 크고 비쌌던) ROM 테이블 및 PLA 구조 없이도 대처가 가능하도록 더 단순한 프로세서 설계로 돌아가자는 아이디어를 낳았다.

초기(소급적으로) RISC로 명명된 프로세서(IBM 801 1970년대 중반 IBM 왓슨 연구소)는 원래 CISC 설계 내부의 마이크로코드 커널 또는 엔진으로 사용될 의도로 만들어진 긴밀하게 파이프라인화된 단순한 기계였으나, 다소 더 넓은 대중에게 RISC 아이디어를 소개한 프로세서가 되기도 했다. 가시적인 명령어 집합에서도 단순성과 규칙성은 기계어 수준(즉, 컴파일러가 보는 수준)에서 중첩된 프로세서 단계(파이프라이닝)를 구현하는 것을 더 쉽게 만들어 줄 것이다. 그러나 해당 수준에서의 파이프라이닝은 당시 가능했던 제한된 부품 수와 배선 복잡도 내에서 구현하는 것의 어려움에도 불구하고, 명령어 사이클 시간을 줄이기 위해 일부 고성능 CISC "슈퍼컴퓨터"에서 이미 사용되고 있었다. 반면 CISC 프로세서의 내부 마이크로코드 실행은 특정 설계에 따라 어느 정도 파이프라인화될 수 있었으며, 따라서 RISC 프로세서의 기본 구조와 다소 유사할 수 있었다.

1965년에 처음 인도된 CDC 6600 슈퍼컴퓨터 또한 소급적으로 RISC로 묘사되어 왔다. 이 기계는 프로그래머의 제어 하에 최대 5개의 로드와 2개의 저장을 동시에 진행할 수 있는 로드-스토어 아키텍처를 가졌으며, 동시에 작동할 수 있는 다중 기능 장치도 갖추고 있었다.

### 슈퍼스칼라
보다 현대적인 관점에서 볼 때, 전형적인 CISC 아키텍처 중 일부에서 사용되는 복잡한 가변 길이 인코딩은 CISC 프로그래밍 모델의 슈퍼스칼라 구현을 직접 구축하는 것을 복잡하게 만들지만 여전히 가능하다. 순차적 슈퍼스칼라인 오리지널 펜티엄과 비순차적 슈퍼스칼라인 사이릭스 6x86이 이에 대한 잘 알려진 예이다. 전형적인 CISC 기계의 빈번한 피연산자 메모리 접근은 코드에서 추출할 수 있는 명령어 수준 병렬성을 제한할 수 있지만, 이는 현대 설계에서 사용되는 빠른 캐시 구조와 다른 조치들에 의해 강력하게 완화된다. 본질적으로 콤팩트하고 의미론적으로 풍부한 명령어로 인해 기계어 단위(즉, 바이트 또는 비트당) 수행되는 평균 작업량은 RISC 프로세서보다 CISC가 더 높으며, 이는 현대의 캐시 기반 구현에서 상당한 이점을 제공할 수 있다.

논리 회로, PLA 및 마이크로코드를 위한 트랜지스터는 더 이상 희귀한 자원이 아니다. 오늘날에는 대용량 고속 캐시 메모리만이 최대 트랜지스터 수에 의해 제한된다. 복잡하기는 하지만 CISC 디코더의 트랜지스터 수는 프로세서당 총 트랜지스터 수(대부분 캐시에 사용됨)처럼 기하급수적으로 증가하지 않는다. 더 나은 도구와 향상된 기술과 더불어, 이는 로드-스토어 제한이 없는(즉, RISC가 아닌) 고도로 인코딩된 가변 길이 설계의 새로운 구현으로 이어졌다. 이는 어디에나 있는 x86(아래 참조)과 같은 오래된 아키텍처의 재구현뿐만 아니라 임베디드 시스템용 마이크로컨트롤러 및 유사한 용도의 새로운 설계를 지배한다. 현대 x86의 경우 슈퍼스칼라 복잡성은 명령어를 하나 이상의 마이크로 오퍼레이션으로 변환하고 이들 마이크로 오퍼레이션을 동적으로 발행하는 방식, 즉 간접적이고 동적인 슈퍼스칼라 실행을 통해 해결되었다. 펜티엄 프로와 AMD K5가 이에 대한 초기 예시이다. 이는 (상당히 복잡한) 디코더(및 버퍼) 뒤에 상당히 단순한 슈퍼스칼라 설계를 배치할 수 있게 하여, 여러 면에서 두 세계의 장점을 모두 취할 수 있게 한다. 이 기술은 IBM z196 및 이후의 Z/아키텍처 마이크로프로세서에서도 사용된다.

### CISC와 RISC 용어
1980년대 중반까지 컴퓨터 산업의 합의는 RISC가 CISC보다 더 효율적이라는 것이었다. 디지털 이큅먼트 코퍼레이션은 RISC가 CISC보다 최소 두 배 이상의 가성비를 가진다고 추정했다. CISC 벤더들이 취할 수 있는 두 가지 가능한 대응은 다음과 같았다.

* 현재 아키텍처의 한계에 도달할 때까지 CISC를 최대한 개선한다. IBM 메인프레임과 x86이 이 길을 택했다.

* 가능한 한 빨리 RISC로 이동한다. 썬 마이크로시스템즈는 모토로라 68000 시리즈에서 SPARC로 이동함으로써 이 길을 택했다.

인텔은 RISC의 성능에 맞추기 위해 x86을 개선하는 데 성공했다. CISC와 RISC라는 용어는 CISC와 RISC 설계 및 구현이 지속적으로 진화함에 따라 그 의미가 퇴색되었다. 인텔, AMD, 사이릭스, IBM의 486 설계와 같은 최초의 고도로(또는 긴밀하게) 파이프라인화된 x86 구현은 이전 모델들이 지원했던 모든 명령어를 지원했지만, 전형적인 RISC 명령어 집합보다 조금 더 많은 수준인 상당히 단순한 x86 하위 집합(즉, 전형적인 RISC 로드-스토어 제한이 없는 상태)에서만 최대 효율을 달성했다. 인텔 펜티엄 세대는 이러한 원칙의 슈퍼스칼라 버전이었다. 그러나 현대의 x86 프로세서는 또한 (일반적으로) 명령어를 내부적으로 버퍼링된 마이크로 오퍼레이션의 동적 시퀀스로 디코딩하고 분할한다. 이는 더 큰 명령어 하위 집합을 파이프라인(중첩) 방식으로 실행하는 데 도움이 되며, 훨씬 더 높은 성능을 위해 코드 스트림에서 병렬성을 추출하는 더 진보된 작업을 용이하게 한다.

일반적인 단순화(일부 학술 텍스트에도 존재함)와는 반대로, 모든 CISC가 마이크로코드화되어 있거나 "복잡한" 명령어를 가지고 있는 것은 아니다. CISC가 로드-스토어(RISC) 아키텍처가 아닌 모든 것을 의미하는 포괄적인 용어가 됨에 따라, CISC를 정의하는 것은 명령어의 수나 구현 또는 명령어의 복잡성이 아니라 산술 명령어가 메모리 접근도 수행한다는 점이다. 작은 8비트 CISC 프로세서와 비교할 때, RISC 부동소수점 명령어는 복잡하다. CISC는 복잡한 주소 지정 방식을 가질 필요조차 없다. 32비트 또는 64비트 RISC 프로세서가 작은 8비트 CISC 프로세서보다 더 복잡한 주소 지정 방식을 가질 수도 있다.

PDP-10, PDP-8, x86 프로세서, 인텔 4004, 모토로라 68000 시리즈 프로세서, IBM Z 메인프레임, Burroughs B5000, VAX, 자일로그 Z80000, MOS 6502는 모두 명령어의 수, 크기, 형식, 레지스터의 수, 유형, 크기 및 사용 가능한 데이터 유형이 크게 다르다. 일부는 부분 문자열 스캔, 임의 정밀도 BCD 산술 또는 초월함수와 같은 작업에 대한 하드웨어 지원을 제공하는 반면, 다른 것들은 8비트 덧셈과 뺄셈만 가능하다. 하지만 이들은 모두 실제 계산을 수행하는 동일한 명령어 내에서 메모리 내용을 로드 및 저장하는 "로드-연산" 명령어를 가지고 있기 때문에 CISC 범주에 속한다. 예를 들어, PDP-8은 고정 길이 명령어가 8개뿐이고 마이크로코드가 전혀 없음에도 불구하고 명령어가 작동하는 방식 때문에 CISC이다. 230개 이상의 명령어를 가진(일부 VAX보다 많음) 파워PC와 레지스터 이름 변경 및 reorder buffer와 같은 복잡한 내부 구조를 가진 여러 구현은 RISC인 반면, Minimal CISC는 명령어가 8개뿐이지만 메모리 접근과 계산을 동일한 명령어에서 결합하기 때문에 분명히 CISC이다.

## 같이 보기
* RISC
* MC 680x0
* X86

## 각주

분류:마이크로프로세서
분류:명령어 집합 구조