CPU 레지스터, 당신이 생각하는 것보다 훨씬 많다!

by DD
1개월 전
조회수 8

CPU의 물리적 레지스터(Physical Registers)는 아키텍처 레지스터보다 훨씬 많으며, 컴파일러 최적화에 핵심적인 역할을 수행함

Out-of-Order 실행(Out-of-Order Execution)을 위해 레지스터 리네이밍(Register Renaming) 기법을 사용하여 병렬 처리(Parallel Processing)를 극대화함

레지스터 리네이밍은 가짜 의존성(False Dependency)을 제거하여 명령어 실행 순서를 최적화하고, 0 사이클 명령어(Zero-Cycle Instruction)를 가능하게 함

커뮤니티에서는 CPU 아키텍처와 컴파일러 최적화에 대한 깊이 있는 이해를 바탕으로 성능 개선 방안에 대한 논의가 이루어짐

물리적 레지스터와 아키텍처 레지스터의 차이점

게시물에 따르면, 일반적인 CPU에는 아키텍처 레지스터 외에도 수백 개의 물리적 레지스터가 존재한다. 이러한 물리적 레지스터는 레지스터 파일(Register File) 내부에 위치하며, 컴파일러 최적화의 핵심 요소로 작용한다. 특히, Out-of-Order 실행(Out-of-Order Execution)을 지원하기 위해 레지스터 리네이밍(Register Renaming) 기법을 사용하며, 이를 통해 명령어 수준 병렬성(Instruction-Level Parallelism, ILP)을 극대화한다.

레지스터 리네이밍(Register Renaming)을 통한 최적화

본문에서는 레지스터 리네이밍이 가짜 의존성(False Dependency)을 제거하여 명령어 실행 순서를 최적화한다고 설명한다. 예를 들어, `add x3, x2, x1` 다음에 `add x3, x5, x1`과 같이 x3 레지스터를 재사용하는 경우, 두 번째 add 명령은 첫 번째 add의 결과에 의존하지 않음에도 불구하고 의존성을 갖는 것처럼 보일 수 있다. 레지스터 리네이밍은 이러한 가짜 의존성을 제거하여 병렬 실행(Parallel Execution)을 가능하게 한다.

0 사이클 명령어(Zero-Cycle Instruction)의 활용

게시물은 레지스터 리네이밍을 통해 0 사이클 명령어, 즉 실행 유닛을 사용하지 않는 명령어를 생성할 수 있다고 설명한다. `orr x1, xzr, x2`와 같은 명령어는 레지스터 리네이밍 단계에서 처리되어 실행 유닛의 자원을 소모하지 않는다. 이는 실행 파이프라인(Execution Pipeline)의 부하를 줄여 성능 향상(Performance Improvement)에 기여하지만, 페치(Fetch) 및 디코드(Decode) 단계에서는 여전히 자원을 사용한다.

LLVM-MCA를 활용한 성능 분석

게시물에서는 `llvm-mca` 도구를 사용하여 명령어의 자원 사용량을 분석하는 방법을 제시한다. 예를 들어, `mov x1, #4`와 같은 상수 할당 명령어는 Neoverse V2 아키텍처에서 실행 유닛을 사용한다. `llvm-mca`를 통해 각 명령어의 자원 압력(Resource Pressure)을 측정하고, 이를 바탕으로 코드 최적화(Code Optimization)를 수행할 수 있다. 이는 컴파일러 최적화의 중요성을 강조한다.

Your CPU Has More Registers Than You'd Think