본문 바로가기
CS

[혼공컴운] 명령어 병렬 처리 기법

by 데브겸 2023. 4. 10.

명령어 파이프라인

명령어를 동시 처리하는 기법을 명령어 파이프라이닝(Instruction Pipelining)이라고 함.

아래 그림과 같이 명령어를 겹쳐서 실행하는 것 (하나가 끝날 때까지 기다렸다 다른 하나를 실행하는게 X)

명령의 단계가 겹치지만 않으면 CPU는 명령어를 동시에 실행할 수 있음

명령어 파이프라인

명령어 파이프라이닝은 어떤 경우 성능 향상에 실패하기도 하는데 그 유형은 아래와 같음

  • 데이터 위험: 어떤 명령어가 다른 명령어의 결과 값 등에 의존하는 경우
  • 제어 위험: 
    • 분기 등으로 인해 프로그램 카운터에 갑작스러운 변화가 발생하는 경우
    • 프로그램 카운터는 기본적으로 바로 다음 명령을 내려야 하는데, 만약 한 명령어가 끝에 바로 다음 주소가 아닌 훨씬 멀리 떨어진 주소의 명령어를 실행시키는 경우.
    • 분기 예측을 통해 이를 해결할 수 있음
  • 구조적 위험: 서로 다른 명령어가 CPU 자원을 한꺼번에 동시에 사용하려고 하는 경우. 자원 위험이라고도 부름

 

슈퍼스칼라

현대 CPU의 경우 파이프라인을 여러 개 사용함. 즉, 한 번에 여러 개의 명령어를 동시에, 그리고 겹쳐서 실행. 이렇게 다수의 명령어 파이프라인이 CPU안에 들어 있는 구조를 슈퍼스칼라라고 부름. 그리고 이 슈퍼스칼라 구조로 명령어 처리가 가능한 CPU를 슈퍼스칼라 프로세서 혹은 슈퍼스칼라 CPU라고 부름.

슈퍼 스칼라 구조 예시

 

비순차적 명령어 처리 기법

어쨌거나 명령어 파이프라이닝이나 슈퍼스칼라 구조 모두 명령어를 순차적으로 처리하는 것을 목표로 함. 내가 a 명령어를 내리고, 그 다음 b 주소에 있는 명령어를 하라고 시키면 a -> b 순서로 처리하는 것. 그런데, 이렇게 되면 어쨌거나 어느 순간까지는 비효율적으로 기다려야 하는 순간이 왔음. 예를 들어 바로 위 예시에서 명령어 1, 2가 저장되어야  명령어 3, 4이 실행될 수 있다고 생각해보면 쉬움.

 

비순차적 명령어 처리 기법은 명령어 간 의존성이 없는 독립적인 명령어를 먼저 실행해서 명령어 파이프라인을 효율화하는 기법을 말함.