Microarchitecture

마이크로아키텍처는 컴퓨터 아키텍처의 핵심 영역으로, 명령어 집합 아키텍처 (ISA) 를 실제 하드웨어로 구현하는 방법과 관련된 설계 접근법을 의미한다.
ISA 가 " 무엇을 할 수 있는가 " 를 정의한다면, 마이크로아키텍처는 " 어떻게 구현할 것인가 " 에 초점을 맞춘다. 같은 ISA 를 구현하더라도 서로 다른 마이크로아키텍처 설계를 통해 성능, 효율성, 비용, 전력 소비 등의 측면에서 큰 차이를 만들어낼 수 있다.

마이크로아키텍처의 기본 개념

마이크로아키텍처는 프로세서의 내부 구조를 설계하는 방법론으로, ISA 가 정의한 추상적 명령어를 실제 하드웨어 동작으로 변환하는 과정을 다룬다.

마이크로아키텍처와 ISA 의 관계

마이크로아키텍처와 ISA 는 밀접한 관계를 가지고 있지만 명확히 구분된다:

같은 ISA(예: x86-64) 를 공유하는 여러 프로세서 (인텔의 Core i7, AMD 의 Ryzen 등) 가 서로 다른 마이크로아키텍처를 가질 수 있으며, 이로 인해 성능, 전력 효율성, 발열 특성에 차이가 생긴다. 그러나 이러한 프로세서들은 동일한 소프트웨어를 실행할 수 있다.

마이크로아키텍처의 추상화 수준

컴퓨터 시스템의 추상화 계층에서 마이크로아키텍처는 다음과 같은 위치를 차지한다:

  1. 애플리케이션 소프트웨어 (최상위 계층)
  2. 운영 체제
  3. 컴파일러와 어셈블러
  4. 명령어 집합 아키텍처 (ISA)
  5. 마이크로아키텍처
  6. RTL(Register Transfer Level) 설계
  7. 게이트 수준 설계
  8. 트랜지스터 수준 설계 (최하위 계층)

마이크로아키텍처는 ISA 아래에 위치하며, 실제 하드웨어 구현에 가까운 수준의 추상화를 제공한다.

마이크로아키텍처의 역사적 발전

마이크로아키텍처는 컴퓨터의 발전과 함께 끊임없이 진화해왔다.

주요 발전 단계를 살펴보면:

  1. 초기 마이크로아키텍처
    1950-60 년대의 초기 컴퓨터는 단순한 마이크로아키텍처를 가졌다:

    • 순차 실행: 한 명령어가 완전히 실행된 후에 다음 명령어가 시작되는 방식
    • 하드와이어드 제어: 명령어를 실행하기 위한 제어 논리가 하드웨어로 직접 구현
    • 단일 ALU(산술 논리 장치): 모든 연산이 하나의 ALU 에서 처리됨
  2. CISC 와 RISC 의 등장
    1970-80 년대에는 두 가지 주요 마이크로아키텍처 철학이 등장했다:

    • CISC(Complex Instruction Set Computer): 복잡하고 강력한 명령어를 제공하여 컴파일러 설계를 단순화하고 메모리 사용을 최소화하는 접근 방식. 인텔의 x86 아키텍처가 대표적이다.
    • RISC(Reduced Instruction Set Computer): 간단하고 균일한 명령어 세트를 사용하여 하드웨어 복잡성을 줄이고 파이프라이닝과 같은 최적화를 용이하게 하는 접근 방식. ARM, MIPS, SPARC, RISC-V 등이 이에 해당한다.
  3. 현대 마이크로아키텍처로의 진화
    1990 년대 이후 마이크로아키텍처는 다음과 같은 방향으로 발전했다:

    • 하이브리드 접근법: 현대 CISC 프로세서는 내부적으로 CISC 명령어를 더 단순한 마이크로 연산 (micro-ops) 으로 변환하는 RISC 스타일의 코어를 사용한다. 인텔의 P6 마이크로아키텍처 (1995 년) 부터 이 접근법이 도입되었다.
    • 고급 최적화 기법: 비순차적 실행 (Out-of-Order Execution), 투기적 실행 (Speculative Execution), 슈퍼스칼라 설계 등 성능을 향상시키는 다양한 기법이 도입되었다.
    • 멀티코어 설계: 단일 코어의 성능 한계를 극복하기 위해 여러 프로세서 코어를 하나의 칩에 통합하는 접근법이 주류가 되었다.

마이크로아키텍처의 기본 구성 요소

마이크로아키텍처는 여러 핵심 구성 요소로 이루어져 있으며, 이들의 설계와 통합 방식이 전체 성능을 결정한다.

  1. 명령어 인출 및 디코딩 유닛
    프로세서가 메모리에서 명령어를 가져오고 해석하는 부분:

    • 명령어 인출 유닛 (Instruction Fetch Unit): 메모리에서 명령어를 가져와 명령어 큐에 저장한다.
    • 명령어 디코딩 유닛 (Instruction Decode Unit): 인출된 명령어를 해석하여 프로세서가 이해할 수 있는 내부 형식으로 변환한다.
    • 분기 예측기 (Branch Predictor): 조건부 분기 명령어의 결과를 예측하여 명령어 파이프라인의 효율성을 높인다.
  2. 실행 유닛
    명령어를 실제로 처리하는 프로세서의 핵심 부분:

    • 산술 논리 장치 (ALU): 정수 연산, 논리 연산 등을 수행한다.
    • 부동 소수점 유닛 (FPU): 부동 소수점 연산을 처리한다.
    • 벡터 처리 유닛 (Vector Processing Unit): SIMD(Single Instruction, Multiple Data) 명령어를 처리한다.
    • 로드 - 저장 유닛 (Load-Store Unit): 메모리 접근 명령어를 처리한다.
  3. 레지스터 파일
    프로세서 내부의 고속 저장소로, 현재 작업 중인 데이터와 명령어를 저장한다:

    • 아키텍처 레지스터: ISA 에 정의된, 프로그래머가 접근할 수 있는 레지스터.
    • 물리적 레지스터: 실제 하드웨어 구현에 사용되는 레지스터로, 레지스터 리네이밍 (Register Renaming) 을 통해 아키텍처 레지스터와 매핑된다.
    • 특수 레지스터: 프로그램 카운터 (PC), 스택 포인터 (SP), 상태 레지스터 등 특별한 용도로 사용되는 레지스터.
  4. 메모리 계층 구조
    데이터와 명령어에 대한 접근 시간과 처리량을 최적화하는 계층적 저장 시스템이다:

    • L1 캐시: CPU 코어에 가장 가까운 소규모, 고속 캐시로, 보통 명령어용 (L1i) 과 데이터용 (L1d) 으로 분리.
    • L2 캐시: L1 보다 크고 약간 느린 중간 수준의 캐시.
    • L3 캐시 (LLC, Last Level Cache): 여러 코어가 공유하는 대규모 캐시.
    • 메모리 컨트롤러: 주 메모리 (RAM) 에 대한 접근을 관리한다.
  5. 제어 유닛
    프로세서의 모든 부분을 조정하고 관리하는 역할을 한다:

    • 파이프라인 제어 로직: 파이프라인의 흐름을 관리한다.
    • 클럭 분배 시스템: 프로세서의 여러 부분에 클럭 신호를 분배한다.
    • 인터럽트 처리기: 외부 및 내부 인터럽트를 처리한다.
    • 전력 관리 유닛: 프로세서의 전력 소비를 제어한다.

마이크로아키텍처의 핵심 기술

마이크로아키텍처의 성능, 효율성, 복잡성은 다양한 설계 기술과 최적화에 크게 의존한다.

파이프라이닝 (Pipelining)

파이프라이닝은 명령어 실행을 여러 단계로 분할하여 여러 명령어가 동시에 서로 다른 단계에서 처리될 수 있도록 하는 기술이다.

기본 5 단계 파이프라인

가장 기본적인 RISC 파이프라인은 다음 5 단계로 구성된다:

  1. 명령어 인출 (IF, Instruction Fetch): 메모리에서 명령어 가져오기
  2. 명령어 해독 (ID, Instruction Decode): 명령어 해석 및 레지스터 읽기
  3. 실행 (EX, Execute): ALU 연산 수행
  4. 메모리 접근 (MEM, Memory Access): 필요한 경우 메모리 읽기/쓰기
  5. 레지스터 쓰기 (WB, Write Back): 결과를 레지스터에 저장
파이프라인 위험 (Hazards)

파이프라인 처리 시 발생할 수 있는 문제들:

위험 해결 방법

슈퍼스칼라 아키텍처 (Superscalar Architecture)

슈퍼스칼라 설계는 동일한 파이프라인을 여러 개 두어 한 클럭 사이클에 여러 명령어를 동시에 인출, 디코딩, 실행할 수 있게 한다.

발행 폭 (Issue Width)

한 사이클에 처리할 수 있는 명령어의 수를 의미한다. 현대 프로세서는 보통 2-6 개의 명령어를 동시에 처리할 수 있다.

명령어 스케줄링

어떤 명령어를 어떤 실행 유닛에서 처리할지 결정하는 메커니즘:

비순차적 실행 (Out-of-Order Execution)

명령어가 프로그램 순서대로 실행되지 않고, 데이터 의존성과 자원 가용성에 따라 최적의 순서로 실행되는 기법.

토마술로 알고리즘 (Tomasulo’s Algorithm)

IBM 의 로버트 토마술로가 개발한 이 알고리즘은 현대 비순차적 실행의 기초가 되었다.
이 알고리즘은 다음과 같은 요소로 구성된다:

재정렬 버퍼 (Reorder Buffer, ROB)

비순차적으로 실행된 명령어의 결과를 프로그램 순서대로 커밋 (commit) 하기 위한 버퍼이다. 이를 통해 정확한 예외 처리와 프로그램 의미론을 유지할 수 있다.

투기적 실행 (Speculative Execution)

프로그램 흐름의 변화 (주로 조건부 분기) 를 예측하여 미리 명령어를 실행하는 기법.

분기 예측 (Branch Prediction)

조건부 분기의 결과 (분기를 취할지 여부) 를 예측하는 기술:

메모리 의존성 예측

로드 명령어가 앞선 저장 명령어와 동일한 메모리 위치를 참조할지 예측하는 기술. 이를 통해 메모리 작업의 비순차적 실행을 최적화할 수 있다.

SIMD(Single Instruction, Multiple Data) 처리

하나의 명령어로 여러 데이터 요소를 동시에 처리하는 병렬 처리 기법.

SIMD 확장

다양한 ISA 에 추가된 SIMD 명령어 세트:

벡터 레지스터

SIMD 연산에 사용되는 넓은 레지스터로, 여러 개의 데이터 요소를 포함할 수 있다 (예: 256 비트 AVX 레지스터는 8 개의 32 비트 부동 소수점 값을 저장할 수 있음).

5. 캐시 및 메모리 시스템 설계

메모리 시스템은 마이크로아키텍처 성능에 결정적인 영향을 미치는 요소이다.
현대 프로세서는 메모리 접근 지연 시간을 줄이기 위해 정교한 캐시 계층 구조를 사용한다.

캐시 구성 및 정책

캐시 구성 매개변수
캐시 매핑 방식
교체 정책

캐시가 가득 찼을 때 어떤 항목을 제거할지 결정하는 알고리즘:

쓰기 정책

캐시의 데이터가 수정될 때 메인 메모리를 어떻게 업데이트할지 결정한다:

캐시 일관성 (Cache Coherence)

멀티코어 시스템에서 여러 캐시가 동일한 메모리 위치의 복사본을 저장할 때, 이 복사본들이 일관된 상태를 유지하도록 하는 메커니즘.

스누핑 (Snooping) 프로토콜

각 캐시 컨트롤러가 공유 버스의 모든 트랜잭션을 ’ 엿듣고 ’ 필요한 경우 조치를 취하는 방식이다:

디렉토리 기반 (Directory-Based) 프로토콜

중앙 디렉토리가 각 메모리 블록의 상태 및 위치 정보를 유지하는 방식으로, 대규모 다중 프로세서 시스템에 적합하다:

메모리 주소 변환 및 TLB

가상 메모리 시스템에서 가상 주소를 물리적 주소로 변환하는 과정입니다.

페이지 테이블 (Page Table)

가상 주소와 물리적 주소 간의 매핑 정보를 저장하는 데이터 구조:

TLB(Translation Lookaside Buffer)

최근 주소 변환 결과를 캐싱하는 특수 캐시로, 주소 변환 지연 시간을 줄인다:

마이크로아키텍처 최적화 기법

성능, 효율성, 신뢰성을 향상시키기 위한 다양한 최적화 기법이 마이크로아키텍처에 적용된다.

최적화

  1. 프리페칭 (Prefetching)
    프로세서가 앞으로 필요할 것으로 예상되는 데이터나 명령어를 미리 메모리에서 캐시로 가져오는 기술:

    • 명령어 프리페칭: 곧 실행될 명령어를 미리 가져옴
    • 데이터 프리페칭: 액세스 패턴을 분석하여 곧 필요할 데이터를 예측하고 가져옴
    • 소프트웨어 프리페칭: 프로그래머나 컴파일러에 의한 명시적 프리페치 지시
  2. 메모리 계층 최적화

    • 뱅크 인터리빙 (Bank Interleaving): 여러 메모리 뱅크를 병렬로 접근하여 대역폭 향상
    • 캐시 계층 조정: 작업 부하 특성에 맞게 캐시 크기, 연관성, 라인 크기 최적화
    • 비차단 캐시 (Non-blocking Cache): 캐시 미스가 발생해도 다른 요청을 계속 처리
  3. 명령어 최적화

    • 트레이스 캐시 (Trace Cache): 디코딩된 명령어 시퀀스를 저장하여 디코딩 단계 우회
    • 루프 캐싱 (Loop Caching): 자주 실행되는 루프를 특수 캐시에 저장
    • 마이크로 연산 퓨전 (Micro-op Fusion): 여러 마이크로 연산을 하나로 결합하여 처리

전력 효율성 최적화

  1. 동적 전압 및 주파수 조정 (DVFS, Dynamic Voltage and Frequency Scaling)
    작업 부하에 따라 프로세서의 전압과 주파수를 동적으로 조정하여 전력 소비를 최적화한다.

  2. 전력 게이팅 (Power Gating)
    사용하지 않는 프로세서 부분의 전원을 차단하여 정적 전력 소비를 줄인다.

  3. 클럭 게이팅 (Clock Gating)
    활성화되지 않은 회로에 클럭 신호를 차단하여 동적 전력 소비를 줄인다. 이는 불필요한 회로의 스위칭 활동을 방지하여 에너지를 절약한다.

  4. 비대칭 코어 설계 (Asymmetric Core Design)
    서로 다른 성능과 전력 특성을 가진 코어를 조합하여 효율성을 극대화한다:

    • 빅.리틀 (big.LITTLE) 아키텍처: ARM 이 개발한 이 설계는 고성능 ’ 빅 ’ 코어와 저전력 ’ 리틀 ’ 코어를 결합한다.
    • 하이브리드 코어 (Hybrid Cores): 인텔의 Alder Lake 와 같은 프로세서는 성능 코어 (P-cores) 와 효율 코어 (E-cores) 를 결합한다.

신뢰성 최적화

  1. 오류 감지 및 수정 (Error Detection and Correction)
    데이터 무결성을 보장하기 위한 기법:

    • 패리티 체크 (Parity Check): 간단한 오류 감지 방식
    • ECC(Error-Correcting Code) 메모리: 단일 비트 오류를 감지하고 수정할 수 있는 메모리
    • SECDED(Single Error Correction, Double Error Detection): 단일 비트 오류는 수정하고 이중 비트 오류는 감지
  2. 장애 허용 (Fault Tolerance) 기법
    하드웨어 장애 발생 시에도 시스템이 계속 작동할 수 있도록 하는 방법:

    • 중복 실행 (Redundant Execution): 동일한 연산을 여러 번 수행하여 결과 비교
    • 체크포인팅 (Checkpointing): 프로세서 상태를 주기적으로 저장하여 장애 발생 시 복구
    • 잔여중복모듈 (Residue Redundant Modules): 결과 검증을 위한 추가 계산 모듈
  3. 열 관리 (Thermal Management)
    과열로 인한 성능 저하와 하드웨어 손상을 방지하는 기법:

    • 동적 열 관리 (Dynamic Thermal Management): 온도가 임계값에 도달하면 성능을 조절
    • 열 설계 전력 (TDP, Thermal Design Power): 냉각 시스템이 처리할 수 있는 최대 열 발산량
    • 열 스로틀링 (Thermal Throttling): 과열 시 클럭 속도를 낮추어 발열 감소

마이크로아키텍처의 설계 방법론

마이크로아키텍처를 설계하는 과정은 복잡하고 다양한 트레이드오프를 고려해야 한다.

설계 고려 사항

  1. 성능 목표
    마이크로아키텍처 설계의 주요 성능 목표:

    • IPC(Instructions Per Cycle): 사이클당 처리할 수 있는 명령어 수
    • 주파수 (Frequency): 클럭 속도 (GHz)
    • 지연 시간 (Latency): 명령어 처리에 소요되는 시간
    • 처리량 (Throughput): 단위 시간당 처리할 수 있는 작업량
  2. 제약 조건
    마이크로아키텍처 설계 시 고려해야 할 제약 사항:

    • 전력 소비 (Power Consumption): 프로세서가 소비하는 총 전력량
    • 다이 크기 (Die Size): 칩이 차지하는 실리콘 면적
    • 열 발산 (Heat Dissipation): 발생하는 열의 양과 방출 방법
    • 생산 비용 (Manufacturing Cost): 설계의 경제적 실현 가능성
  3. 워크로드 특성
    대상 애플리케이션의 특성에 따라 최적화 방향이 달라진다:

    • 명령어 혼합 (Instruction Mix): 정수, 부동 소수점, 벡터, 분기 등 명령어 유형의 분포
    • ILP(Instruction-Level Parallelism): 명령어 간의 병렬 실행 가능성
    • 메모리 접근 패턴 (Memory Access Pattern): 순차적, 랜덤, 스트라이드 등의 접근 패턴
    • 데이터 지역성 (Data Locality): 시간적, 공간적 지역성의 정도

설계 프로세스

  1. 설계 단계
    마이크로아키텍처 설계의 주요 단계:

    1. 요구사항 분석: 성능, 전력, 비용 등의 목표 설정
    2. 아키텍처 정의: 파이프라인 깊이, 발행 폭, 캐시 계층 구조 등 주요 매개변수 결정
    3. 마이크로아키텍처 설계: 각 컴포넌트의 상세 설계
    4. RTL(Register Transfer Level) 구현: 하드웨어 설명 언어로 설계 구현
    5. 검증 및 테스트: 시뮬레이션, 에뮬레이션, 프로토타이핑을 통한 검증
    6. 물리적 설계: 레이아웃, 배선, 타이밍 등 물리적 구현
  2. 설계 공간 탐색 (Design Space Exploration)
    다양한 설계 옵션을 평가하고 최적의 조합을 찾는 과정:

    • 시뮬레이션 기반 탐색: 다양한 설계 매개변수를 시뮬레이션하여 결과 비교
    • 분석적 모델링: 수학적 모델을 사용하여 설계 옵션 평가
    • 기계 학습 기반 탐색: AI 기술을 활용하여 방대한 설계 공간을 효율적으로 탐색
  3. 설계 검증 (Design Verification)
    설계가 요구사항을 충족하고 올바르게 작동하는지 확인하는 과정:

    • 기능적 검증: 설계가 ISA 사양을 정확히 구현하는지 확인
    • 성능 검증: 설계가 성능 목표를 달성하는지 평가
    • 전력 분석: 전력 소비 특성 분석
    • 정형 검증 (Formal Verification): 수학적 방법을 사용하여 설계의 정확성 증명

설계 도구 및 환경

  1. 시뮬레이션 도구
    마이크로아키텍처의 동작을 모델링하고 분석하는 도구:

    • 사이클 정확 시뮬레이터 (Cycle-Accurate Simulator): gem5, SimpleScalar 등
    • 트레이스 기반 시뮬레이터 (Trace-Based Simulator): 사전 기록된 명령어 트레이스를 사용
    • 통계적 시뮬레이터 (Statistical Simulator): 확률적 모델을 사용하여 빠른 시뮬레이션 제공
  2. 설계 자동화 도구
    마이크로아키텍처 설계 과정을 지원하는 도구:

    • HDL(Hardware Description Language) 도구: Verilog/VHDL 편집, 시뮬레이션, 합성 도구
    • 고수준 합성 도구 (High-Level Synthesis): C/C++ 와 같은 고수준 언어에서 하드웨어 설계 생성
    • 전력 분석 도구: 설계의 전력 소비 특성 분석
    • 타이밍 분석 도구: 설계의 타이밍 제약 충족 여부 검증

용어 정리

용어설명

참고 및 출처