명령어 파이프라인(instruction pipeline)은 명령어를 읽어 순차적으로 실행하는 프로세서에 적용되는 기술로, 한 번에 하나의 명령어만 실행하는 것이 아니라 하나의 명령어가 실행되는 도중에 다른 명령어 실행을 시작하는 식으로 동시에 여러 개의 명령어를 실행하는 기법이다. (출처 : 위키백과)
명령어 파이프라인이란 명령어를 어떻게 동시에 실행할까?

위의 사진처럼 하나의 명령어가 처리되는 과정을 세분화해서 나눈다. 그리고 실행 명령어를 겹쳐서 명령어 인출 단계가 끝난 명령어는 더 이상 IF단계에 해당하는 부품을 사용하지 않으니 다음 명령어가 해당 부품을 사용하는 식으로 cpu사용량을 높이는 기법이다. 위와 같은 방식으로 명령어를 실행하면 Instruction4까지만 봐도 수행 시간은 clock8까지이다. 하지만 파이프라인을 적용하지 않았다면 하나의 명령어가 완전히 끝난 뒤에 명령어가 수행되니 clock20의 수행 속도가 나온다.
하지만, 명령어 파이프라이닝이 모든 상황에서 완벽하게 수행되는 것은 아니다. 이럴 경우 pipeline hazard라고 부른다.
pipeline hazard의 종류에는 3가지가 있다.
- 데이터 헤저드
- 구조 헤저드
- 컨트롤 헤저드
데이터 헤저드
데이터 헤저드란 명령어 간의 데이터 의존성 때문에 발생된다. 만약 명령어 파이프 라인이 생성되어 있는데 다음 명령어가 현재 명령어의 실형 결과를 필요로 하는 상황이면 그만큼 파이프라인이 지연되는 문제가 발생한다. 예를 들어
a = b + c;
d = a + 10; 같은 경우엔 2번째 줄에서 a의 결과를 필요로 하기 때문에 1번째 명령어가 실행이 되어야지 2번째 명령어가 실행된다. 이 방법은 전방전달을 통해 해결하기도 한다. 전방전달이란 명령어가 완전히 끝나기 전에 결과값이 나오면 그 결과값을 일찍 얻어오는 것을 말한다.
구조 헤저드
서로 다른 명령어가 같은 헤드웨어를 사용하려고 할 때 나타나는 해저드이다. MIPS의 경우 명령어들이 처음부터 파이프라이닝을 하기 쉽게 설계되어서 비교적 구조적 해저드를 회피하는 것이 쉽다고 한다.
컨트롤 헤저드
앞의 명령어를 기준으로 명령어의 흐름이 결정되는 것을 의미한다. 예를 들어 jump가 발생하거나 call이 발생하는 경우이다.
이럴 경우 bubble을 넣어 지연시키는 방법과 분기를 예측하는 방법이 있다.(이 방법이 더 많이 사용된다.)
분기 예측이 성공한다면 성능이 향상되고 실패하면 지연이 발생한다.
슈퍼 스칼라

위의 사진처럼 명령어 2개 이상을 겹쳐서 동시에 실행하며 파프라인을 구축하는 방식이다. 슈퍼스칼라를 구축하기 위해서는 명령어를 동시에 실행할 수 있어야 하니 하드웨어 스레드가 2개 이상이어야 한다.
명령어 2개를 동시에 수행하니 이론상 파이프라인의 개수에 비례해서 빨라지지만 실제로는 그렇지 않다.
데이터의존성, 자원의존성, 프로시저의존성이 존재하는 경우 실행서는 안된다.
각각 순서대로 데이터의존성은 하나의 데이터에 여러 명령어가 동시에 접근해서는 안 된다는 것이며 자원의존성은 코어당 한정된 수의 자원에 명령어가 동시에 접근해서는 안된다는 것이다. 마지막으로 프로시저의존성은 분기명령어의 다음명령어는 분기 명령어의 실행이 끝나기 전까지 실행되어서는 안된다는 것이다.
비순차적 명령어 처리
프로그램의 실행 결과에 영향을 미치지 않는 선에서 명령어의 순서를 바꾸어 파이프라인의 중단을 막음으로써 해저드를 회피하는 방식을 의미한다.