CS/컴퓨터 구조

[컴퓨터 구조] 5-2 명령어 병렬 처리 기법

서니션 2024. 8. 6. 15:00
이 글을 혼자 공부하는 컴퓨터구조 + 운영체제 (한빛미디어) 책을 읽고 혼자 공부한 내용입니다.
잘못 이해한 부분이 있을 수 있고, 문제가 있는 부분 댓글로 알려주시면 수정하겠습니다.

 

명령어 파이프라인

명령어 처리 과정을 클럭 단위로 나누어 보면 일반적으로 아래와 같음

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

 

중요한 점은 같은 단계가 겹치지만 않는다면 CPU는 '각 단계를 동시에 실행할 수 있다'는 것

 

 

예를 들어 CPU는 한 명령어를 '인출'하는 동안에 다른 명령어를 '실행'할 수 있고,

한 명령어가 '실행'되는 동안에 연산 결과를 '저장'할 수 있음

 

이처럼 공장 생산 라인과 같은 명령어들을 명령어 파이프라인에 넣고

동시에 처리하는 기법을 명령어 파이프라이닝이라고 함

 

명령어 파이프라이닝? 동시에 여러 개의 명령어를 겹쳐 실행하는 기법

 

특정 상황에서는 성능향에 실패하는 경우가 있음. -> 파이프라인 위험

파이프라인 위험에는 크게 데이터 위험, 제어 위험, 구조적 위험이 있음

 

데이터 위험

'데이터 의존성'에 의해 발생

모든 명령어를 동시에 처리할 수는 없음 (이전 명령어를 끝까지 실행해야만 비로소 실행할 수 있는 경우)

 

위의 경우 명령어 1을 수행해야만 명령어 2를 수행할 수 있음

이처럼 데이터의 의존적인 두 명령어를 무작정 동시에 실행하려고 하면 파이프라인이 제대로 작동하지 않는 것을 데이터 위험이라고 함

 

제어 위험

'프로그램 카운터의 갑작스러운 변화'에 의해 발생

기본적으로 프로그램 카운터는 '현재 실행 중인 명령어의 다음 주소'로 갱신 됨

하지만 프로그램 실행 흐름이 바뀌어 명령어가 실행되면서 프로그램 카운터 값에 갑작스러운 변화가 생긴다면 명령어 파이프라인에 미리 가지고 와서 처리 중이었던 명령어들은 아무 쓸모가 없어짐

이를 위해 사용하는 기술 중 하나가 분기 예측

분기 예측은 프로그램이 어디로 분기할지 미리 예측한 후 그 주소를 인출하는 기술

 

구조적 위험

명령어들을 겹쳐 실행하는 과정에서 서로 다른 명령어가 동시에 ALU, 레지스터 등과 같은 CPU 부품을 사용하려고 할 때 발생

자원 위험이라고도 부름


슈퍼스칼라

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

명령어 파이프라인을 하나만 두는 것이 마치 공장 생산 라인을 한 개 두는 것과 같다면,

슈퍼스칼라는 공장 생산 라인을 여러 개 두는 것과 같음

 

이러한 슈퍼스칼라 구조로 명령어 처리가 가능한 CPU를 슈퍼스칼라 프로세서 또는 슈퍼스칼라 CPU라고 부름

 

슈퍼스칼라 프로세서는 이론적으로 파이프라인 개수에 비례하여 프로그램 처리 속도가 빨라지지만

파이프라인 위험 등의 예상치 못한 문제가 있어 실제로는 빨라지지 않음


비순차적 명령어 처리 (OoOE : Out-of-order execution)

명령어의 '합법적인 새치기'

순차적으로 명령어를 처리할 때보다 더 효율적으로 처리

 

명령어를 순차적으로만 실행하지 않고 순서를 바꿔 실행해도 무방한 명령어를 먼저 실행하여

명령어 파이프라인이 멈추는 것을 방지하는 기법 (명령어 병렬 처리 기법)