파이프라인이란 하나의 프로세스를 서로 다른 기능을 가진 여러 개의 서브 프로세스(subprocess)로 나누어 각 서브 프로세스가 동시에 서로 다른 데이터를 취급하도록 하는 기법이다. 각 세그먼트(segment)에서 수행된 연산 결과는 다음 세그먼트로 연속적으로 넘어가게 되어 데이터가 마지막 세그먼트를 통과하면 최종적인 연산 결과를 얻게 된다. 이런 식으로 하나의 진행에서 연산을 중복시키는 것은 각 세그먼트마다 레지스터를 두는 것으로 가능하다. 이 레지스터들은 각 세그먼트마다의 연산 결과를 보관함으로써 여러 개의 데이터에 대한 연산의 중간 결과를 보관하는 역할을 한다.
가장 간단한 파이프라인의 구조는 각 세그먼트마다 그에 해당하는 연산을 수행하는 조합 회로를 두며, 그 출력에 레지스터를 연결하는 것이다. 이때 각 레지스터의 출력은 다음 세그먼트의 입력으로 들어간다. 레지스터마다 클럭 펄스 입력이 있는데, 매 클럭 펄스마다 파이프라인 속의 데이터들은 다음 세그먼트의 연산을 수행하고, 그의 레지스터에 중간 결과의 값이 저장된다.
같은 복잡도의 부연산들로 나뉘어지는 어떠한 연산 동작도 파이프라인 프로세서에 의해 구현될 수 있다. 파이프라인 기술은 매번 다른 데이터 집합을 동일한 태스크에 적용시켜 여러 번 반복하는 응용에 효과적이다. 네 세그먼트를 가지는 파이프라인의 일반적인 구조를 생각해보자. 피연산자는 고정된 순서대로 네 세그먼트를 통과하고, 각 세그먼트는 정해진 부연산을 수행하는 조합 회로 Si로 구성되어 있다. 각 세그먼트들은 중간 결과를 저장하는 레지스터 Ri에 의해 서로 분리되며, 이들 레지스터에 적용되는 공통 클럭의 제어에 의해 정보가 다음 세그먼트로 이동한다. 여기서 우리는 파이프라인의 모든 세그먼트를 거쳐서 수행되는 전체 동작을 태스크(task)라고 정의한다.
클럭 사이클이 Tp인 k 개의 세그먼트 파이프라인에서 n 개의 태스크를 수행하는 경우를 생각해보자. 첫 번째 태스크 T1은 동작을 완료하기 위해 k * Tp만큼의 시간이 필요하고, 나머지 (n - 1) 태스크는 한 클럭 사이클에 한 태스크씩 수행되어 (n - 1) * Tp 시간 후에는 모든 태스크가 완료된다. 따라서 k 세그먼트 파이프라인에서 n 태스크를 완료하려면 k + (n - 1) 클럭 사이클이 필요하다.
각 태스크를 완료하기 위해 Tn 시간이 필요하고, 위와 동일한 동작을 수행하는 비파이프라인 장치를 생각해보자. n 태스크에 대한 전체 수행 시간은 n * Tn이다. 따라서, 파이프라인 처리로 인한 속도의 증가율은 다음과 같다.
S = n * Tn / (k + n - 1) * Tp
여기서 태스크 수가 증가하면, k - 1에 비해 n의 값은 무척 커지므로 k + n - 1이 n에 근사하게 된다. 이 경우에 속도 증가율은 다음과 같다.
S = Tn / Tp
파이프라인 회로와 비 파이프라인 회로에서 한 태스크를 수행하는데 걸리는 시간이 같다고 가정하면, Tn = k * Tp, 속도 증가율은 다음과 같이 나타낼 수 있다.
S = k * Tp / Tp = k
즉, 파이프라인에 의한 이론적인 최대 속도 증가율은 파이프라인의 세그먼트 수 k와 같다.
다중 기능 장치를 이용하여 파이프라인 처리에서와 같은 속도 증가를 얻어내기 위해서는 병렬적으로 동작하는 k 개의 동일한 회로를 구성해야 한다. 여기에서 k 세그먼트 파이프라인 프로세서가 그와 동일한 조건에서 동작하는 k 개의 동일한 회로를 구성해야 한다. 여기에서 k 세그먼트 파이프라인 프로세서가 그와 동일한 조건에서 동작하는 k 개의 동등한 비파이프라인 회로와 같은 성능을 보인다는 것을 의미한다. 이 구조에서, 각 회로는 전체 파이프라인 회로와 동일하게 태스크를 수행한다. 그러나 , 순차적으로 입력되는 데이터를 처리하는 것이 아니라, 모든 회로가 동시에 데이터를 입력 받아 네 태스크를 한꺼번에 수행한다. 연산의 속도만 생각한다면 이 회로는 네 세그먼트 파이픠라인과 동일하다. 그러나, 이 회로는 다중 데이터에 동일한 명령이 병렬적으로 적용되기 때문에 SIMD 구조라고 할 수 있다.
실제 파이프라인이 이론적인 최대 속도로 수행되지 못하는 것은 여러가지 이유가 있다. 각 세그먼트들이 부연산을 수행하는 시간이 서로 다르고, 클럭 사이클은 최대 전파 갖는 세그먼트의 지연과 동일하게 결정되어야 한다. 따라서 다른 세그먼트들은 다음 클럭을 기다리는 동안 시간을 낭비하게 된다. 더욱이, 파이프라인 회로와 비파이프라인 회로에서 지연 시간이 언제나 동일하지는 않다. 즉 조합 회로로만 구성되는 단일 장치 회로에서는 세그먼트 사이에서 중간값을 저장하는 레지스터가 필요하지 않다. 그러나 이론적인 최대값은 아닐지라도 파이프라인 기술이 순수하게 순차적으로 동작하는 회로에 비해서 수행 속도가 빠르다는 것은 사실이다.
파이프라인 구조가 적용되는 컴퓨터의 설계는 두 가지 영역으로 나뉘어진다. 산술(arithmetic) 파이프라인에서는 산술 연산들을 부연산으로 나누어 파이프라인의 세그먼트에서 수행되도록 하고, 명령어(instruction) 파이프라인에서는 명령어 사이클의 페치(fetch), 디코드(decode), 실행 단계를 중첩시켜, 명령의 흐름에 대해 동작한다.
Copy from
M. Morris Mano, Computer System Architecture Third Edition, Prentice-Hall, 1992
김종상, 컴퓨터 시스템 구조, 사이텍 미디어, 1994 (번역)
가장 간단한 파이프라인의 구조는 각 세그먼트마다 그에 해당하는 연산을 수행하는 조합 회로를 두며, 그 출력에 레지스터를 연결하는 것이다. 이때 각 레지스터의 출력은 다음 세그먼트의 입력으로 들어간다. 레지스터마다 클럭 펄스 입력이 있는데, 매 클럭 펄스마다 파이프라인 속의 데이터들은 다음 세그먼트의 연산을 수행하고, 그의 레지스터에 중간 결과의 값이 저장된다.
같은 복잡도의 부연산들로 나뉘어지는 어떠한 연산 동작도 파이프라인 프로세서에 의해 구현될 수 있다. 파이프라인 기술은 매번 다른 데이터 집합을 동일한 태스크에 적용시켜 여러 번 반복하는 응용에 효과적이다. 네 세그먼트를 가지는 파이프라인의 일반적인 구조를 생각해보자. 피연산자는 고정된 순서대로 네 세그먼트를 통과하고, 각 세그먼트는 정해진 부연산을 수행하는 조합 회로 Si로 구성되어 있다. 각 세그먼트들은 중간 결과를 저장하는 레지스터 Ri에 의해 서로 분리되며, 이들 레지스터에 적용되는 공통 클럭의 제어에 의해 정보가 다음 세그먼트로 이동한다. 여기서 우리는 파이프라인의 모든 세그먼트를 거쳐서 수행되는 전체 동작을 태스크(task)라고 정의한다.
클럭 사이클이 Tp인 k 개의 세그먼트 파이프라인에서 n 개의 태스크를 수행하는 경우를 생각해보자. 첫 번째 태스크 T1은 동작을 완료하기 위해 k * Tp만큼의 시간이 필요하고, 나머지 (n - 1) 태스크는 한 클럭 사이클에 한 태스크씩 수행되어 (n - 1) * Tp 시간 후에는 모든 태스크가 완료된다. 따라서 k 세그먼트 파이프라인에서 n 태스크를 완료하려면 k + (n - 1) 클럭 사이클이 필요하다.
각 태스크를 완료하기 위해 Tn 시간이 필요하고, 위와 동일한 동작을 수행하는 비파이프라인 장치를 생각해보자. n 태스크에 대한 전체 수행 시간은 n * Tn이다. 따라서, 파이프라인 처리로 인한 속도의 증가율은 다음과 같다.
S = n * Tn / (k + n - 1) * Tp
여기서 태스크 수가 증가하면, k - 1에 비해 n의 값은 무척 커지므로 k + n - 1이 n에 근사하게 된다. 이 경우에 속도 증가율은 다음과 같다.
S = Tn / Tp
파이프라인 회로와 비 파이프라인 회로에서 한 태스크를 수행하는데 걸리는 시간이 같다고 가정하면, Tn = k * Tp, 속도 증가율은 다음과 같이 나타낼 수 있다.
S = k * Tp / Tp = k
즉, 파이프라인에 의한 이론적인 최대 속도 증가율은 파이프라인의 세그먼트 수 k와 같다.
다중 기능 장치를 이용하여 파이프라인 처리에서와 같은 속도 증가를 얻어내기 위해서는 병렬적으로 동작하는 k 개의 동일한 회로를 구성해야 한다. 여기에서 k 세그먼트 파이프라인 프로세서가 그와 동일한 조건에서 동작하는 k 개의 동일한 회로를 구성해야 한다. 여기에서 k 세그먼트 파이프라인 프로세서가 그와 동일한 조건에서 동작하는 k 개의 동등한 비파이프라인 회로와 같은 성능을 보인다는 것을 의미한다. 이 구조에서, 각 회로는 전체 파이프라인 회로와 동일하게 태스크를 수행한다. 그러나 , 순차적으로 입력되는 데이터를 처리하는 것이 아니라, 모든 회로가 동시에 데이터를 입력 받아 네 태스크를 한꺼번에 수행한다. 연산의 속도만 생각한다면 이 회로는 네 세그먼트 파이픠라인과 동일하다. 그러나, 이 회로는 다중 데이터에 동일한 명령이 병렬적으로 적용되기 때문에 SIMD 구조라고 할 수 있다.
실제 파이프라인이 이론적인 최대 속도로 수행되지 못하는 것은 여러가지 이유가 있다. 각 세그먼트들이 부연산을 수행하는 시간이 서로 다르고, 클럭 사이클은 최대 전파 갖는 세그먼트의 지연과 동일하게 결정되어야 한다. 따라서 다른 세그먼트들은 다음 클럭을 기다리는 동안 시간을 낭비하게 된다. 더욱이, 파이프라인 회로와 비파이프라인 회로에서 지연 시간이 언제나 동일하지는 않다. 즉 조합 회로로만 구성되는 단일 장치 회로에서는 세그먼트 사이에서 중간값을 저장하는 레지스터가 필요하지 않다. 그러나 이론적인 최대값은 아닐지라도 파이프라인 기술이 순수하게 순차적으로 동작하는 회로에 비해서 수행 속도가 빠르다는 것은 사실이다.
파이프라인 구조가 적용되는 컴퓨터의 설계는 두 가지 영역으로 나뉘어진다. 산술(arithmetic) 파이프라인에서는 산술 연산들을 부연산으로 나누어 파이프라인의 세그먼트에서 수행되도록 하고, 명령어(instruction) 파이프라인에서는 명령어 사이클의 페치(fetch), 디코드(decode), 실행 단계를 중첩시켜, 명령의 흐름에 대해 동작한다.
Copy from
M. Morris Mano, Computer System Architecture Third Edition, Prentice-Hall, 1992
김종상, 컴퓨터 시스템 구조, 사이텍 미디어, 1994 (번역)