명령어 병렬 처리 기법
CPU의 시간낭비 없이 메모리에 있는 명령어들을 빠르게 실행할 수 있는 방법
명령어 파이프라인 ★
동시에 여러 개의 명령어를 겹쳐서 실행하는 기법을 말한다.
- 명령어 인출(Instruction Fetch): 메모리로 부터 명령어를 가져옴
- 명렁어 해석(Instruction Decode): 가져온 명령어를 해석하는 과정
- 명렁어 실행(Execute Instruction): 해석된 명령어를 실행
- 결과 저장(Write Back): 해석이 다 된 명령어를 다시 메모리에 저장
각각의 명령어는 단계가 서로 다르다면 CPU는 각 단계를 겹쳐 동시에 실행할 수 있다.
ex) t2에서 명령어1은 실행, 명령어2는 해석, 명령어3은 인출을 실행함
이 모습은 마치 컨베이어 벨트와 같은 모습을 가지고 있다.
이런식으로 사용하지 않는다면 각 명령어가 실행->종료 되고 또 다른 명령어가 실행되는 순차적인 모습을 보여 시간이 오랙 러리게 된다.
명령어 파이프라인이 이상적으로 동작하는 것은 아니다. 때로는 명령어 파이프라인이 성능 향상에 실패하는 경우도 있다.
파이프라인 위험
병렬적으로 명령어가 해석되는 해당 과정이 제대로 되지 않는 경우
- 데이터 위험: 명령어간의 의존성에 의해서 야기된다. 모든 명령어를 동시에 처리할 수는 없고 끝까지 실행해야지만 비로소 실행할 수 있는 경우가 있다.
ex) 명령어 1을 실행해서 업데이트가 된 뒤에 명령어 2를 인출해야 는 상황
명령어1: r1 -> r2 + r3
명령어 2: r4 -> r1 + r5
명령어1이 해석하는 동안에 인출할 수가 없게 된다. 명령어 1이 결정이 되어야만 다음 명령어인 명령어2가 실행할 수 있게 된다.
- 제어 위험: 프로그램 카운터의 갑작스러운 변화로 인해 야기되는 문제. CPU가 실행하는 명령어의 주소 번지가 갑작스럽게 어느 특정 주소로 실행의 흐름을 바꿔야 할 때
순차적으로 명령어를 실행하게 되는데 특정 메모리 주소로 변경을 하게 된다면 다음에 겹쳐서 실행하고 있던 명령어는 헛수고가 되게 된다.
ex) JUMP, CALL 등
이러한 상황을 방지하기 위해 프로그램 카운터가 미리 예측하는 기술: 분기 예측 기술
- 구조적 위험: 서로 다른 명령어가 같은 CPU부품(ALU, 레지스터)를 쓰려고 할 때 발생하는 문제
정리 : 병렬 처리 기법으로 명령어 파이프 라인은 CPU가 더 빠르게 명령어를 실행 할 수 있게 하지 언제나 성능 향상에 기어는 하는 것은 아니다. 데이터 위험, 제어위험, 구조적 위험을 가진 파이프 위험을 발생했을 때 명령어 파이프라인이 제대로 동작하지 않는다.
슈퍼스칼라 ★
CPU 내부에 여러 개의 명령어 파이프라인을 포함한 구조를 말한다.
한 번에 두가지의 명령어를 인출, 해석, 실행, 저장할 수 있다.
여러개의 컨베이어벨트를 가지고 있는 모습과 비슷하다.
CPU구조 설계에서 공부했던 것처럼 각각의 코어가 동시에 수행할 수 있는 명령어의 단위인 하드웨어적인 스레드가 여러개 있는 상태를 멀티 코어 스레드라 했고 멀티 코어 스레드는 한번에 여러개의 명령어를 갖고 와서 실행할 수 있는 CPU 이다. 이처럼 슈퍼스칼라도 한번에 여러개의 명령어를 인출, 해석, 실행, 저장을 겹처서 실행할 수 있는 형태를 말한다.
이론적으로는 파이프라인 개수에 비례하여 처리 속도가 증가하지만 관리해야 하는 파이프라인이 증가하고 파이프라인 위험도 증가로 인해서 파이프라인 개수에 비례하여 처리 속도가 증가하진 않는다.
비순차적 명령어 처리
파이프라인의 중단을 방지하기 위해서 명령어를 순차적으로 처리하지 않는 명령어 병렬 처리 기법이다.
비유하자면 명령어들간의 합법적인 새치기를 말한다.
명령어가 순차적으로 처리한다면 이상적인 명령어 파이프라인의 모습이 나올 수 없게 된다.
ex) 이미지의 모습처럼 3번의 메모리가 이전 실행된 메모리들의 결과값을 필요로 할 경우 파이프라인 위험이 야기되게 된다.
이럴 경우 의존성이 없는 명령어의 순서를 바꿔보게 된다면?
3번 메모리를 맨 마지막 순서로 놓게 된다면 프로그램 전체 결과에는 변함이 이상없이 진행될 수 있는 형태가 된다.
하지만 아무 명령어가 순서를 바꿀 수 없다. 전체 실행 흐름에 대해 영향을 주지 않는, 의존성이 없는 명령어의 순서만 바꿀 수 있게된다.
정리: 명령어 병렬처리 기법인 명령어 파이프라이닝은 명령어들을 단순히 겹쳐서 병렬적으로 실행하는 기법을 말하는데 이안에는 파이프라인 헤저드라는 잠재적인 위험성이 있고 이 해저드를 가지고 있다면 명령어 파이프라인을 해도 성능 향상에 실패를 할 수 있다. 파이프라인 위험의 종류에는 데이터 위험, 제어위험, 구조적 위험의 종류가 있고 이러한 명령어 파이프라인을 여러개 두는 것을 슈퍼스칼라 기법이라고 한다.
또한 명령어를 순차적으로 실행 할 수 있도록 의존성이 없는 명령어의 순서를 변경해서 실행하는 것을 비순차적 명령어 처리 기법이라고 한다.
댓글