현대 프로세서 아키텍처는 Instruction Level Parallelism을 극대화하기 위해 Out-of-Order 실행 구조를 채택하고 있으며 이 과정에서 명령어 간 데이터 의존성 문제를 해결하는 것이 핵심 과제로 등장한다. 특히 WAR와 WAW와 같은 가짜 의존성은 실제 데이터 흐름과는 무관하게 실행 순서를 제한하는 요인으로 작용한다. 이러한 문제를 해결하기 위한 대표적인 기법이 바로 레지스터 리네이밍이다.
레지스터 리네이밍은 논리적 레지스터와 물리적 레지스터를 분리하여 가짜 의존성을 제거하는 기술로 Tomasulo 알고리즘과 함께 현대 CPU 설계의 핵심 요소로 자리 잡았다. 본 글에서는 레지스터 리네이밍의 개념과 구조를 분석하고 WAR와 WAW 해저드를 어떻게 해결하는지에 대해 자세히 살펴본다.
데이터 해저드의 종류
파이프라인 기반 프로세서에서는 명령어 간 데이터 의존성으로 인해 해저드가 발생한다. 대표적인 데이터 해저드는 RAW WAR WAW 세 가지로 구분된다.
RAW 해저드는 실제 데이터 의존성으로 이전 명령어의 결과가 필요한 경우 발생한다. 반면 WAR와 WAW 해저드는 가짜 의존성으로 동일한 레지스터를 사용하기 때문에 발생하지만 실제 데이터 흐름과는 관련이 없다.
WAR 해저드는 후속 명령어가 레지스터를 먼저 읽어야 하는데 이전 명령어가 이를 덮어쓰는 경우 발생한다. WAW 해저드는 두 개의 명령어가 동일한 레지스터에 값을 쓰는 경우 발생하며 쓰기 순서가 보장되지 않으면 잘못된 결과가 나타날 수 있다.
레지스터 리네이밍의 개념
레지스터 리네이밍은 논리적 레지스터를 더 많은 물리적 레지스터에 매핑하여 가짜 의존성을 제거하는 방식이다. 즉 프로그램에서 동일한 레지스터 이름을 사용하더라도 실제 하드웨어에서는 서로 다른 물리적 레지스터를 할당함으로써 독립적인 실행이 가능하도록 한다.
이 과정에서 Rename Table이 사용되며 이는 각 논리 레지스터가 현재 어떤 물리적 레지스터에 매핑되어 있는지를 관리한다. 새로운 명령어가 결과를 생성할 경우 새로운 물리적 레지스터가 할당되며 이전 매핑은 유지된다.
WAR 해저드 해결
WAR 해저드는 읽기 이후 쓰기 의존성으로 인해 발생하지만 레지스터 리네이밍을 통해 쉽게 제거할 수 있다. 후속 명령어가 특정 레지스터를 읽을 때 해당 값은 기존 물리적 레지스터에서 읽게 되고 이후 명령어는 새로운 물리적 레지스터에 값을 기록하게 된다.
이렇게 하면 읽기 연산과 쓰기 연산이 서로 다른 물리적 레지스터를 사용하게 되므로 충돌이 발생하지 않는다. 결과적으로 명령어 실행 순서를 자유롭게 변경할 수 있게 된다.
WAW 해저드 해결
WAW 해저드는 동일한 레지스터에 대한 쓰기 순서 문제로 발생한다. 레지스터 리네이밍에서는 각 쓰기 연산에 대해 새로운 물리적 레지스터를 할당하기 때문에 두 명령어는 서로 다른 위치에 결과를 기록하게 된다.
최종적으로 어떤 값이 유효한지는 Rename Table을 통해 결정되며 가장 최근에 매핑된 물리적 레지스터가 논리적 레지스터의 값을 대표하게 된다. 이를 통해 쓰기 순서 문제가 자연스럽게 해결된다.
물리적 레지스터 파일 구조
레지스터 리네이밍을 구현하기 위해서는 충분한 수의 물리적 레지스터가 필요하다. 물리적 레지스터 파일은 논리적 레지스터보다 훨씬 많은 레지스터를 포함하며 Out-of-Order 실행 중인 모든 명령어의 결과를 저장할 수 있어야 한다.
또한 Free List와 같은 구조를 사용하여 사용 가능한 물리적 레지스터를 관리한다. 새로운 명령어가 결과를 생성할 때 Free List에서 레지스터를 할당받고 더 이상 사용되지 않는 레지스터는 다시 반환된다.
리오더 버퍼와의 연계
레지스터 리네이밍은 리오더 버퍼와 함께 사용되어 Precise Exception을 지원한다. 명령어 실행 결과는 즉시 아키텍처 레지스터에 반영되지 않고 리오더 버퍼를 통해 순차적으로 커밋된다.
이 과정에서 Rename Table은 speculative 상태를 관리하며 잘못된 실행 결과를 쉽게 롤백할 수 있도록 한다.
성능적 의의
레지스터 리네이밍은 WAR와 WAW 해저드를 제거함으로써 Instruction Level Parallelism을 크게 향상시킨다. 이는 Out-of-Order 실행 구조에서 필수적인 요소이며 실행 유닛 활용률을 높이는 데 중요한 역할을 한다.
특히 현대 CPU에서는 수십 개 이상의 명령어가 동시에 실행되기 때문에 이러한 의존성 제거 기법이 없으면 성능 향상이 거의 불가능하다.
결론
레지스터 리네이밍은 현대 프로세서 아키텍처에서 가짜 데이터 의존성을 제거하기 위한 핵심 기술이다. WAR와 WAW 해저드를 효과적으로 해결함으로써 명령어 실행 순서의 자유도를 높이고 전체 시스템 성능을 향상시킨다.
앞으로의 CPU 설계에서도 레지스터 리네이밍은 더욱 발전된 형태로 활용되며 고성능 아키텍처 구현에 중요한 역할을 지속할 것이다.