[OS] 병렬 처리 기법 정리(feat. 파이프라인, 슈퍼..슈퍼..)

2022. 10. 10. 22:25TIL💡/Algorithms

명령어 처리 방법

컴퓨터에서 실제로 병렬 처리가 어떻게 이루어지는지 살펴보자.

CPU 내에서 명령어는 제어 장치가 처리한다.

제어 장치는 명령어를 가져와 해석한 후 실행하고 결과를 저장하는 과정을 계속 반복한다.

이러한 과정 전체를 하나의 스레드라고 하며 스레드를 이루는 각 단계는 CPU의 클록과 연동되어 한 클록에 하나씩 이루어진다.

 

CPU에서 명령어가 실행되는 과정은 다음과 같이 4단계로 나뉘는데 연구자 또는 책에 따라 더 세분하기도 한다.

CPU는 이러한 단계를 계속 반복하면서 명령어를 처리한다.

 

1. 명령어 패치(Instruction Fetch, IF): 다음에 실행할 명령어를 명령어 레지스터에 저장한다.

2. 명령어 해석(Instruction Decode, ID): 명령어를 해석한다.

3. 실행(Execution, EX): 해석한 결과를 토대로 명령어를 실행한다.

4. 쓰기(Write Back, WB): 실행된 결과를 메모리에 저장한다.

명령어 처리 단계

병렬 처리 기법은 하나의 코어에서 작업을 나누어 병렬로 처리하는 파이프라인 기법과, 여러 개의 코어를 사용하여 동시에 작업을 진행하는 슈퍼 스칼라 기법으로 나뉜다.

이외에도 슈퍼파이프라인 기법, 슈퍼파이프라인 슈퍼스칼라 기법(...?), VLIW 기법 등이 있는데 각 기법의 특징을 자세히 살펴보자.

 

파이프라인 기법

파이프아니 기법은 CPU 사용을 극대화하기 위해 명령을 겹쳐서 실행하는 방법으로, CPU의 사양과 연관지어 보면 하나의 코어에 여러 개의 스레드를 사용하는 것이다.

파이프라인 기법에서는 명령어를 여러 개의 단계로 분할한 후, 각 단계를 동시에 처리하는 하드웨어를 독립적으로 구성한다.

기존 방식에서는 한 명령어를 처리하기 위해 명령어 처리 4단계를 모두 마치고 다음 명령어를 실행하지만, 파이프라인 기법에서는 명령어 처리의 단계마다 독립적으로 구성하여 각 단계가 쉬지 않고 명령어를 처리할 수 있게 한다.

 

위 사진과 같이 명령어 처리를 4단계로 나누면 동시에 처리되는 명령어의 개수가 최대 4개이다.

 

파이프라인 기법에는 여러 가지 문제가 있는데 이를 파이프라인 위험(hazard)이라고 일컫는다.

파이프라인의 위험에는 크게 데이터 위험, 제어 위험, 구조적 위험으로 구분된다.

 

  • 데이터 위험

데이터 위험은 데이터의 의존성 때문에 발생하는 문제이다.

A = C + D

E = A * 2

이 명령어는 데이터 위험의 예로 데이터 A를 필요로 하는 두 번째 명령어는 앞의 명령어가 끝날 때까지 동시에 실행되어서는 안된다.

데이터 위험은 파이프라인의 명령어 단계를 지연하여 해결한다.

 

  • 제어 위험

분기를 하는 if문 혹은 바로가기의 goto 문 같은 명령에서 발생하는 제어 위험은 프로그램 카운터 값을 갑자기 변화시켜 발생하는 위험이다.

보통의 경우 모든 프로그램이 순차적으로 실행된다고 가정하므로 동시에 실행되는 명령어들이 순차적으로 실행된다.

그러나 첫 명령어를 실행하고 보니 goto 문이어서 다음 문장이 아니라 다른 문장으로 이동하게 되면 현재 동시에 처리되고 있는 명령어들이 쓸모 없어진다.

 

제어 위험은 분기 예측이나 분기 지연 방법으로 해결한다.

 

  • 구조 위험

서로 다른 명령어가 같은 자원에 접근하려 할 때 발생하는 문제이다.(data race)

 

 

파이프라인 기법을 인텔 계열의 CPU에서는 하이퍼스레드라고 부른다.

하이퍼스레드는 CPU에 여러 개의 작업을 동시에 진행할 수 있는 부가장치를 만들어 하나의 코어에서도 여러 개의 작업(스레드)이 동시에 이루어지게 하는 기법이다.

 

슈퍼 스칼라 기법

슈퍼 스칼라 기법은 파이프라인을 처리할 수 있는 코어를 여러 개 구성하여 복수의 명령어가 동시에 실행되도록 하는 방식이다.

대부분은 파이프라인 기법과 동일하지만 코어를 2개 구성하여 각 단계에서 동시에 실행되는 명령어가 2개라는 점이 다르다.

이 경우 전체적으로 동시에 실행되는 명령어 개수는 8개이다.

 

 

파이프라인 기법과 마찬가지로 슈퍼스칼라 기법에서는 처리되는 명령어가 상호 의존성 없이 독립적이어야 하며, 이를 위한 처리도 컴파일러에서 이루어지도록 조정해야 한다.

 

오늘날의 CPU는 대부분 슈퍼스칼라 기법을 사용하고 있다.

 

슈퍼파이프라인 기법

슈퍼파이프라인 기법은 파이프라인 기법을 강화한 것이다. 파이프라인 기법에서는 한 클록마다 하나의 명령어를 실행하지만, 슈퍼파이프라인 기법에서는 파이프라인의 각 단계를 세분하여 한 클록 내에서 여러 명령어를 처리할 수 있다. 한 클록 내에 여러 명령어를 실행하면 다음 명령어가 빠른 시간 안에 시작될 수 있어 병렬 처리 능력이 높아진다.

이러한 슈퍼파이프라인 기법은 크레이 슈퍼컴퓨터(cray super computer)의 CPU에서 사용된다.

 

 

슈퍼파이프라인 슈퍼스칼라 기법

슈퍼파이프라인 슈퍼스칼라 기법은 앞의 병렬 처리 기법을 모두 합쳐 놓은 것이다. 슈퍼스칼라 기법이 파이프라인 기법을 여러 개의 코어에서 동시에 수행하는 방식이라면, 슈퍼파이프라인 슈퍼스칼라 기법은 슈퍼파이프라인 기법을 여러 개의 코어에서 동시에 수행하는 방식이다.

 

VLIW 기법

VLIW 기법은 지금까지 설명한 병렬 처리 기법과 완전히 다르다.

앞의 병렬 처리 기법들은 병렬 처리를 지원하는 하드웨어적인 방법이지만, VLIW 기법은 CPU가 병렬 처리를 지원하지 않을 경우 소프트웨어적으로 병렬 처리를 하는 방법이다.

 

VLIW 기법에서는 동시에 수행할 수 있는 명령어들을 컴파일러가 추출하고 하나의 명령어로 압축해서 실행한다.

VLIW 기법은 CPU가 병렬처리를 지원하지 않을 때 사용하는 방법이므로 앞의 병렬 처리 기법들에 비해 동시에 처리하는 명령어의 개수가 적다. 또한 앞의 병렬 처리 기법들은 명령어 실행 시 병렬 처리가 이루어지지만 VLIW 기법은 컴파일 시 병렬 처리가 이루어진다.

 

참고

https://jokerkwu.tistory.com/120

 

[ 기술면접 / 컴퓨터구조] 파이프 라이닝

파이프라이닝이란? 명령어를 순차적으로 실행하는 프로세서에 적용되는 기술로, 한 번에 하나의 명령어만 실행하는 것이 아니라 하나의 명령어가 실행되는 도중에 다른 명령어를 실행을 시작

jokerkwu.tistory.com

http://blog.skby.net/%ED%8C%8C%EC%9D%B4%ED%94%84%EB%9D%BC%EC%9D%B8-pipeline/

 

파이프라인 (Pipeline) > 도리의 디지털라이프

I. 성능 향상위한 병렬처리 기법, 파이프라인 가. 파이프라인의 개념 CPU 처리성능 향상을 위해 Instruction 처리 과정을 여러 단계로 세분화하는 병렬처리 기법 나. 파이프라인의 발전 단계   II. 파

blog.skby.net

 

'TIL💡 > Algorithms' 카테고리의 다른 글

[백준] 19238번: 스타트 택시  (0) 2022.10.11
[백준] 2281번: 데스노트  (0) 2022.10.11
[알고리즘] 정렬 알고리즘 정리  (0) 2022.10.10
[백준] 14891번: 톱니바퀴  (0) 2022.10.10
[백준] 14503번: 로봇 청소기  (0) 2022.10.10