Just do IT
article thumbnail

Pipeline CPU 성능 분석

   * 파이프라인 분기 예측

   * RISC Processor

   * 파이프라인 CPU 성능 분석

 

파이프라인 분기 예측

   * 명령어 파이프라인이 정상적인 동작에서 벗어나게 되는 요인

      - 자원 충돌 (Resource conflict) : 세그먼트가 동시에 메모리를 접근하려고 하는 데에서 기인한다 -> 명령어 메모리와 데이터 메모리를 분리함으로써 대부분 해결한다

      - 데이터 의존성 (data dependency) : 충돌은 어떤 명령어가 이전 명령어의 결과에 의존하여 수행되는데, 값이 아직 준비되지 않은 경우에 발생한다
      -
분기 곤란 (branch difficulty) : 분기 명령어같이 PC 값을 변경 시키려는 명령어에 의해 발생한다

 

   * 데이터 의존성

      - 데이터나 주소의 충돌은 명령어 파이프라인의 성능을 저하 시키는 요인

         > 데이터 의존성 : 아직 준비되지 않은 데이터를 기다리는 경우

         > 주소 의존성 : 마이크로 연산 레지스터 간접모드를 사용하는 명령어는 이전 명령어가 주소 값을 메모리로부터 로드하는 명령어라면 곧바로 피연산자를 fetch하지 못하고 기다리게 된다

 

   * 분기 명령어의 처리

      - 조건 분기 또는 무조건 분기 등은 처리 여하에 따라 파이프라인의 정상적인 프로그램 순서를 바꾸어 버리기 때문에 파이프라인 시스템을 채택하고 있는 컴퓨터의 성능을 저하시키는 요인으로 간주되고 있다

         > 순차적으로 처리될 명령어를 분기의 목표가 되는 명령어와 함께 저장하는 방법

         > 분기 목표 버퍼(branch target buffer, BTB) 사용 : fetch 세그먼트에 속해 있는 associative memory : 이전에 실행된 분기 명령어와 분기 목표 명령어를 저장하여 활용(loop buffer - 일종의 레지스터)

   associative memory(어소시에이티브 메모리) : 주소가 아닌 내용에 의해 검색이 가능한 기억장치

      - 실제 다양한 프로그램의 실행 결과를 분석한 결과 참조의 시간적 지연성과 유사하게 일부 명령어들은 반복 수행되며 반복 실행시에는 규칙성을 갖는다

      - 이러한 예측 기법을 이용하여 분기 적재 명령어가 참조하는 오퍼랜드도 반복 참조 규칙성을 갖고 있으며 이를 이용할 경우 명령어 fetch 과정에서 신속하게 오퍼랜드의 제공 fetch 수월해 있다 다만 예측실패시 지불해야 패널티(시간 지연) 있을 있다

 

RISC Processor

   * RISC 프로세서의 설계목표

      - 실행 명령어 수는 증가 하더라고 작업 처리 시간의 감소가 가능하다

      - 명령어당 실행 클록 (CPI) 클록 주기를 파이프라인 구조를 이용하여 감소시킬 있다

  
   * RISC
프로세서의 구조적 특징

      - 명령어의 1 사이클 실행을 위한 파이프라인 구조, 메모리 참조를 위한 온칩 캐쉬(CPU 메모리 구현, 명령어 캐쉬, 자료 캐쉬로 구성)

      - 간단한 명령 코드와 주소 지정 모드 하드와이어 제어 장치

      - 신속한 오퍼랜드 참조/문맥 전환을 위한 레지스터 집합 (중첩된 레지스터 윈도우)

      - 실수 연산의 별도 처리를 위한 코프로세서(Co-processor)

 

   * RISC 파이프 라인

      - 명령어 사이클은 개의 부연산으로 나뉘어 다음과 같은 세그먼트로 구성

         > I : 명령어의 fetch

              >  A : ALU 동작

         > E : 명령어의 실행

파이프라인 CPU 성능 분석

   * 이론적으로는 명령어 세그먼트의 횟수가 많아질수록 파이프라인의 이론적 최대 속도가 증가할 것으로 분석 되었으나 실제 상황은 그렇게 단순하지 않다

      - 모든 명령어는 동일한 처리 과정(세그먼트의 적용)으로 처리되어야 한다

      - 파이프라인을 구성하는 단계의 처리 시간이 일정해야 한다

      - 모든 명령어는 작성된 순서에 따라 순차적(분기 명령, 함수 호출, 반환 명령 등에 의해 순차성이 깨짐)으로 실행되어야 한다

      - 사용 명령어들 사이에는 상호 의존성이 없어야 한다

      - 명령어들 처리 공유 자원의 충돌이 없어야 한다

 

출처 : 제로베이스

profile

Just do IT

@AmyG

포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!