CPU[ILP]
ILP
명령어 병렬처리 기법
명령어 병렬 처리 기법은 명령어를 동시에 처리하여 CPU의 효율을 높이는 기법입니다.
대표적인 명령어 병렬처리 기법에는 명령어 파이프, 명령어 라이닝, 슈퍼 스칼라, 비순차적 명령어 처리가 있습니다.
명령어 파이프 라인
명령어 파이프 라인은 명령어를 처리하는 과정을 여러 단계로 나누어 동시에 처리하는 방식입니다.
일반적으로는 명령어 인출, 해석, 실행, 결과 저장 등의 단계로 구성됩니다. 이러한 단계는 시간에 따라 겹치게 되어 순차적으로 실행되는 것보다 빠른 처리를 가능하게 합니다.
그러나 명령어 간의 데이터 의존성, 제어 흐름 변화 등으로 인해 데이터 위험, 제어 위험, 구조적 위험 등의 문제가 발생할 수 있습니다.
- 명령어 인출
- 명령어 해석
- 명령어 실행
- 결과 저장
주의점 꼭 위와 같은 순서가 아닙니다.
위의 단계는 명령어가 처리되는 과정을 클럭단위로 나눈 과정입니다.
여기서 중요한 것은 위의 단계가 겹치지 않으면 순차적으로 실행 시킬 수 있다는 점 입니다.
이를 그림으로 표현하면 아래와 같습니다.
[ 사진 ] 마치 계단식처럼 순차적으로 명령어가 처리되고 있는 과정을 볼 수 있습니다.
이처럼 공장 생산 라인과 같이 명령어들을 명령어 파이프 라인에 넣고 동시에 처리하는 기법을 명령어 파이프 라이닝이라고 합니다.
하지만 이기법에는 단점이 존재합니다. #### 데이터 위험 명령어 간 데이터 의존성에 의해 발생합니다.
예를 들어보겠습니다
1
2
명령어 1 : A1 <- A2 + A3
명령어 2 : A4 <- A1 + A5
위의 명령어 과정을 보면, 명령어2를 수행하기 위해서는 명령어1이 먼저 수행되어야 합니다.
즉, 두번째 명령어는 첫번째 명령어의 데이터에 의존적 입니다.
이처럼 서로 의존적인 두 명령어를 무작정 동시에 실행하려고 하면 파이프라인이 제대로 작동하지 않는 것을 데이터 위험이라고 합니다.
#### 제어 위험 주로 분기 등으로 인한 프로그램 카운터의 갑작스러운 변화에 의해 발생합니다.
기본적으로 프로그램 카운터는 현재 실행 중인 명령어의 다음 주소로 갱신됩니다.
하지만 프로그램 실행 흐름이 바뀌어 명령어가 실행되면서 프로그램 카운터 값에 갑작스러운 변화가 생긴다면 명령어 파이프라인에 미리 가지고 와서 처리중이었던 명령어들은 아무쓸모가 없어집니다.
이를 제어 위험이라고 합니다.
#### 구조적 위험 명령어들을 겹쳐 실행하는 과정에서 서도 다른 명령어가 동시에 ALU, 레지스터 등과 같은 CPU 부품을 사용하려고 할 때 발생하는 위험을 구조적 위험이라고 합니다.
슈퍼 스칼라
슈퍼 스칼라는 CPU 내부에 여러 개의 명령어 파이프 라인을 가지고 있는 구조를 말합니다.
이를 통해 매 클럭 주기마다 동시에 여러 명령어를 인출하고 실행할 수 있습니다.
슈퍼 스칼라 프로세서 또는 CPU는 이러한 구조를 가진 프로세서를 의미합니다.
슈퍼 스칼라 프로세서는 고급 병렬 처리 기능을 제공하여 처리 속도와 성능을 향상시킵니다.
이러한 명령어 병렬처리 기법과 슈퍼 스칼라 프로세서는 현대의 고성능 컴퓨팅 환경에서 널리 사용되는 기술입니다.
### 비순차적 명령어 처리 비순차적 명령어 처리 기법은 파이프라인의 중단을 방지하기 위해 명령어들을 순차적으로 실행하지 않는 기법입니다.
1
2
3
4
5
6
M(10) <- 1
M(11) <- 2
M(12) <- M(10) + (11)
M(32) <- 1
M(33) <- 1
M(45) <- 1
위와 같이 명령어들이 있다고 예를 들어보겠습니다.
M(12)를 실행하기 위해서는 무조껀 M(10)과 M(11)이 실행되어야 M(12)명령어를 실행할 수 잇습니다.
이 말은, M(10),M(11)이 실행되기 전까지는 M(32)번 부터 뒤에 있는 명령어들은 M(10),M(11) 실행이 끝날때까지 기다려야 한다는 점입니다.
하지만 만약에 명령어중에 서로 데이터 의존성이 없는, 순서를 바꿔 처리해도 수행결과에 미치치 않는 명령어들이 있습니다.
M(12)명령어만 봐도, M(10),M(11)명령어만 실행되면 되기 때문에
1
2
3
4
5
6
M(10) <- 1
M(11) <- 2
M(32) <- 1
M(33) <- 1
M(45) <- 1
M(12) <- M(10) + (11)
위와 같이 순서를 변경하여 실행해도 크게 문제가 될건 없다는 말입니다.
이렇게 서로 데이터를 의존하고있지 않는 명령어들, 즉 명령어를 순차적으로만 실행하지 않고 순서를 바꿔 실행해도 무방한 명령어를 먼저 실행하는 기법을 비순차적 명령어 처리 기법이라고 합니다.
단, 무작정 순서를 바꾸기 보다는 서로 데이터 의존성이 없는 명령어들만 순서를 바꿔야 프로그램 실행에 문제가 없습니다.
참고 자료 :: 혼공자 [ 혼자 공부하는 컴퓨터 구조 + 운영체제 ]