본문 바로가기
책/혼공 컴퓨터구조+운영체제

컴퓨터 구조 - 명령어 파이프라인, 슈퍼 스칼라, 비순차적 명령어 처리 기법

by 코딩하는 돼징 2023. 11. 29.
반응형

빠른 CPU를 만들려면 높은 클럭 속도에 멀티코어, 멀티스레드를 지원하는 CPU를 만드는 것도 중요하지만 CPU가 놀지 않고 시간을 알뜰하게 쓰며 작동하게 만드는 것도 중요하다.

 

명령어를 동시에 처리하여 CPU를 한시도 쉬지 않고 작동시키는 기법인 명령어 병렬처리기법과(ILP, Instruction-Level Parallelism)이 있다.대표적인 명령어 병렬 처리 기법에는 명령어 파이프라이닝, 슈퍼스칼라, 비순처적 명령어 처리가 있다.


1. 명령어 파이프라인(Instruction Pipeline)

CPU가 명령어를 처리하는 과정을 여러 단계로 나누어 일련의 파이프라인 스테이지에서 동시에 처리하는 기법이다. 이를 통해 여러 명령어가 동시에 파이프라인의 각 스테이지를 통과하며 병렬적으로 실행된다.

01 명령어 인출(Instruction Fetch)

PC로부터 다음 실행될 명령어의 주소를 읽어온다. 명령어 캐시 등을 통해 해당 주소에서 명령어를 가져와 현재 명령어 레지스터에 저장한다.

02 명령어 해석(Instruction Decode)

명령어 레지스터에 저장된 명령어를 해석하고 필요한 제어 신호를 해석한다. 명령어가 어떤 동작을 수행해야 하는지 결정하고 이에 필요한 데이터를 가져오는 등의 작업을 수행한다.

03 명령어 실행(Excute Instruction)

명령어가 수행해야 할 연산이나 동작을 실행한다. ALU를 사용하여 계산이나 논리 연산을 수행하고 메모리에서 데이터를 읽거나 쓰 등의 작업을 수행한다.

04 결과 저장(Write Back)

명령어 실행 단계에서 생성된 결과를 레지스터나 메모리에 저장한다. 실행된 명령어의 결과가 다음 명령어에서 사용될 수 있도록 저장한다.

전공서에 따라 인출 -> 명령어 실행으로 나누기도 하고, 명령어 인출 -> 명령어 해석 -> 메모리 접근 ->결과 저장으로 나누기도 한다.

같은 단계가 겹치지만 않는다면 CPU는 각 단계를 동시에 실행할 수 있다. 예를 들어 CPU는 명령어를 인출하는 동안에 다른 명령어를 실행할 수 있고 한 명령어가 실행되는 동안에 연산 결과를 저장할 수 있다.

 

그림과 같이 마치 공장 생산 라인 같이 명령어들을 명령어 파이프라인(instruction pipline)에 넣고 동시에 처리하는 기법을 명령어 파이프라이닝(instruction pipelining)이라고 한다.


2. 파이프라인 위험(pipline hazard)

01 데이터 위험(data hazard)

명령어 간 데이터 의존성에 의해 발생한다. 모든 명령어를 동시에 처리할 수 없기 때문에 어떤 명령어는 이전 명령어가 완전히 실행되어야만 실행 가능한 경우가 있다. 

명령어 1: R1 ← R2 + R3 // R2 레지스터 값과 R3 레지스터 값을 더한 값을 R1 레지스터에 저장
명령어 2: R4 ← R1 + R5 // R1 레지스터 값과 R5 레지스터 값을 더한 값을 R4 레지스터에 저장

 

위의 예시의 경우 명령어 1을 수행해야만 명령어 2를 수행할 수 있다. 즉 명령어 1이 수행되고 나서야 필요한 데이터가 확보되므로 데이터 의존성이 발생한다.


02 제어 위험(control hazard)

분기 등으로 이한 프로그램 카운터의 갑작스러운 변화에 의해 발생한다. PC는 현재 실행중인 명령어의 다음 주소로 갱신된다. 하지만 프로그램 실행 흐름이 바뀌어 명령어가 실행되면서 PC값에 갑작스러운 변화가 생긴다면 명령어 파이프라인에 미리 가지고 와서 처리 중이었던 명령어들은 아무 쓸모가 없어진다. 

분기 예측(branch prediction)

프로그램이 어디로 분기할지 미리 예측한 후 그 주소를 인출하는 기술이다. 이를 통해 분기로 인한 제어 위험을 완하할 수 있다.


03 구조적 위험(structural hazard)

명령어들을 겹쳐 실행하는 과정에서 서로 다른 명령어가 동시에 ALU, 레지스터 등과 같은 CPU 부품을 사용하려고 할 때 발생한다. 이는 자원을 공유할 때 발생하는 위험으 자원 위험(Resource Hazard)이라고도 부른다.


3. 슈퍼 스칼라(SuperScalar)

CPU내부에 여러 개의 명령어 파이프라인을 포함한 구조를 슈퍼스칼라라고 한다.

명령어 파이프라인을 하나만 두는 것이 공장 생산 라인을 한 개 두는 것과 같다면 슈퍼 스칼라는 공장 생산 라인을 여러개 두는 것과 같다. 슈퍼 스칼라 구조로 명령어 처리가 가능한 CPU를 슈퍼 스칼라 프로세서 또는 슈퍼스칼라 CPU라고 한다.


슈퍼 스칼라 프로세서

여러 개의 명령어 파이프라인을 동시에 실행할 수 있는 구조를 가지고 있다. 이를 통해 한 클럭 주기 동안 여러 명령어를 동시에 실행할 수 있어 이론적으로 프로그램 처리 속도를 향상시킬 수 있다.

하지만 파이프라인 개수가 늘어남에 따라 파이프라인 위험도도 증가하고 여러개의 독립적인 명령어 파이프라인을 효과적으로 관리하고 조율하는 것이 어렵다.


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

명령어들을 순차적으로 실행하지 않는 기법이다. 명령어의 합법적인 새치기라고 볼 수 있다.

앞서 본 기법들은 모두 순차적인 처리를 상정한 방법이었다. 프로그램을 위에서 아래로 차례차례 실행하는 방식이었다. 하지만 파이프 위험과 같은 예상치 못한 문제들로 인해 이따금씩 명령어는 곧바로 처리되지 못하기도 한다. 만약 모든 명령어를 순차적으로만 처리한다면 이런 예상치 못한 상황에서 명령어 파이프라인은 멈춰 버리게 된다.

 

메모리 N번지는 M(N)으로, 메모리 N번지에 M을 저장하라는 M(N)←M 으로 표기

M(100) ← 1
M(101) ← 2
M(102) ← M(100) + M(101)
M(150) ← 1
M(151) ← 2
M(152) ← 3

이 명령어를 순차적으로 실행되는 CPU로 실행되는 경우 아래 그림과 같다. 2번째 명령이 실행 될때 3,4,5,6번째 명령어들이 기다리게 된다.

 

이 명령어들 간에 서로 데이터 의존성이 전혀 없는 순서를 바꿔 처리해도 수행 결과에 영향을 미치지 않는 명령어 들이 있다. 아래와 같이 명령어의 순서를 바꿔보면 순차적으로 명령어를 처리할 때보다 더 효율적으로 처리할 수 있게 된다.

 

 

 

 

 

참고 :  본 내용은개발자를 위한 컴퓨터공학 1: 혼자 공부하는 컴퓨터구조 + 운영체제강의를 수강하여 작성하였습니다. https://www.inflearn.com/course/%ED%98%BC%EC%9E%90-%EA%B3%B5%EB%B6%80%ED%95%98%EB%8A%94-%EC%BB%B4%ED%93%A8%ED%84%B0%EA%B5%AC%EC%A1%B0-%EC%9A%B4%EC%98%81%EC%B2%B4%EC%A0%9C/dashboard

 

 

반응형

댓글