빼미의 개발일기

[컴퓨터 구조] - 13강. 명령어 병렬 처리 기법 본문

프로그래밍/컴퓨터 구조

[컴퓨터 구조] - 13강. 명령어 병렬 처리 기법

빼미01 2023. 9. 7. 01:26
이 글은 한빛미디어 '혼자 공부하는 컴퓨터 구조 + 운영체제'를 공부하고 정리한 내용입니다.


빠른 CPU를 위해 높은 클럭속도와 멀티코어, 멀티스레드를 지원하도록 하는게 중요하지만,
CPU를 놀지 않고 시간을 알뜰하게 쓰며 작동하게 만드는 것이 중요!!

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

  1. 명령어 인출 (IF - Instruction Fetch)
  2. 명령어 해석 (ID - Instruction Decode)
  3. 명령어 실행 (EX - Execute Instruction)
  4. 결과 저장 (WB - Write Back)
※ 전공서에 따라 '명령어 인출(IF) → 명령어 실행(EX)' 으로 나누기도 하고, '명령어 인출(IF) → 명령어 해석(ID) → 명령어 실행(EX) → 메모리 접근(MEM) → 결과 저장(WB)' 으로 나누기도 한다.

- 명령어 파이프라인의 중요한 점은 같은 단계가 겹치지만 않는다면 CPU는 각 단계를 동시에 실행 할 수 있다.

명령어 파이프라인 단계 동시 실행

- 이처럼 공장 생산 라인과 같이 명령어들을 명령어 파이프라인 (Instruction Pipeline)에 넣고 동시에 처리하는 기법을 명령어 파이프라이닝(Instruction Pipelining) 이라고 한다.

- 파이프라이닝이 특정 상황에서는 성능 향상에 실패하는 경우가 있는데 이러한 상황을 파이프라인 위험(Pipeline Hazerd)이라 하고, 크게 데이터 위험, 제어 위험, 구조적 위험이 있다.


데이터 위험 (Data Hazards) : 명령어 간 '데이터 의존성'에 의해 발생.

- 모든 명령어를 동시에 처리할 순 없는데, 어떤 명령어는 이전 명령어를 끝까지 실행해야만 실행 할 수 있는 경우도 있다.

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

- 이런 경우 명령어 1 실행이 끝나기 전에 명령어 2를 인출하면 R1의 결과값이 나오기 전에 R1을 읽어들여 원치않은 값으로 명령어 2를 수행하게 된다. 따라서 명령어2는 명령어 1의 데이터에 의존적이다. 이처럼 데이터 의존적인 두 명령어를 무작정 동시에 실행하려고 하면 파이프라인이 제대로 작동하지 않는 것데이터 위험 이다.


제어 위험 (Control Hazards) : 분기 등으로 인한 '프로그램 카운터(PC)의 갑작스러운 변화'에 의해 발생.

- 기본적으로 프로그램 카운터는 '현재 실행 중인 명령어의 다음 주소'로 갱신하는데, 프로그램 실행 흐름이 바뀌어 명령어가 실행되면서 프로그램 카운터 값에 갑작스러운 변화가 생긴다면 명령어 파이프라인에서 미리 가지고 와서 처리중이던 명령어는 쓸모가 없어진다. 이를 제어 위험이라고한다.

제어 위험 설명

- 이런 제어 위험을 막기 위해 프로그램이 어디로 분기할 지 미리 예측하고 그 주소를 인출하는 분기 예측(Branch Prediction)이라는 기술이 있다.


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


슈퍼스칼라(Super Scalar) : CPU 내부에 여러 개의 명령어 파이프라인을 포함한 구조.

슈퍼스칼라

- 슈퍼스칼라 구조로 명령어 처리가 가능한 CPU를 슈퍼스칼라 프로세서 또는 슈퍼스칼라 CPU라고 한다.

가령 멀티스레드 프로세서는 한번에 여러 명령어를 인출하고, 해석, 실행 할 수 있기 때문에 슈퍼스칼라 구조를 사용할 수 있다.

- 이론적으로 파이프라인 개수에 비례하여 프로그램 처리 속도가 빨라지지만, 파이프라인 위험 등의 예상치 못한 문제가 있어 실제로는 반드시 비례하여 빨라지지는 않는다. 여러 개의 파이프라인을 이용하면 단일 파이프라인때 보다 파이프라인 위험을 피하기가 까다로워 진다.

 


● 비순차적 명령어 처리(OoOE : Out-of-Order-Execution) : 명령어들을 순차적으로 실행하지 않는 기법. 합법적 새치기.

- 명령어를 순차적으로만 실행하지 않고 순서를 바꿔 실행해도 무방한 명령어를 먼저 실행하여 명령어 파이프라인이 멈추는 것을 방지하는 기법.

- 다음과 같은 명령어가 있다고 할 때 3번의 명령어는 1,2번의 명령어의 결과가 나와야만 실행할 수 있는 명령어이다.
명령을 순차적으로 진행 한다고 한다면 1,2번이 실행되고 3번이 실행되기까지 명령어 파이프라인에 로스가 발생하기에 비효율적이다.

- 때문에 데이터 의존성이 전혀 없는, 순서가 바뀌어도 수행 결과에 영향을 주지 않는 명령어를 우선적으로 실행하고, 그 후에 처리하는 방식으로 명령어 파이프라인을 효율적으로 사용하는 기법이다.

 

Comments