혼자 공부하는 컴퓨터 구조 - 강민철 저자 의 내용을 정리한 내용입니다.
: 명령어를 빠르고 효율적으로 처리하기 위해 CPU를 한시도 쉬지 않고 작동시키는 명령어 병렬 처리 기법을 알아봅시다.
빠른 CPU를 만들려면 CPU가 놀지 않고 시간을 알뜰하게 쓰며 작동하게 만드는 것도 중요합니다.
명령어 병렬 처리 기법
명령어를 동시에 처리하여 CPU를 한시도 쉬지 않고 작동시키는 기법
대표적인 명령어 병렬 처리 기법으로 명령어 파이프 라이닝, 슈퍼스칼라, 비순차적 명령어 처리 가 있습니다.
명령어 파이프라인
하나의 명령어가 처리되는 전체 과정을 비슷한 시간 간격으로 나누어 보아야 합니다. 명령어 처리 과정을 클럭 단위로 나누어 보면 일반적으로 다음과 같이 나눌 수 있습니다.
1. 명령어 인출
2. 명령어 해석
3. 명령어 실행
4. 결과 저장
-> 이 단계가 정답은 아님!!
여기서 중요한 점은 같은 단계가 겹치지만 않는다면 CPU는 '각 단계를 동시에 실행할 수 있다'는 것입니다.
예를 들어 CPU는 한 명령어를 '인출'하는 동안에 다른 명령어를 '실행'할 수 잇고, 한 명령어가 '실행'되는 동안에 연산 결과를 '저장'할 수 있습니다. 명령어를 겹쳐서 수행하면 명령어를 하나하나 실행하는 것보다 훨씬 더 효율적으로 처리할 수 있습니다.
- 공장 생산 라인과 같이 명령어들을 명령어 파이프라인에 넣고 동시에 처리하는 기법을 명령어 파이프라이닝이라고 합니다.
- 파이프라이닝이 높은 성능을 가져오기는 하지만, 특정 상황에서는 성능 향상에 실패하는 경우도 있습니다. 이러한 상황을 파이프라인 위험 이라고 부릅니다. 파이프라인 위험에는 크게 1) 데이터 위험, 2) 제어 위험, 3) 구조적 위험이 있습니다.
데이터 위험
명령어 간 '데이터 의존성' 에 의해 발생합니다. 모든 명령어를 동시에 처리할 수는 없습니다.
명령어 1 : R1 <= R2 + R3 // R2 레지스터 값과 R3 레지스터 값을 더한 값을 R1 레지스터에 저장
명령어 2 : R4 <= R1 + R5 // R1 레지스터 값과 R5 레지스터 값을 더한 값을 R4 레지스터에 저장
위의 경우, 명령어 1을 수행해야만 명령어 2를 수행할 수 있습니다. 즉 R1에 R2+R3 결괏값이 저장되어야 명령어 2를 수행할 수 있습니다. 만약 명령어 1 실행이 끝나기 전에 명령어 2를 인출하면 R1에 R2+R3 결괏값이 저장되기 전에 R1 값을 읽어 들이므로 원치 않은 R1 값으로 명령어 2를 수행합니다. 따라서 명령어 2는 명령어 1의 데이터에 의존적입니다. 이처럼 데이터를 의존적인 두 명령어를 무작정 동시에 실행하려고 하면 파이프라인이 제대로 작동하지 않는 것을 '데이터 위험' 이라고 합니다.
제어 위험
주로 분기 등으로 인한 '프로그램 카운터의 갑작스러운 변화' 에 의해 발생합니다. 기본적으로 프로그램 카운터는 '현재 실행 중인 명령어의 다음 주소'로 갱신됩니다. 하지만 프로그램 실행 흐름이 바뀌어 명령어가 실행되면서 프로그램 카운터 값에 갑작스러운 변화가 생긴다면 명령어 파이프라인에 미리 가지고 와서 처리 중이었떤 명령어들은 아무 쓸모가 없어집니다. 이를 위해 사용하는 기술 중 하나가 분기 예측 입니다. 분기 예측은 프로그램이 어디로 분기할 지 미리 예측한 후 그 주소를 인출하는 기술입니다.
구조적 위험
명령어들을 겹쳐 실행하는 과정에서 서로 다른 명령어가 동시에 ALU, 레지스터 등과 같은 CPU 부품을 사용하려고 할 때 발생합니다. 구조적 위험은 자원 위험이라고도 부릅니다.
슈퍼스칼라
- 파이프라이닝은 단일 파이프라인으로도 구현이 가능하지만, 오늘날 대부분의 CPU에서는 여러 개의 파이프라인을 이용합니다. 이처럼 CPU 내부에 여러 개의 명령어 파이프라인을 포함한 구조를 슈퍼 스칼라 라고 합니다.
- 명령어 파이프라인을 하나만 두는 것이 마치 공장 생산 라인을 한 개 두는 것과 같다면, 슈퍼스칼라는 공장 생산 라인을 여러 개 두는 것과 같습니다.
- 슈퍼스칼라 구조로 명령어 처리가 가능한 CPU를 슈퍼스칼라 프로세서 또는 슈퍼스칼라 CPU라고 합니다. 슈퍼스칼라 프로세서는 매 클럭 주기마다 동시에 여러 명령어를 인출할 수도, 실행할 수도 있어야 합니다.
- 이론적으로 파이프라인 개수에 비례하여 프로그램 처리 속도가 빨랍집니다.
- 슈퍼스칼라 방식을 차용한 CPU는 위험을 방지하기 위해 고도로 설계되어야 합니다.
비순차적 명령어 처리
- 보통 OoOE로 줄여 부릅니다. 이 기법은 많은 전공서에서 다루지 않지만, 오늘날 CPU 성능 향상에 크게 기여한 기법이자 대부분의 CPU가 차용하는 기법입니다.
- 이름에서도 알 수 있듯 명령어를 순차적으로 실행하지 않는 기법입니다. 명령어의 '합법적인 새치기'라고 볼 수 있습니다.
파이프라인 위험과 같은 예상치 못한 문제들로 인해 이따금씩 명령어는 곧바로 처리되지 못하기도 합니다. 모든 명령어를 순차적으로만 처리한다면 이런 예상치 못한 상황에서 명령어 파이프라인은 멈춰버리게 됩니다.
비순차적 명령어 처리 기법
앞의 코드를 이루는 명령어들 중에 서로 데이터 의존성이 전혀 없는, 순서를 바꿔 처리해도 수행 결과에 영향을 미치지 않는 명령어들이 있습니다. 명령어를 순차적으로만 실행하지 않고 순서를 바꿔 실행해도 무방한 명령어를 먼저 실행하여 명령어 파이프라인이 멈추는 것을 방지하는 기법을 비순차적 명령어 처리 기법이라고 합니다. 이처럼 비순차적 명령어 처리가 간으한 CPU는 명령어들이 어떤 명령어와 데이터 의존성을 가지고 있는지, 순서를 바꿔 실행할 수 있는 명령어에는 어떤 것들이 있는 지를 판단할 수 있어야 합니다.
마무리
명령어 파이프라이닝은 동시에 여러 개의 명령어를 겹쳐 실행하는 기법입니다.
슈퍼스칼라는 여러 개의 명령어 파이프라인을 두는 기법입니다.
비순차적 명령어 처리 기법은 파이프라인의 중단을 방지하기 위해 멸여어를 순차적으로 처리하느 기법입니다.
'취준' 카테고리의 다른 글
[부스트캠프 웹.모바일] 수료생과 함께하는 부캠라디오 (0) | 2024.05.21 |
---|---|
[컴퓨터 구조] 5-3. CISC와 RISC (0) | 2024.05.02 |
[컴퓨터 구조] 빠른 CPU를 위한 설계 기법 (1) | 2024.05.01 |
[컴퓨터 구조] Chapter 4-1. ALU와 제어장치 (0) | 2024.04.22 |
[컴퓨터 구조] Chapter 3-2 명령어의 구조 (0) | 2024.04.22 |