[CS] 명령어 병렬 처리 기법

정은아·2023년 12월 29일
post-thumbnail

명령어를 빠르고 효율적으로 처리하기 위해 CPU를 한시도 쉬지 않고 작동시키는 명령어 병렬 처리 기법을 알아보자.

명령어 처리과정

명령어 인출 -> 명령어 해석 -> 명령어 실행 -> 결과 저장

  • 같은 단계가 겹치지 않는다면 각 단계를 동시해 실행할 수 있음

  • 명령어를 겹쳐서 수행하면 명령어를 하나하나 실행하는 것 보다 효율적임


명령어 파이프라이닝

  • 공장 라인처럼 명령어를 파이프라인에 넣고 동시에 처리하는 기법

파이프라이닝이 높은 성능을 가져오긴 하지만, 특정 상황에서는 성능 향상에 실패하는 경우도 있다. 이러한 상황을 파이프라인 위험이라고 부른다.
파이프라인 위험에는 크게 데이터 위험, 제어 위험, 구조적 위험이 있다.

1. 데이터 위험

  • 데이터 의존성에 의해 발생
    • 데이터 의존성이란?
      : 이전 명령어가 끝까지 실행되야 결과 데이터를 이용하여 명령어 실행 가능한 경우

2. 제어 위험

  • 프로그램 카운터의 갑작스러운 변화에 의해 발생
    프로그램 카운터는 기본적으로 현재 실행 중인 명령어의 다음 주소로 갱신됨

  • 실행 흐름이 바뀌어 명령어가 실행되면 프로그램 카운터 값에 변화가 생기면 처리중이던 명령어는 쓸모없어짐 = 제어위험

  • 이를 해결하기 위해 사용하는 기술 = 분기 예측

3. 구조적 위험

  • 서로 다른 명령어가 동시에 ALU, 레지스터 같은 CPU 부품을 사용하려 할 때 발생

  • 자원 위험이라고 부르기도 한다.


슈퍼스칼라

  • CPU 내에 여러 개의 명령어 파이프라인을 포함한 구조

  • 공장 라인을 여러개 놓는 느낌

  • 이런 CPU를 슈퍼스칼라 프로세서, 슈퍼스칼라 CPU라고 함


비순차적 명령어 처리

  • Out-of-order execution : 명령어를 순차적으로 실행하지 않는 기법 = 합법적 새치기

  • 명령어를 순차적으로 실행하지 않고 순서를 바꿔도 무방한 명령어에 한하여 먼저 실행시킴으로서 파이프라인이 멈추는 것을 방지하는 기법
    ex) 데이터 의존적이지 않는 명령어, 독단적인 명령어, 순서가 바뀌어도 프로그램 실행 흐름에 영향이 없는 명령어

profile
꾸준함의 가치를 믿는 개발자

0개의 댓글