관리 메뉴

클라이언트/ 서버/ 엔지니어 "게임 개발자"를 향한 매일의 공부일지

CPU 성능 향상 기법 2 - 명령어 병렬 처리 기법 본문

알고리즘 및 자료 관리/컴퓨터 구조 & 운영체제

CPU 성능 향상 기법 2 - 명령어 병렬 처리 기법

huenuri 2024. 10. 15. 17:52

이제 마지막 교시가 40분 정도 남아있을 뿐이지만 그래도 공부할 수 있는 데까지 해볼 것이다. 명령어를 빠르고 효율적으로 처리하기 위해 CPU를 한시도 쉬지 않고 작동시키는 명령어 병렬 처리 기법을 알아본다.

 

 

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

이번 절에서는 명령어를 동시에 처리하여 CPU를 한시도 쉬지 않고 작동시키는 기법인 명령어 병렬 처리 기법을 알아본다. 대표적인 명령어 병렬처리 기법에는 명령어 파이프라이닝, 슈퍼스칼라, 비순차적 명령어 처리가 있다.


 

 

 

명령어 파이프라인

명령어 파이프라인을 이해하려면 하나의 명령어가 처리되는 전체 과정을 비슷한 시간 간격으로 나누어 보아야 한다.

 

 

예를 들어 CPU는 한 명령어를 인출하는 동안에 다른 명령어를 실행할 수 있고, 한 명령어가 실행되는 동안에 연산 결과를 저장할 수 있다. 

 

 

이처럼 마치 공장 생산 라인과 맡이 명령어들을 명령어 파이프라인에 넣고 동시에 처리하는 기법을 명령어 파이프라이닝이라고 한다.

 

 

 

한눈에 봐도 명령어 파이프라이닝을 이용하는 것이 더 효율적임을 알 수 있다.

 

 

 

 

파이프라이닝이 높은 성능을 가져오기는 하지만, 특정 상황에서는 성능 향상에 실패하는 경우도 있다. 이러한 사 ㅇ황을 파이프라인 위험이라고 부른다. 


 

 

데이터 위험

위의 경우 명령어 1을 수행해야만 명령어 2를 수행할 수 있다. 즉, R1에 R2 + R3 결과값이 저장되어야 명령어 2를 저장할 수 있다. 명령어 2는 명령어 1의 데이터에 의존적이다. 이처럼 데이터 의존적인 두 명령어를 무작정 동시에 실행하려고 하면 파이프라인이 제대로 작동하지 않는것을 데이터 위험이라고 한다.


 

 

 

제어 위험

 

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

보통은 순차적으로 실행되는데 특정 메모리 주소로 변경되면 그 다음에 실행되어야 하는 10번지, 11번지 명령어는 실행할 수 없다. 이러한 상황을 방지하기 위해 프로그램 카운터가 어느 위치로 점프할 것인지 미리 예측하는 기술도 있다. 분기 예측은 프로그램이 어디로 분기할지 미리 예측한 후 그 주소를 인출하는 기술이다.


 

 

구조적 위험

명령어들을 겹쳐 실행하는 과정에서 발생한다. 구조적 위험은 자원 위험이라고도 부른다.


 

 

 

 

슈퍼스칼라

파이프라이닝은 단일 파이프라인으로도 구현이 가능하지만, 오늘날 대부분의 CPU에서는 여러 개의 파이프라인을 이용한다.

 

 

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

 

이 때문에 슈퍼스칼라 방식을 차용한 CPU는 파이프라인 위험을 방지하기 위해 고도로 설계되어야 한다. 여러 개의 파이프라인을 사용할 때보다 데이터 위험, 제어 위험, 자원 위험을 피하기가 더욱 까다롭기 때문이다. 


 

 

 

 

비순차적 명령어 처리

비순자척 병렬적 처리(OoOE; Out-of-order execution)는 줄여서 보통 OoOE로 부른다. 이 기법은 많은 전공서에서 다루지 않지만 오늘날 CPU 성능 향상에 크게 기여한 기법이자 대부분의 CPU가 차용하는 기법이기에 꼭 알아두는 것이 좋다.

 

 

 

 

 

하지만 파이프라인 위험과 같은 예상치 못한 문제들로 인해 이따금씩 명령어는 곧바로 처리되지 못하기도 한다. 만약 모든 명령어를 순차적으로만 처리한다면 이런 예상치 못한 상황에서 명령어 파이프라인은 멈춰버리게 된다.

3번 명령어를 실행하기 위해서는 1번과 2번 명령어 실행이 끝날 때까지 기다려야 한다.

 

 

 

 

 

3번은 뒤의 명령어와 순서를 바꾸어 실행해도 크게 문제될 것이 없다. 순차적으로 명령어를 처리할 때보다 더 효율적으로 처리되는 것을 알 수 있다. 이렇게 명령어를 순차적으로 실행하지 않고 순서를 바꿔 실행해도 무방한 명령어를 먼저 실행하여 명령어 파이프라인이 멈추는 것을 방지하는 기법을 비순자적 명령어 처리 기법이라고 한다.

 

 

 

 

 

 

비순차적 명령어 처리가 가능한 CPU는 명령어들이 어떤 명령어와 데이터 의존성을 가지고 있는지, 순서를 바꿔 실행할 수 있는 명령어에는 어떤 것들이 있는지를 판단할 수 있어야 한다.


 

 

 

 

단원 마무리하기

 


 

 

 

학습을 마치고

오늘 오후 수업을 마치기 전에 목표한대로 학습을 마쳤다. 정말 뿌듯하다. 이제 컴퓨터 구조에 대해 어느 정도 이해를 해서 좀 더 빠르게 공부할 수 있게 되었다. 어제까지만 해도 강의를 들어도 무슨 말인지 잘 알아듣기 힘들었는데, 오늘 새벽부터 조금씩 가랑비에 옷 젖듯이 스며들고 이해가 되는 걸 느꼈다.

정말 신기하고 놀라운 일이었다. 이제 난 어떤 재미없는 공부도 그 일이 내게 필요하다는 생각이 들면 몰입하여 공부할 수 있는 능력을 갖게 된 것 같다.