항목
버클리 RISC
Berkeley RISC
버클리 RISC(영어: Berkeley RISC)는 방위고등연구계획국(DARPA) VLSI Project의 일환으로 진행된 축소 명령어 집합 컴퓨터(RISC) 기반 마이크로프로세서 설계에 관한 두 가지 중대한 연구 프로젝트 중 하나다. RISC 프로젝트는 1980년부터 1984년 사이에 캘리포니아 대학교 버클리에서 데이…
항목
Berkeley RISC
버클리 RISC(영어: Berkeley RISC)는 방위고등연구계획국(DARPA) VLSI Project의 일환으로 진행된 축소 명령어 집합 컴퓨터(RISC) 기반 마이크로프로세서 설계에 관한 두 가지 중대한 연구 프로젝트 중 하나다. RISC 프로젝트는 1980년부터 1984년 사이에 캘리포니아 대학교 버클리에서 데이…
이 항목이 포함된 사건 파일에서 정보와 관계를 함께 살펴보세요.
이 항목이 포함된 사건 파일이 아직 없습니다.
이 항목으로 조사 시작하기버클리 RISC(영어: Berkeley RISC)는 방위고등연구계획국(DARPA) VLSI Project의 일환으로 진행된 축소 명령어 집합 컴퓨터(RISC) 기반 마이크로프로세서 설계에 관한 두 가지 중대한 연구 프로젝트 중 하나다. RISC 프로젝트는 1980년부터 1984년 사이에 캘리포니아 대학교 버클리에서 (RISC라는 용어를 만든) 데이비드 패터슨의 주도로 진행되었다.
버클리 RISC(영어: Berkeley RISC)는 방위고등연구계획국(DARPA) VLSI Project의 일환으로 진행된 축소 명령어 집합 컴퓨터(RISC) 기반 마이크로프로세서 설계에 관한 두 가지 중대한 연구 프로젝트 중 하나다. RISC 프로젝트는 1980년부터 1984년 사이에 캘리포니아 대학교 버클리에서 (RISC라는 용어를 만든) 데이비드 패터슨의 주도로 진행되었다. 다른 프로젝트는 조금 떨어진 스탠퍼드 대학교에서 1981년부터 1984년까지 MIPS라는 이름으로 진행되었다.
버클리의 프로젝트는 매우 성공적이어서 이후의 모든 유사한 설계의 명칭이 되었으며, 심지어 MIPS조차 "RISC 프로세서"로 알려지게 되었다. 버클리 RISC 설계는 나중에 썬 마이크로시스템즈에 의해 SPARC 아키텍처로 상용화되었으며, ARM 아키텍처에도 영감을 주었다.
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는 마이크로코드를 사용하여 사용자에게 보이는 명령어를 일련의 내부 작업으로 해독했다. 이 마이크로코드는 전체 설계 트랜지스터의 약 1⁄4에서 1⁄3을 차지했다.
만약 다른 논문들이 시사한 바와 같이 이러한 명령 코드의 대부분이 실제로 사용되지 않는다면, 이 상당한 자원은 낭비되고 있는 셈이었다. 사용되지 않는 명령어를 제거하고 동일한 프로세서를 만든다면 크기가 작아져 비용이 저렴해질 것이고, 명령어 해독 대신 성능 향상에 그 트랜지스터들을 사용한다면 더 빠른 프로세서가 가능할 것이었다. 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 개념을 구현하기 위한 첫 번째 시도의 이름은 원래 골드(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는 이미 구식인 팹을 사용하여 실제 칩 다이 위에 진정한
출처: 버클리 RISC (CC BY-SA)
확인된 구조화 정보, 사용자 의견, AI가 찾은 관계를 구분해 표시해요.
아직 댓글이 없어요. 먼저 한마디 남겨 보세요.