버클리 RISC

버클리 RISC()는 방위고등연구계획국(DARPA) VLSI Project의 일환으로 진행된 축소 명령어 집합 컴퓨터(RISC) 기반 마이크로프로세서 설계에 관한 두 가지 중대한 연구 프로젝트 중 하나다. RISC 프로젝트는 1980년부터 1984년 사이에 캘리포니아 대학교 버클리에서 (RISC라는 용어를 만든) 데이비드 패터슨의 주도로 진행되었다. 다른 프로젝트는 조금 떨어진 스탠퍼드 대학교에서 1981년부터 1984년까지 MIPS라는 이름으로 진행되었다.

버클리의 프로젝트는 매우 성공적이어서 이후의 모든 유사한 설계의 명칭이 되었으며, 심지어 MIPS조차 "RISC 프로세서"로 알려지게 되었다. 버클리 RISC 설계는 나중에 썬 마이크로시스템즈에 의해 SPARC 아키텍처로 상용화되었으며, ARM 아키텍처에도 영감을 주었다.

 RISC 개념 

RISC와 MIPS는 모두 대다수의 프로그램이 프로세서가 제공하는 명령어 집합 중 아주 일부만을 사용한다는 인식에서 개발되었다. 1978년 발표된 유명한 논문에서 앤드루 타넨바움은 10,000행의 복잡한 고급 프로그램이 8비트 고정 길이 명령 코드를 사용하는 단순화된 명령어 집합 아키텍처로 표현될 수 있음을 증명했다. 이는 IBM에서 도달한 결론과 거의 일치했는데, IBM 360과 같은 메인프레임에서 실행되는 자체 코드를 연구한 결과 사용 가능한 모든 명령어 중 아주 작은 부분집합만이 사용되고 있었다. 이 두 연구는 모두 대부분의 실제 코드를 실행할 수 있는 훨씬 단순한 CPU를 만들 수 있음을 시사했다. 당시에는 충분히 탐구되지 않았던 또 다른 발견은 상수의 81%가 0, 1 또는 2라는 타넨바움의 메모였다.

이러한 인식은 마이크로프로세서 시장이 8비트에서 16비트로 이동하고 32비트 설계가 막 등장하려던 시기에 일어났다. 당시의 설계들은 메인프레임과 미니컴퓨터 세계에서 널리 인정받던 기존 ISA를 복제하는 것을 목표로 삼고 있었다. 예를 들어, National Semiconductor NS32000은 다양한 주소 지정 방식과 풍부한 명령어 집합을 가진 VAX-11을 단일 칩으로 구현하려는 시도로 시작되었다. 모토로라 68000도 일반적인 레이아웃 면에서 유사했다. 이러한 풍부한 명령어 세트를 제공하기 위해 CPU는 마이크로코드를 사용하여 사용자에게 보이는 명령어를 일련의 내부 작업으로 해독했다. 이 마이크로코드는 전체 설계 트랜지스터의 약 에서 을 차지했다.

만약 다른 논문들이 시사한 바와 같이 이러한 명령 코드의 대부분이 실제로 사용되지 않는다면, 이 상당한 자원은 낭비되고 있는 셈이었다. 사용되지 않는 명령어를 제거하고 동일한 프로세서를 만든다면 크기가 작아져 비용이 저렴해질 것이고, 명령어 해독 대신 성능 향상에 그 트랜지스터들을 사용한다면 더 빠른 프로세서가 가능할 것이었다. RISC 개념은 이 두 가지 이점을 모두 취하여 68000과 비슷한 수준의 복잡도를 가지면서도 훨씬 빠른 CPU를 생산하는 것이었다.

이를 위해 RISC는 훨씬 더 많은 레지스터(매우 빠르게 접근할 수 있는 임시 값을 저장하는 작은 메모리 조각)를 추가하는 데 집중했다. 이는 접근하는 데 여러 사이클이 걸릴 수 있는 일반적인 메인 메모리와 대조된다. 더 많은 레지스터를 제공하고 컴파일러가 이를 실제로 사용하도록 보장함으로써 프로그램은 훨씬 빠르게 실행되어야 했다. 또한 메모리 접근을 기다리는 시간이 줄어들기 때문에 프로세서의 속도는 클록 속도에 더 밀접하게 정의될 것이다. 트랜지스터 수 대비 성능 면에서 RISC 설계는 기존 CPU를 능가할 것이었다.

단점으로는, 제거된 명령어들이 일반적으로 여러 개의 "하위 명령어"를 수행하고 있었다는 점이다. 예를 들어, 전통적인 설계의 ADD 명령어는 두 레지스터의 숫자를 더해 세 번째 레지스터에 넣는 방식, 메인 메모리의 숫자를 더해 결과를 레지스터에 넣는 방식 등 여러 형태가 있었다. 반면 RISC 설계는 특정 명령어에 대해 단 한 가지 형태만 포함했는데, 예를 들어 ADD는 항상 모든 피연산자에 레지스터를 사용했다. 이로 인해 프로그래머는 필요한 경우 메모리에서 값을 로드하기 위해 추가 명령어를 작성해야 했고, 이는 RISC 프로그램의 "밀도"를 낮게 만들었다.

메모리가 비쌌던 시대에는 이것이 실제적인 우려 사항이었는데, 특히 메모리가 CPU보다 훨씬 느렸기 때문이다. RISC 설계의 ADD가 실제로는 4개의 명령어(로드 2개, 더하기 1개, 저장 1개)를 요구할 수 있으므로, 머신은 추가 명령어를 읽기 위해 훨씬 더 많은 메모리 접근을 해야 했고, 이는 잠재적으로 속도를 상당히 늦출 수 있었다. 이는 당시로서는 매우 큰 32비트 명령어를 사용하여 작은 상수를 별도로 로드하는 대신 명령어에 직접 포함시킬 수 있게 함으로써 어느 정도 상쇄되었다. 또한 한 연산의 결과가 곧바로 다른 연산에 사용되는 경우가 많으므로, 메모리 쓰기를 생략하고 결과를 레지스터에 저장함으로써 프로그램 크기가 크게 커지지 않으면서 이론적으로 훨씬 빠르게 실행될 수 있었다. 예를 들어, 일련의 수학 연산을 수행하는 명령어 줄은 메모리에서 몇 번의 로드만 필요할 뿐, 사용되는 숫자의 대부분은 명령어 내의 상수이거나 이전 계산에서 레지스터에 남겨진 중간값일 것이기 때문이다. 어떤 의미에서 이 기법은 일부 레지스터가 메모리 위치를 섀도잉(shadowing)하는 데 사용되어, 일련의 명령어가 끝난 후 최종 값이 결정될 때까지 레지스터가 메모리 위치의 대리인 역할을 하도록 한다.

평범한 관찰자에게는 RISC 개념이 성능을 향상시킬 수 있을지가 명확하지 않았으며, 오히려 더 나빠질 수도 있어 보였다. 확실히 알 수 있는 유일한 방법은 시뮬레이션을 해보는 것이었다. 시뮬레이션 결과는 명확했다. 테스트를 거듭할수록 모든 시뮬레이션은 이 설계가 성능 면에서 엄청난 전반적 이득을 준다는 것을 보여주었다.

RISC와 MIPS 두 프로젝트가 달랐던 점은 레지스터를 다루는 방식이었다. MIPS는 단순히 많은 레지스터를 추가하고 이를 활용하는 것을 컴파일러(또는 어셈블리어 프로그래머)에게 맡겼다. 반면 RISC는 컴파일러를 돕기 위해 CPU에 회로를 추가했다. RISC는 전체 "레지스터 파일"을 블록으로 나누어 컴파일러가 전역 변수용 블록과 지역 변수용 블록을 "볼 수" 있게 하는 레지스터 윈도 개념을 사용했다.

이 아이디어는 특히 흔한 명령어 중 하나인 프로시저 호출을 매우 쉽게 구현하기 위한 것이었다. 거의 모든 프로그래밍 언어는 프로시저마다 활성화 레코드(activation record) 또는 스택 프레임으로 알려진 시스템을 사용하는데, 여기에는 프로시저가 호출된 주소, 전달된 데이터(파라미터), 반환되어야 할 결과값들을 위한 공간이 포함된다. 대다수의 경우 이러한 프레임은 작으며, 일반적으로 3개 이하의 입력과 1개 또는 0개의 출력을 가진다(때로는 입력이 출력으로 재사용되기도 한다). 버클리 설계에서 레지스터 윈도는 여러 개의 레지스터 세트였으며, 전체 프로시저 스택 프레임이 레지스터 윈도 내에 완전히 들어갈 수 있을 정도로 충분한 수였다.

이 경우 프로시저로의 호출과 반환은 단순하고 매우 빠르다. 새로운 레지스터 블록(새로운 레지스터 윈도)을 설정하기 위해 단일 명령어가 호출되고, 피연산자가 새 윈도의 "하단부"를 통해 프로시저로 전달되면 프로그램은 프로시저로 점프한다. 반환 시 결과는 윈도의 같은 끝부분에 놓이고 프로시저는 종료된다. 레지스터 윈도들은 끝부분이 겹치도록 설정되어 있어, 호출 결과가 데이터를 복사할 필요 없이 호출자의 윈도에 단순히 "나타나게" 된다. 따라서 흔한 프로시저 호출이 메인 메모리와 상호작용할 필요가 없어 속도가 크게 향상된다.

단점으로는, 이 방식이 많은 수의 지역 변수를 가진 프로시저에는 문제가 될 수 있고, 변수가 적은 경우에는 비싼 자원인 레지스터가 낭비된다는 점이다. 설계상 레지스터 윈도의 수는 유한하며(예: 8개), 따라서 레지스터 윈도 메커니즘이 한계에 도달하기 전까지 프로시저는 그만큼의 깊이까지만 중첩될 수 있다. 마지막 윈도에 도달하면 더 이상의 중첩 호출을 위한 새 윈도를 설정할 수 없다. 또한 프로시저가 몇 단계만 중첩된 경우, 가장 깊은 호출 수준 이상의 윈도에 있는 레지스터들은 전혀 접근할 수 없어 완전히 낭비된다. 스탠퍼드는 효율적인 컴파일러가 하드웨어의 고정된 시스템보다 레지스터를 더 잘 활용할 수 있다고 믿었기 때문에 컴파일러 연구를 통해 레지스터 윈도 개념을 무시하게 되었다. (똑똑한 어셈블리어 프로그래머에게도 동일한 논리가 적용된다.)

 RISC I 

섬네일|RISC I 다이 사진. 칩의 대부분은 레지스터 파일(왼쪽 하단 영역)이 차지하고 있다. 제어 로직은 오른쪽 상단 모서리의 작은 부분만 차지한다.
RISC 개념을 구현하기 위한 첫 번째 시도의 이름은 원래 골드(Gold)였다. 설계 작업은 1980년 VLSI 설계 과정의 일부로 시작되었으나, 당시로서는 복잡했던 설계 때문에 기존의 거의 모든 설계 도구가 충돌을 일으켰다. 팀은 도구를 개선하거나 다시 작성하는 데 상당한 시간을 소비해야 했으며, 이러한 새로운 도구를 사용하더라도 VAX-11/780에서 설계를 추출하는 데 1시간 가까이 걸렸다.

최종 설계는 RISC I이라는 이름으로 1981년 ACM(Association for Computing Machinery) ISCA(International Symposium on Computer Architecture)에서 발표되었다. 44,500개의 트랜지스터로 31개의 명령어를 구현했으며, 78개의 32비트 레지스터를 포함하는 레지스터 파일을 가졌다. 이를 통해 14개의 레지스터를 포함하는 6개의 레지스터 윈도를 사용할 수 있었다. 그 14개의 레지스터 중 4개는 이전 윈도와 겹쳐 있었다.
전체 합계는 윈도 내 레지스터 10*6 + 전역 레지스터 18 = 총 78개다. 제어 및 명령어 해독 섹션은 다이 면적의 6%만을 차지했는데, 당시의 전형적인 설계가 동일한 역할에 약 50%를 사용했던 것과 대조적이다. 레지스터 파일이 공간의 대부분을 차지했다.

RISC I은 추가적인 속도를 위해 2단계 명령어 파이프라인을 특징으로 했으나, 현대적 설계와 같은 복잡한 명령어 재정렬 기능은 없었다. 이로 인해 조건부 분기가 문제가 되었는데, 컴파일러가 조건부 분기 뒤의 명령어(이른바 분기 지연 슬롯)를 "안전한"(즉, 조건의 결과에 의존하지 않는) 것으로 채워야 했기 때문이다. 때때로 이 경우에 적합한 유일한 명령어는 NOP였다. 상당수의 후기 RISC 스타일 설계들도 여전히 분기 지연을 고려해야 한다.

한 달간의 검증과 디버깅을 거쳐 1981년 6월 22일, 2 μm (2,000 nm) 공정을 사용하여 생산을 위해 혁신적인 MOSIS 서비스로 설계가 보내졌다. 여러 가지 지연으로 인해 마스크를 네 번이나 폐기해야 했고, 작동하는 샘플이 포함된 웨이퍼는 1982년 5월이 되어서야 버클리에 도착했다. 최초로 작동하는 RISC I "컴퓨터"(실제로는 점검용 보드)는 6월 11일에 가동되었다. 테스트 결과 칩의 성능은 예상보다 낮았다. 일반적으로 명령어 하나를 완료하는 데 2 μs가 걸렸는데, 원래 설계는 약 0.4 μs(5배 빠름)를 할당했었다. 이 문제의 정확한 원인은 완전히 설명되지 않았다. 그러나 테스트 내내 특정 명령어들은 예상 속도로 실행되었으며, 이는 문제가 논리적인 것이 아니라 물리적인 것임을 시사했다.

설계가 최대 속도로 작동했다면 성능은 훌륭했을 것이다. 다양한 작은 프로그램을 사용한 시뮬레이션에서 4 MHz RISC I을 5 MHz 32비트 VAX 11/780 및 5 MHz 16비트 자일로그 Z8000과 비교했을 때 이 점이 명확히 드러났다. 프로그램 크기는 VAX보다 약 30% 컸지만 Z8000과는 매우 비슷했는데, 이는 CISC 설계의 더 높은 코드 밀도가 실제로는 그리 인상적이지 않다는 주장을 뒷받침했다. 전반적인 성능 면에서 시뮬레이션은 풀스피드 RISC I이 VAX보다 2배, Z8000보다 약 4배 빠를 것임을 나타냈다. 대규모 레지스터 파일이 필요한 피연산자가 이미 칩 위에 있을 확률을 획기적으로 높였기 때문에, 프로그램들은 결과적으로 전체 메모리 접근 횟수가 비슷해졌다.

이 성능을 맥락 속에서 이해하는 것이 중요하다. RISC I 하드웨어가 VAX보다 느리게 작동했음에도 불구하고, 그것이 설계의 중요성에 영향을 미치지는 않았다. RISC는 이미 구식인 팹을 사용하여 실제 칩 다이 위에 진정한 32비트 프로세서를 생산할 수 있게 해주었다. 전통적인 설계로는 이것이 불가능했다. 칩 표면의 너무 많은 부분이 해독 로직에 할애되어 있었기 때문에 모토로라 68020과 같은 진정한 32비트 설계는 실용화되기 위해 더 새로운 팹이 필요했다. 동일한 팹을 사용했다면 RISC I은 경쟁 제품들을 크게 압도했을 것이다.

2015년 2월 12일, 전기전자공학자협회(IEEE)는 RISC-I의 공헌을 기리기 위해 UC 버클리에 기념 명판을 설치했다. 명판의 내용은 다음과 같다.
 UC 버클리 학생들은 1981년 최초의 VLSI 축소 명령어 집합 컴퓨터를 설계하고 제작했다. RISC-I의 단순화된 명령어는 명령어 해독 및 제어를 위한 하드웨어를 줄여 평면 32비트 주소 공간, 대규모 레지스터 세트 및 파이프라인 실행을 가능하게 했다. C 프로그램 및 유닉스 운영 체제와 잘 맞았던 RISC-I은 게임 콘솔, 스마트폰, 태블릿용을 포함하여 오늘날 널리 사용되는 명령어 집합에 큰 영향을 미쳤다.

 RISC II 

섬네일|RISC II 다이 사진
RISC I 설계가 지연되는 동안 버클리에서의 연구는 이미 새로운 블루(Blue) 설계로 넘어갔다. 블루에 대한 작업은 골드보다 느리게 진행되었는데, 이는 골드가 팹으로 보내져 긴급한 필요성이 줄어든 탓도 있었고 연구에 참여하는 수업과 학생들의 교체 때문이기도 했다. 이러한 속도 덕분에 설계를 상당히 개선할 수 있는 몇 가지 새로운 기능을 추가할 수 있었다.

핵심적인 차이점은 비트당 라인을 (3개에서 2개로) 줄여 레지스터 파일 크기를 획기적으로 축소한 더 단순한 캐시 회로였다. 이 변경으로 훨씬 더 엄격한 버스 타이밍이 요구되었지만 이는 작은 대가였으며, 요구 사항을 충족하기 위해 설계의 다른 여러 부분도 속도가 향상되었다.

새로운 설계로 인한 절감 효과는 엄청났다. 골드가 6개 윈도에 총 78개의 레지스터를 포함했던 반면, 블루는 각각 16개의 레지스터로 구성된 8개의 윈도와 10개의 전역 레지스터를 포함하여 총 138개의 레지스터를 가졌다. 레지스터 파일의 확장은 특정 프로시저가 모든 지역 저장 공간을 레지스터에 맞출 가능성을 높이고 중첩 깊이를 증가시켰다. 그럼에도 불구하고 더 커진 레지스터 파일은 더 적은 트랜지스터를 필요로 했으며, RISC II로 제작된 최종 블루 설계는 단 40,760개의 트랜지스터만으로 모든 RISC 명령어 집합을 구현했다.

또 다른 주요 변경 사항은 16비트 명령어를 32비트 형식으로 보이지 않게 "업-컨버트"하는 명령어 형식 확장기(instruction-format expander)를 포함한 것이었다. 이를 통해 NOP와 같이 피연산자가 하나이거나 없는 전형적인 작은 명령어들을 메모리에 더 작은 16비트 형식으로 저장하고, 이러한 명령어 두 개를 단일 기계어 워드에 팩(pack)할 수 있게 되었다. 이 명령어들은 산술 논리 장치(ALU)에 도달하기 전에 보이지 않게 32비트 버전으로 다시 확장되므로 핵심 로직에는 변경이 필요 없었다. 이 단순한 기술은 코드 밀도를 30%나 향상시키는 놀라운 결과를 냈으며, 메모리 접근 횟수가 줄어든 덕분에 블루에서의 동일한 프로그램이 골드보다 더 빨리 실행되게 만들었다.

RISC II는 실리콘 구현에서 훨씬 더 성공적임이 증명되었으며, 테스트 결과 거의 모든 작업에서 거의 모든 미니컴퓨터의 성능을 능가했다. 예를 들어 다양한 부하에서 VAX 속도의 85%에서 256%에 이르는 성능을 보였다. RISC II는 또한 당시 최고의 상용 칩 구현으로 간주되던 유명한 모토로라 68000과 벤치마크 테스트를 거쳤으며, 이를 140%에서 420% 차이로 압도했다.

 후속 프로젝트 

원래의 RISC 설계 작업은 RISC II로 끝났지만 그 개념은 버클리에서 계속 살아남았다. 기본 코어는 1984년 SOAR에서 재사용되었는데, 이는 기본적으로 스몰토크를 실행하기 위해 변환된 RISC였으며(RISC가 C를 실행한다고 주장할 수 있는 것과 같은 방식), 나중에 스몰토크 대신 프롤로그를 실행하는 유사한 VLSI-BAM으로 이어졌다. 또 다른 노력으로는 완전한 32비트 워크스테이션을 구축하는 데 필요한 칩 세트 전체인 SPUR가 있었다.

버클리 RISC, 스탠퍼드 MIPS, IBM 801 프로젝트에서 개발된 RISC 개념은 1980년대 중반 여러 상용 ISA에 영향을 주었다. 에이콘 컴퓨터(Acorn Computers)는 실리콘 파트너인 VLSI Technology와 협력하여 ARM 아키텍처를 개발했고, 1986년 7월부터 2세대 ARM 칩셋을 탑재한 ARM 평가 시스템을 출하했으며, 1987년 6월 6일부터는 4 MIPS의 성능을 낼 수 있다고 광고된 Acorn Archimedes 브랜드의 데스크톱 컴퓨터 제품군을 출시했다. 휴렛 팩커드도 1986년 자사의 HP 3000 및 HP 9000 시리즈의 새 모델에 자체 PA-RISC ISA를 도입했다. 썬 마이크로시스템즈는 실리콘 파트너인 후지쯔와 협력하여 1987년 7월 8일 10 MIPS를 제공한다고 광고된 Sun 4/260에서 자체 SPARC ISA를 출시했다. 스탠퍼드 MIPS 프로젝트의 결과물을 상용화하기 위해 1984년 설립된 MIPS Computer Systems는 R2000을 시작으로 MIPS 아키텍처와 MIPS 프로세서를 개발했다. 실리콘 그래픽스(SGI)는 자사 워크스테이션의 모토로라 68000 시리즈 프로세서를 MIPS 프로세서로 교체하고 결국 MIPS를 인수했으며, 디지털 이큅먼트 코퍼레이션은 DECstation 워크스테이션에 MIPS 프로세서를 사용했다. IBM은 IBM RT PC에 사용된 ROMP RISC 프로세서와 RS/6000 시리즈에 사용된 POWER 아키텍처를 개발했다. 1980년대 후반에 이르러 대부분의 대형 칩 벤더들이 뒤를 이어 모토로라 88000, Fairchild Clipper, AMD 29000과 같은 프로젝트에 착수했다. 이러한 시스템의 성능과 효율성은 이전 세대의 CISC CPU를 능가했다.

1990년대 초, 애플, IBM, 모토로라는 AIM 얼라이언스를 형성하여 IBM의 POWER 아키텍처를 기반으로 한 파워PC 아키텍처를 개발했다. 파워PC 프로세서는 IBM과 모토로라 모두에서 판매되었으며, 애플은 자사 매킨토시 컴퓨터의 모토로라 68000 시리즈 프로세서를 대체하기 위해 이를 사용했다. 디지털 이큅먼트 코퍼레이션(DEC)은 1980년대 초부터 여러 RISC 프로젝트를 개발 중이었으며 결국 DEC PRISM으로 정착했으나 해당 프로젝트는 취소되었다. 1990년대 초, 후속 프로젝트를 통해 DEC 알파가 탄생했다.

2015년 2월 13일, IEEE는 산타클라라의 오라클 코퍼레이션에 기념 명판을 설치했다. 명판의 내용은 다음과 같다.

 썬 마이크로시스템즈는 1987년 7월 확장형 프로세서 아키텍처(SPARC) RISC를 출시했다. UC 버클리 RISC와 썬의 컴파일러 및 운영 체제 개발을 기반으로 한 SPARC 아키텍처는 진화하는 반도체, 소프트웨어, 시스템 기술 및 사용자 요구에 매우 적응력이 높았다. 이 아키텍처는 엔지니어링, 비즈니스, 인터넷 및 클라우드 컴퓨팅 용도로 최고 성능의 확장 가능한 워크스테이션과 서버를 제공했다.

축소 명령어 집합 아이디어를 위해 그리고 그와 병행하여 개발된 기술들은 전통적인 "복잡한" x86 아키텍처의 점진적으로 더 강력해진 구현 및 확장판에도 채택되었다. 현대 마이크로프로세서 트랜지스터 수의 상당 부분은 대규모 캐시, 많은 파이프라인 단계, 슈퍼스칼라 명령어 디스패치, 분기 예측 및 명령어 아키텍처와 상관없이 적용 가능한 기타 현대적 기술에 할애된다. 현대의 x86 구현에서 명령어 해독에 전용되는 실리콘의 양은 비율적으로 매우 적기 때문에, "복잡한" 프로세서와 RISC 프로세서 구현 사이의 구별은 모호해졌다.

 같이 보기 
 RISC-V
 Power ISA
 PA-RISC

 각주 
 인용 

 참고 문헌 


 Berkeley RISC II


분류:캘리포니아 대학교 버클리
분류:중앙 처리 장치
분류:명령어 처리