본문 바로가기

Computer Science/컴퓨터 구조

컴퓨터 구조 - 명령어 병렬 처리 기법

명령어 병렬 처리 기법(ILP; Instructor-Level Parallelism)

: CPU가 명령어를 동시에 효율적으로 처리할 수 있도록 작동시키는 기법입니다.

 

명령어 파이프라인 : 하나의 명령어가 처리되는 전체 과정을 비슷한 시간 간격으로 나누어 확인할 수 있습니다.

  • 명령어 인출(Instruction Fetch)
  •  
  • 명령어 해석(instruction Decode)
  •  
  • 명령어 실행(Execute Instruction)
  •  
  • 결과 저장(Write Back)

여기서 중요한 점은 같은 단계가 겹치지만 않는다면 CPU는 각 단계를 동시에 실행할 수 있습니다.

이처럼 명령어들을 명령어 파이프라인에 넣고 동시에 처리하는 기법을 명령어 파이프라이닝(instruction pipelining)이라고 합니다.

명령어 파이프라인을 사용하지 않았을 때, 훨씬 더 많은 시간이 걸린다는 것을 알 수 있다.

다만, 명령어 파이프라인을 사용했을 때 성능 향상에 실패하는 파이프라인 위험(pipeline hazard)가 있습니다.

  • 데이터 위험(data hazard) : 명령어 간 데이터 의존성에 의해 발생합니다. 모든 명령어를 항상 동시에 처리할 수는 없습니다. 간혹 어떤 명령어를 끝까지 실행해야만 실행할 수 있는 명령어도 있습니다.

  • 제어 위험(control hazard) : 프로세스의 실행 흐름이 바뀌어 명령어가 실행되면서 프로그램 카운터 값에 변화가 생길 때 발생합니다. 프로그램 카운터는 일반적으로 현재 실행중인 명령어의 다음 주소로 갱신됩니다. 그러나 갑작스럽게 다른 주소로 갱신된다면, 명령어 파이프라인에 이미 인출한 다음 주소의 명령어들은 아무 쓸모가 없어지는 현상이 일어나게 됩니다. 이를 제어 위험이라고 합니다. 제어 위험은 분기 예측을 통해 예방할 수 있습니다.
  • 구조적 위험(structural hazard) : 명령어들을 겹쳐 실행하는 과정에서 서로 다른 명령어가 동시에 ALU, 레지스터 등과 같은 CPU 부품을 사용하려고 할 때 발생합니다. 자원 위험(resource hazard)이라고도 부릅니다.

 

슈퍼스칼라(superscalar) : CPU 내부에 여러 개의 명령어 파이프라인을 포함한 구조를 말합니다. 슈퍼스칼라를 포함한 CPU를 슈퍼스칼라 프로세서라고 부릅니다. 슈퍼스칼라 프로세서는 이론적으로 파이프라인 개수에 비례하여 프로그램 처리 속도가 빨라집니다. 그러나 여러 개의 파이프라인을 사용하기 때문에 파이프라인 위험을 피하기가 매우 까다로워집니다.

 

비순차적 명령어 처리(OoOE; Out-of-order execution) : 명령어 파이프라이닝, 슈퍼스칼라 기법은 모두 순차적 명령어 처리기법입니다. 그러나 파이프라인 위험에 의해 명령어를 곧바로 처리하지 못하는 경우가 있습니다. 이에 명령어를 순차적으로 처리하지 않고 순서를 바꿔 실행해도 무방한 명령어를 먼저 실행하여 명령어 파이프라인이 멈추는 것을 방지하는 기법을 비순차적 명령어 처리라고 합니다.

 

공부 내용에 쓰인 이미지는 유튜브 채널 '개발자 강민철' 에서 스크랩했습니다.

https://www.youtube.com/@kangminchul