RISC 명령어 세트 아키텍처를 위해 컴파일러가 "더 똑똑"해야 하는 이유

RISC 명령어 세트 아키텍처를 위해 컴파일러가 "더 똑똑"해야 하는 이유

RISC(Reduced Instruction Set Architecture)는 명령어 수를 줄여 성능을 향상시키는 것을 목표로 합니다. 이 접근 방식의 유일한 단점은 컴파일러가 "더 똑똑"해야 한다는 것입니다.

내 강사가 "컴파일러는 더 똑똑해야 한다"고 말한 것은 무엇을 의미하며, 그 이유는 무엇입니까?

답변1

솔직히 말해서 RISC는 "Reduced Instruction Set Complexity"를 의미합니다. -- 명령어 수가 반드시 줄어들지는 않지만 각 명령어를 실행하는 데 필요한 머신 사이클과 게이트 수 측면에서 더 간단합니다. 또는 마이크로코드 저장소)를 구현하는 데 전념합니다.

(적어도 부분적으로 실현된) 이론은 제어 로직의 양을 줄임으로써 레지스터와 데이터 경로에 더 많은 칩 공간을 사용할 수 있다는 것입니다. 따라서 RISC 시스템은 일반적으로 CISC 시스템보다 2~4배 많은 레지스터를 갖습니다.

이로 인해 컴파일러는 "스케줄링" 작업(시퀀싱)을 포함하여 생략된 제어 논리 작업을 수행하게 됩니다. 즉, 두 개의 추가 작업을 연속적으로 수행하지 않고 추가 작업을 수행한 다음 교대 작업을 수행합니다. 서로 다른 레지스터) 가산기와 시프터가 모두 최적으로 활용됩니다. 또한 컴파일러는 레지스터 내부 및 외부로의 이동을 최적화하고 스토리지 액세스를 최소화하기 위해 레지스터 세트를 관리해야 합니다. 또한 컴파일러는 이상한 명령(예: "왼쪽으로 이동하고 리터럴로 마스크")을 가장 잘 활용하는 방법을 알아야 합니다. 이러한 명령은 일반적으로 상대적으로 강력한 일부(아마도 이상한) 시나리오를 갖기 때문입니다.

결과적으로, 좋은 RISC 컴파일러에 의해 생성된 명령어는 사실상 해독이 불가능합니다. 명령어 세트를 잘 알고 있더라도 30분 전의 일부 값이 여전히 레지스터 12에 있다는 것을 알아내는 것은 항상 발생하는 복잡한 시프트 및 마스크 작업이 아니더라도 기껏해야 어렵습니다.

(내가 무슨 말을 하는지 믿지 못하는 분들을 위해 말씀드리자면, 저는 70년대 초반에 IBM 801을 사용하여 RISC에 처음 참여했으며 George Radin 및 Marty Hopkins와 함께 유명 인사로 활동했습니다. .)

답변2

RISC CPU에는 명령어 수가 적기 때문에 단일 상위 수준 명령문이 단일 기계어 opcode로 훌륭하게 변환될 가능성이 적습니다.

RISC CPU의 동의어는 "로드 저장소 아키텍처"입니다. 기본적으로 실제로 작동하는 RISC 명령어는 일반적으로 레지스터에서만 작동한다는 의미입니다. RAM에 저장된 값에 대해 작업하려면 명시적인 LOAD 명령을 실행해야 하지만 x86과 같은 CISC CPU에는 자동으로 이를 수행하는 명령이 있습니다. RISC CPU는 역사적으로 x86보다 더 많은 레지스터를 가지고 있으며, 좋은 코드는 불필요한 메모리 액세스를 피하기 위해 사용 가능한 레지스터를 잘 관리합니다. 즉, 컴파일러는 이를 고려해야 합니다.

또 다른 점은 RISC CPU는 일반적으로 연결에 필요한 최소한의 "인프라"만 제공한다는 것입니다.

PUSH예를 들어, x86 CPU에는 값을 푸시하고 나중에 "팝"할 수 있는 "스택"이라는 개념이 있습니다( 및 지침이 있음 POP). 명령어 도 있습니다 CALL. 이는 스택의 현재 명령어 포인터를 푸시한 다음 대상 주소(일반적으로 서브루틴 또는 함수)로 점프합니다. RET그런 다음 나중에 저장된 명령 포인터를 팝업하고 원래 기능에서 다시 시작하는 명령을 실행할 수 있습니다 . 서브루틴을 중첩하는 것은 편리하며 서브루틴에 대한 매개변수를 쉽게 사용 PUSH하고 POP넣을 수 있습니다.

예를 들어 MIPS에서는 "점프 및 링크"에 대한 것이 전부입니다. 즉, jal현재 명령어 포인터를 레지스터에 넣은 다음 해당 주소로 점프합니다. 스택이나 x86 명령과 같은 작업을 수행하려면 CALL수동으로 수행해야 합니다. 이를 위해서는 컴파일러의 더 많은 지능이 필요합니다.

답변3

CISC(Complex Instruction Set Computing) 프로세서는 RISC(Reduced Instruction Set Computing) 프로세서보다 더 넓은 범위의 명령을 사용할 수 있습니다.

CISC의 곱셈의 예는 다음과 같습니다: MUL 1:3, 4:2(1:3과 2:4 곱하기). 이 명령은 레지스터의 1:3 위치에 있는 값을 로드하고, 4:2의 값을 로드하고, 그 값을 여러 개로 설정하고 다시 1:3에 저장합니다.

RISC CPU는 다음을 수행해야 합니다.

  • 로드 A, 1:3
  • 로드 B, 4:2
  • 제품 A, B
  • 매장 1:3, A

...4개의 RISC 작업을 1개의 CISC 작업으로.

RISC는 가장 간단한 곱셈 계산에도 더 많은 연산이 필요하기 때문에 비디오 렌더링이나 게임과 같은 작업에 얼마나 더 많은 작업이 필요한지 상상해 보세요.

이를 염두에 두고 프로그래머가 입력한 코드에서 소프트웨어를 구축하는 컴파일러는 RISC 아키텍처의 복잡한 코드 조각과 복잡한 명령을 단순화하는 방법을 알 수 있도록 "더 똑똑"해야 합니다.

이것이 의미가 있기를 바랍니다. 더 자세히 읽으려면 다음을 살펴보는 것이 좋습니다. http://www.engineersgarage.com/articles/risc-and-cisc-architecture?page=5

관련 정보