CPU 성능 향상기법
- CPU 성능 향상 기법
- 클럭 속도 증가
- 코어 수 늘리기 (듀얼 코어, 멀티 코어, ...)
- 스레드 수 늘리기 (멀티스레드...)
빠른 CPU를 만들기 위해 위의 조건을 갖추는 것도 중요하지만, CPU가 놀지 않고 시간을 알뜰하게 쓰며 작동하게 만드는 것도 중요하다.
명령어 병렬 처리 기법
- 명령어 병렬 처리기법 (ILP; Instruction-Level Parallelism)
- 명령어를 동시에 처리하여 CPU를 한시도 쉬지 않고 작동시키는 기법
- ex) 명령어 파이프 라이닝, 슈퍼스칼라, 비순차적 명령어 처리
1. 명령어 파이프라인
명령어 파이프라인을 이해하려면 하나의 명령어가 처리되는 전체 과정을 비슷한 시간 간격으로 나누어 보아야 한다. 명령어 처리 과정을 클럭 단위로 나누어보면 일반적으로 다음과 같이 나눌 수 있다.
- 명령어 인출 (Instruction Fetch)
- 명령어 해석 (Instruction Decode)
- 명령어 실행 (Execute Instruction)
- 결과 저장 (Write Back)
참고
이 단계가 정답은 아니다. 전공서에 따라 명령어 인출 -> 명령어 실행
으로 나누기도 하고, 명령어 인출 -> 명령어 해석 -> 명령어 실행 - 메모리 접근 -> 결과 저장
으로 나누기도 한다.
여기서 중요한 점은 같은 단계가 겹치지만 않는다면 CPU는 '각 단계를 동시에 실행할 수 있다'는 것이다. 예를 들어 CPU는 한 명령어를 '인출'하는 동안에 다른 명령어를 '실행'할 수 있고, 한 명령어가 '실행'되는 동안에 연산 결과를 '저장' 할 수 있다.

따라서, CPU는 명령어의 각 단계를 병렬로 동시에 시행하는것이 가능해진다.
그림에서, t1에서는 명령어 1, 2를 동시에 처리하고 t2에서는 명령어 1,2,3을 동시에 처리하고 있다.
- 명령어 파이프라이닝(instruction pipelining)
- 공장 생산 라인과 같이 명령어들을 명령어 파이프라인(instructino pipeline)에 넣고 동시에 처리하는 기법
- 동시에 여러 개의 명령어를 겹쳐 실행하는 기법

- 이는 컨베이어 벨트에서 각 사람이 각자의 작업을 분업하여 동시에 시행하는 모습과 유사하게 생각할 수 있다.
- 명령어의 특정 단계가 겹치지만 않으면, 여러개의 명령어를 동시에 시행할 수 있다.
- 명령어 파이프라이닝을 사용하지 않는다면?
- 모든 명령어가 순차적으로 진행되어야 한다. 따라서 명령어가 끝날 때까지 기다려야 한다.
- 결과적으로 훨씬 오랜 시간이 소요되게 된다.

- 현대 CPU에서는 명령어를 겹쳐서 동시에 실행하는 기법인 명령어 파이프라이닝이 정말 중요한 기술로 자리매김했다.
파이프라인 위험
파이프라이닝이 높은 성능을 가져오지만, 특정 상황에서는 성능 향사에 실패하기도 하는데, 이런 경우를 파이프라인 위험(pipeline hazard)이라고 부른다.
파이프라인 위험에는 크게 데이터 위험, 제어위험, 구조적 위험이 있다.

데이터 위험 (data hazard)
- 명령어 간 데이터 의존성에 의해 발생
- 모든 명령어를 동시에 처리할 수 없다. 이전 명령어를 끝까지 실행해야만 비로소 실행할 수 있는 경우가 있을 수 있다.

위의 경우 명령어1
을 수행해야만 명령어2
를 수행할 수 있다.
만약 명령어1
이 시행되기 전 명령어2
를 인출하면 R1이 R2+R3의 값 이전의 값을 읽어들이므로, 원치 않는 R1값으로 명령어2
를 수행하게 된다.
이와 같은 경우, 명령어2
가 명령어1
에 의존적이라고 한다.
이처럼 데이터 의존적인 두 명령어를 무작정 동시에 실행하려고 하면 파이프라인이 제대로 작동하지 않는데, 이를 데이터 위험 이라고 한다.
제어 위험 (control hazard)
- 분기 등으로 인한 '프로그램 카운터의 갑작스러운 변화'에 의해 발생한다.
- 기본적으로 프로그램 카운터는 현재 실행중인 명령어의 다음 주소로 갱신된다.
- 하지만 프로그램 실행 흐름이 바뀌어 명령어가 실행되면서 프로그램 카운터 값에 갑작스러운 변화가 생긴다면, 명령어 파이프라인에 미리 가지고 와서 처리중이었던 명령어들이 쓸모가 없어지게 된다.

그림에서 10번지 명령어를 실행하던 중, 60번지 명령어의 실행이 필요하게 되었다.
이 경우 10번지 명령어 이후 60번지 명령어가 실행되어야 하기에, 미리 실행되고 있던 11번지, 12 번지명령어는 의미가 없어지게 된다.
이와 같이 프로그램 카운터가 갑작스럽게 변화되는 상황에서 파이프라이닝이 성능 향상에 실패하는 문제를 제어 위험이라고 부른다.
- 분기 예측(branch prediction)
- 이같은 상황을 방지하기 위해 프로그램 카운터가 어디로 점프할 것인지를 미리 예측하는 기술
구조 위험 (structural hazard)
- 서로 다른 명령어가 같은 CPU 부품(ALU, 레지스터)를 사용하려고 할 때 발생
- 자원 위험(resource hazard)이라고도 부른다.
📌 요약
- 명령어 파이프라이닝: 여러 개의 명령어를 겹쳐서 사용
- 명령어 병럴 실행으로 CPU 속도 향상에 기여
- 파이프라인 위험: 파이프라인 성능 향상에 실패하는 경우
- 데이터 위험: 명령어 간 데이터 의존성에 의해 발생
- 제어 위험: 프로그램 카운터의 갑작스러운 변화에 의해 발생
- 구조 위험: 명령어가 동시에 같은 자원을 사용하려 할 때 발생
2. 슈퍼스칼라

- 슈퍼스칼라(superscalar)
- CPU 내부에 여러 개의 명령어 파이프라인을 포함한 구조
- 오늘날 대부분의 cpu에서는 여러 개의 파이프 라인(슈퍼 스칼라)를 포함한 구조를 사용하고 있다.
- 슈퍼스칼라 프로세서, 슈퍼스칼라 CPU
- 슈퍼스칼라 구조로 명령어 처리가 가능한 CPU
- 매 클럭 주기마다 동시에 여러 명령어를 인출, 실행 가능하다.
- 멀티스레드 프로세서는 한 번에 여러 명령어를 인출, 해석, 실행할 수 있기 때문에 슈퍼스칼라 구조를 사용할 수 있다.

명령어 파이프라인을 하나만 두는 것이 마치 공장 생상 라인을 한 개 두는 것과 같다면, 슈퍼스칼라는 공장 생산 라인을 여러개 두는 것과 같다.
한계
- 이론적으로, 슈퍼스칼라 프로세서 처리속도는, 파이프라인 개수와 비례하여 빨라진다.
- 그러나 파이프라인 위험도의 증가에 의해, 실제로는 반드시 파이프라인 개수에 비례하여 빨라지지는 않는다.
- 이 때문에 슈퍼스칼라 방식을 차용한 CPU는 파이프라인 위험을 방지하기 위해 고도로 설계되어야 한다.
- 여러 개의 파이프라인을 이용하면, 하나의 파이프라인을 사용할 때 보다 (데이터 위험, 제어 위험, 자원 위험)을 피하기가 더욱 까다로워지기 때문이다.
3. 비순차적 명령어 처리
해당 기법은 많은 전공서에서 다루지 않지만, 오늘날 CPU 성능 향상에 크게 기여한 기법이자 대부분의 CPU가 차용하는 기법이기에 꼭 알아두는 것이 좋다.

예시 1. 명령어 순차적 진행

M(N)
: 메모리 N번지
M(N) <- M
: 메모리 N번지에 M을 저장하라
- 3번 명령어 실행을 위해서는, 반드시 1번, 2번 명령어가 선행되어야 한다.
- 명령어를 순차적으로 실행하는 CPU는 2번 명령어가 종료될 때까지 3,4,5,6 명령어가 대기해야 한다.
예시 2. 명령어 비순차적 진행

- 의존성이 없는 명령어의 순서가 바뀌었다.
- 3번 명령어를 가장 뒤로 이동시켜도, 전체 결과에는 변화가 없다.
- 이렇게 명령어 순서를 변경하는 경우, 앞의 경우와 달리 명령어를 동시에 실행할 수 있게 된다.
- 이 처럼 명령어를 순차적으로만 실행하지 않고 순서를 바꿔도 무방한 명령어를 먼저 실행하여 명령어 파이프라인이 멈추는 것을 방지하는 기법을 비순차적 명령어 처리 기법 이라고 한다.
명령어의 순서 변경
- 아무 명령어나 순서를 바꿔 수행할 수는 없다.
- 의존성이 없는 명령어만 순서를 변경할 수 있다.
- 순서를 변경해도 전체 프로그램의 실행 결과, 실행 흐름에 영향이 없는 경우에만 순서를 변경할 수 있다.

- 1, 3은 순서를 바꿀 수 없다. (3 수행을 위해
M(100)
이 필요
- 1, 4는 순서를 바꿀 수 없다. (1을 토대로 3을 수행, 3을 토대로 4가 수행)
- 4, 5는 순서를 바꿀 수 있다. (전체 프로그램 실행 흐름에 영향이 없다.)

📌 요약
- 명령어 파이프라이닝
- 명령어 처리 공장 생산라인 병렬처리
- 동시에 여러 개의 명령어를 겹쳐 실행하는 기법
- 순차적 처리에서, 각 직원들이 동시에 작업하도록 변경
- 결과적으로 작업이 꼬이는 위험들이 발생함
- 위험 목록 = 데이터 위험, 제어 위험, 자원 위험
- 슈퍼스칼라 프로세서
- 명령어 처리 공장 생산라인(병렬처리한) 갯수 늘리기
- 비순차적 명령어 처리
- 파이프 라인의 중단을 방지하기 위해, 명령어를 비순차적으로 처리
Reference