본문 바로가기

CS-Study

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

728x90

📗 명령어 파이프라인

명령어 파이프라인이란 명령어를 읽어 순차적으로 실행하는 프로세서에 적용되는 기술로

한번에 하나의 명령어만 실행하는 것이 아니라 하나의 명령어가 실행되는 도중에 다른

명령어 실행을 시작하는 식으로 동시에 여러 개의 명령어를 실행하는 기법이다.

 

💻 명령어 처리 과정

1. 명령어 인출

2. 명령어 해석

3. 명령어 실행

4. 필요하다면 결과 값을 저장

 

 

같은 단계가 겹치지 않는다면 CPU는 각 단계를 동시에 실행할 수 있다.

예) 명령어 1에서 명령어를 해석하는 동안, 명령어 2를 인출해 올 수 있다.

 

✅ 명령어 파이프라인을 사용하지 않는다면?

한 명령어의 인출-해석-실행-저장 작업이 끝나야 다른 명령어를 

시작할 수 있을 것이므로 명령어 처리 실행 시간이 매우 오래 걸릴 것이다.

 

💻 파이프라인 위험

항상 명령어를 겹쳐서 실행할 수 있는 것은 아니다.

파이프라인 위험이란 명령어 파이프라인이

성능 향상에 실패하는 (동시에 명령어를 처리할 수 없는) 경우를 말한다.

 

파이프라인 위험의 종류에는 데이터 위험, 제어 위험, 구조적 위험으로 3가지가 있다.

 

💻 데이터 위험

데이터 위험은 명령어 간의 의존성에 의해 발생한다.

이전의 명령어를 끝까지 실행해야만 비로소 실행이 가능한 명령어도 존재한다.

ex)

레지스터 4에 레지스터 1과 레지스터 5의 값을 더한 결과를 저장하고자 하는데

레지스터 1에 레지스터 2의 값과 레지스터 3의 값을 더한 결과를 저장하는 것이 먼저인 경우

 

먼저 레지스터 1에 과 값이 저장되는 명령어가 완료 되어야

레지스터 4에 결과값을 저장하는 명령어가 수행될 수 있다.

 

💻 제어 위험

제어 위험은 프로그램 카운터의 갑작스러운 변화 때문에 파이프라인의

성능향상에 실패하는 문제를 말한다.

JUMP, CALL, INTERRUPT에 의해  PC가 특정 메모리 주소로 갑자기 변하는 경우가 있는데

예를들어 10번지(현재) -> 11번지 -> 12번지 순으로 순차적으로 명령어를 실행하고자 했는데

중간에 JUMP 등의 명령어로 PC가 60번지 메모리 주소를 가르키게 되면

11번지 -> 12번지 명령어를 해석하고 인출하는 작업이 헛수고가 되어버린다.

 

✅ 분기 예측

제어 위험을 방지하기 위해서 PC가 어느 번지로 JUMP 할 것인지를 미리 예측하는

분기 예측이라는 기술도 존재한다. 

분기 예측을 수행하는 목적은 명령어 파이프라인이 일시적으로 정지되지 않도록 하기 위함이다.

분기 예측을 수행하는 디지털 회로를 분기 예측기라고 하는데 분기 예측기는

단순한 알고리즘에 따라 다음 명령을 미리 추론하고 미리 실행시킨다.

만약 예측이 맞다면 파이프라인은 낭비 없이 계속 수행되겠지만 

예측이 틀린 경우 미리 실행한 명령어 파이프라인이 모두 취소되고 올바른 명령이 다시 실행된다.

예측에 실패한 경우 실패한 파이프라인 개수 만큼 클럭 주기가 낭비된다.

💻 구조 위험

서로 다른 명령어가 같은 CPU 부품(ALU, 레지스터)를 쓰려고 할 때 발생한다.

메인 메모리에 있는 값을 레지스터로 가져오는 Load 명령어의 경우

데이터를 인출하기 위해 메모리에 접근하는 단계가 있는데

이때 동일한 레지스터에 쓰기 접근을 할 수 있다. 이 경우 해당 레지스터를 사용할 수 있을

때 까지 Stall(지연) 할 수 밖에 없다.

 

📗 슈퍼 스칼라

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

여러개의 파이프라인을 포함하기 때문에 한번에 여러개의 명령어를 인출, 해석, 실행, 저장한다.

 

 

✅ 파이프라인 개수가 증가하면 처리 속도도 증가할까?

이론적으로는 파이프라인 개수에 비례하여 처리 속도가 증가하지만파이프라인 위험도도 증가하기 때문에 파이프라인 개수에 비례하여처리 속도가 증가하진 않는다.

 

📗 비순차적 명령어 처리

파이프라인의 중단을 방지하기 위해 명령어를 순차적으로 처리하지 않는 

명령어 병렬 처리 기법을 말한다.

 

다음과 같은 명령어 파이프라인이 있다고 가정할 때

명령어 3이 끝나기 전 까지는 명령어 4 이후 명령은 실행될 수 없다.

 

하지만 명령어 3을 5 순위로 변경한다면 

결과도 변하지 않고 실행 흐름에도 영향이 없지만

Stall(지연)을 최소화해 파이프라인이 원할하게 동작할 수 있다.

 

 

 

학습 출처: https://www.youtube.com/watch?v=Btsa_U-f26k&list=PLVsNizTWUw7FCS83JhC1vflK8OcLRG0Hl&index=15

728x90
반응형